Почему setImageInterlaceScheme() не делает JPEG прогрессивным?

Я использую php Gmagick для изменения изображений. Следующий код работает как положено, за исключением того, что изображения не являются прогрессивными. Зачем? Согласно документации GraphicsMagick это должно быть. Для справки: входное изображение 666 х 1000.

    $img = new Gmagick();
    $img->setSize(900, 900)
        ->readImageBlob($image->getBytes())
        ->setImageInterlaceScheme(Gmagick::INTERLACE_PLANE)
        ->setImageResolution(96, 96)
        ->setImageFormat('jpeg')
        ->setCompressionQuality(70)
        ->resizeImage(900, 1351, Gmagick::FILTER_UNDEFINED, 1);

Обратите внимание, что

$img->getImageInterlaceScheme() === Gmagick::INTERLACE_PLANE

возвращает значение true после установки.

редактировать

Я пробовал константы INTERLACE_LINE и INTERLACE_PLANE. Ни один из них не оказал влияния на результат.

4 ответа

Решение

Первоначальный автор создал ошибку на php.net ( https://bugs.php.net/bug.php?id=66444), где в конечном итоге был опубликован правильный ответ. Вам нужно использовать недокументированный метод:

->setInterlaceScheme(Gmagick::INTERLACE_LINE)

Вместо:

->setImageInterlaceScheme(Gmagick::INTERLACE_LINE)

Это сработало для меня! Для справки я использую PHP 5.4.20 с gmagick 1.1.7RC2 поверх GraphicsMagick 1.3.18.

Документация, на которую вы указываете:

Используйте Line для создания чересстрочного PNG или GIF или прогрессивного изображения JPEG.

Итак, я думаю, что вы должны установить чередование line,

->setImageInterlaceScheme(Gmagick::INTERLACE_LINE)

Примечание: я не уверен, если INTERLACE_LINE это фактическое значение. Я предположил, что это было основано на вашем коде. В основном, попробуйте line вариант.

Я наконец нашел ответ на этот вопрос (используя PHP IMagick) после нескольких недель борьбы.

Оказывается, вы должны установить формат изображения "pjpeg" вместо просто jpeg.

Я понятия не имею, почему при этом мои изображения правильно распознаются как прогрессивные и постепенно отображаются в браузере.

Я предполагаю, что это будет то же самое для "GMagick"

$im->setImageFormat('pjpeg')

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

$img
    ->setImageInterlaceScheme(Gmagick::INTERLACE_PLANE)
    ->readImageBlob($image->getBytes())
    ->setSize(900, 900) 
    ->setImageResolution(96, 96)
    ->setImageFormat('jpeg')
    ->setCompressionQuality(70)
    ->resizeImage(900, 1351, Gmagick::FILTER_UNDEFINED, 1);

Конечно, interlaceScheme должен быть INTERLACE_PLANE, как вы можете прочитать в документах, которые вы уже знаете http://www.graphicsmagick.org/GraphicsMagick.html

Другие вопросы по тегам