Почему 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