2012-06-22 3 views
2

Часть моего приложения включает в себя интенсивное использование обработки изображений с помощью таких функций, как обрезка, изменение размера, фильтры, яркость и т.д.PHP GD & Imagick - Есть ли способ измерить ход манипулирования изображениями?

Есть в любом случае для измерения прогресса GD и/или ImageMajick в то время как манипуляции изображения происходит? Я хотел бы быть в состоянии вынести на стороне клиента прогресс бар следующим образом: -

  1. Подробная информация о манипуляции собирается на стороне клиента и размещен на сервере
  2. На POST procress бар оказывается на стороне клиента, начиная с 0%.
  3. сервер запускает GD или Imagick и обрабатывает изображение, в течение которого он возвращает данные о текущем обновлении клиента.
  4. Промежуточная ширина полосы выполнения изменена с помощью javascript, чтобы отразить возвращенные данные о ходе выполнения.
  5. В конце концов, когда процесс обработки изображений завершен, новое имя файла отправляется обратно клиенту, а src тега обновляется.
  6. Событие onload обнаружено на изображении и, наконец, после его рендеринга индикатор выполнения достигает 100%, и изображение отображается пользователю.

Если нет возможности получить данные о ходе работы от GD или Imagick, может ли кто-нибудь предложить способ «подделать»?

Я рассмотрел рендеринг пустого индикатора выполнения перед POST, оживив его до 70% после того, как произошла манипуляция, и клиент получает обратно ответ ajax. Затем, наконец, оживление до 100%, как только новое изображение будет полностью загружено, обнаружив событие onload.

Если это мой единственный вариант, то пусть будет так. Но мне это кажется «неуклюжим».

Любые идеи?

EDIT - Я только что видел, что версия для командной строки ImageMajick имеет опцию «-monitor», который возвращает прогресс, так что я могу быть в состоянии выбить что-нибудь опросом это каждые 50мс или около того. Есть ли что-то подобное для GD, однако, поскольку мы используем GD/Imagick в зависимости от требуемых манипуляций.

ответ

1

Вы правы, в случае использования ImageMagick с Exec вы можете добавить -monitor опцию, запустите команду в фоновом режиме и направить вывод в файл

convert opts -monitor > /path/to/progress.txt 2>/path/to/progress.txt & 

, а затем прочитать файл периодически.

Также вы можете использовать обертку exesnion и установить функцию обратного вызова с помощью Imagick::setProgressMonitor. Сочетание с событиями, отправленными сервером HTML5, будет приятным.

header('Content-Type: text/event-stream'); 
header('Cache-Control: no-cache'); 

$callback = function($offset, $span){ 

    echo "data: ".(100 * $offset)/$span."\n\n"; 
    flush(); 
    return true; 
} 

$imagick->setProgressMonitor($callback); 
$imagick->waveImage(2, 15); 
1

Возможно, вы можете использовать коллекцию слушателей и событий для определения прогресса источника, а затем уведомлять клиента.

Вы можете использовать React или чистое событие lib, чтобы сделать этот прогресс асинхронным.

Смежные вопросы