Как остановить GD2 от вымывания цветов при изменении размера изображений?

Я разработал сайт для обмена фотографиями с помощью CodeIgniter 1.7. Фотографии, которые загружаются членами, автоматически изменяются в нескольких форматах, для которых я использую класс CodeIgniter Image Manipulation. Этот класс встроен в структуру и, в основном, обертка вокруг нескольких библиотек обработки изображений, таких как GD, GD2, ImageMagick и NETPBM. На моем хосте я могу использовать GD2, так вот где этот вопрос будет.

На мою проблему. Вот пример измененной фотографии на моем сайте. Обратите внимание, что оригинал был очень большой, шириной более 3000 пикселей:

http://www.jungledragon.com/image/195/female_impala_close-up.html

Теперь посмотрим на то же изображение, также изменив размер, немного больше на Flickr:

Female impala closeup

См. Драматическую разницу? Я пытаюсь преодолеть этот огромный разрыв. Первое, что я сделал, это применить фильтр резкости к изображениям. Вы можете увидеть результат здесь:

введите описание изображения здесь

Хотя он все еще не идеален, он, по крайней мере, приближается к уровню резкости изображения Flickr. Оставшаяся проблема заключается в том, что цвета смываются, как если бы их насыщение уменьшалось. Это происходит раньше, чем фильтр заточки, поэтому он должен находиться в GD2.

Эта проблема для меня жизненно важна, но я не знаю, где искать. Я нашел некоторые потоки .NET, говорящие о выборочной выборке цветности, но я не знаю, что делать с этой информацией в моей настройке. Я ищу любое решение, которое работает в рамках ограничений моей настройки.

Обновление: Настоящим исходным файлом, точно так же, как я загрузил его как на свой сайт, так и на Flickr:

http://www.jungledragon.com/img/DSC07275.jpg

Обновление 2 : Я в шоке. В хорошем смысле. Мне потребовалось много боли, чтобы установить ImageMagick, но после перехода на него (что было связано с установкой «imagemagick» в качестве библиотеки для использования в классе манипуляции с кодом Igniter, результатом тестового изображения является следующее:

введите описание изображения здесь

Изменение размера ImageMagick делает это точно так, как предполагалось. Цвета сохраняются, и резкость там. Да, я отключил свою обычную процедуру заточки, поскольку она больше не нужна из-за ImageMagick. Кроме того, процесс намного быстрее и меньше голода. И здесь идет еще одна большая часть: я не могу это объяснить, но я абсолютно ничего не сказал, чтобы показать ImageMagick конкретный цветовой профиль, который был предложен пользователем @Alix. В моем тестировании до сих пор похоже, что цветовая информация соблюдается с встроенным профилем или без него. Выходной результат – это меньшая версия ввода. Является ли ImageMagick действительно умным или мне снится?

Мне удалось продолжить тестирование с помощью Imagick:

Тест Imagick sRGB

sRGB_IEC61966-2-1_no_black_scaling.icc половину изображения обрабатывали с помощью изображения Imagick и sRGB_IEC61966-2-1_no_black_scaling.icc , правая половина не имеет ассоциированного профиля цвета и точно показывает то же самое, если обрабатывается с помощью Imagick или GD; вот код, который я использовал:

 header('Content-type: image/jpeg'); $image = new Imagick('/path/to/DSC07275.jpg'); if (($srgb = file_get_contents('http://www.color.org/sRGB_IEC61966-2-1_no_black_scaling.icc')) !== false) { $image->profileImage('icc', $srgb); $image->setImageColorSpace(Imagick::COLORSPACE_SRGB); } $image->thumbnailImage(1024, 0); echo $image; 

Ниже приведено сравнение нескольких профилей sRGB, доступных на веб-сайте color.org:

Сравнение sRGB

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


EDIT : По-видимому, Imagick поставляется со связанным профилем sRGB, поэтому вам не нужно загружать его с веб-сайта Consortium Image Color Consortium, следующий код должен обрабатывать все сценарии:

 header('Content-type: image/jpeg'); $image = new Imagick('/path/to/DSC07275.jpg'); $version = $image->getVersion(); $profile = 'http://www.color.org/sRGB_IEC61966-2-1_no_black_scaling.icc'; if ((is_array($version) === true) && (array_key_exists('versionString', $version) === true)) { $version = preg_replace('~ImageMagick ([^-]*).*~', '$1', $version['versionString']); if (is_file(sprintf('/usr/share/ImageMagick-%s/config/sRGB.icm', $version)) === true) { $profile = sprintf('/usr/share/ImageMagick-%s/config/sRGB.icm', $version); } } if (($srgb = file_get_contents($profile)) !== false) { $image->profileImage('icc', $srgb); $image->setImageColorSpace(Imagick::COLORSPACE_SRGB); } $image->thumbnailImage(1024, 0); echo $image; 

В вашем исходном изображении включен профиль ICC Adobe RGB (1998) . Я думаю, что GD, не зная о профилях, неправильно интерпретирует данные изображения. Вот связанная ошибка PHP, подтверждающая это.

Вам нужно будет подготовить изображение с правильным профилем, скорее всего sRGB. Если у вас есть приложение, которое может это сделать, попробуйте преобразовать его в sRGB и повторно загрузить.

Если вам нужно постоянное серверное решение проблемы, я думаю, вам понадобится библиотека обработки изображений, которая может обрабатывать профили. Честно говоря, я не знаю, как ImageMagick занимается этими вещами, но по крайней мере он знаком с базовой концепцией цветовых профилей.

Связанные: Сравнение sRGB и Adobe RGB

У меня есть небольшая информация, чтобы внести свой вклад в эту тему. Я – фотограф, а не веб-разработчик, поэтому мои технические знания невелики, однако я занимаюсь этой проблемой, поэтому надеюсь, что этот пост поможет кому-то еще в этом направлении.

Я использую онлайн-инструмент для продажи фотографий, который преобразует все мои изображения с помощью GD. У меня возникали проблемы с образами, выглядящими напуганными даже при загрузке с надлежащим преобразованием sRGB и профилированием ICC при просмотре на моем широкоэкранном мониторе.

Я обнаружил, что проблема заключается в том, что GD удаляет все метаданные и профили ICC из исходных файлов. Тогда браузеры, не видя профиля, не отображают их правильно. Он невелик на стандартном мониторе, но очень очевиден в широком диапазоне.

Если у вас возникли проблемы с этим, вы можете проверить мою теорию, используя Firefox и изменив настройку примерно в: config. Измените значение «gfx.color_management.mode» с значения по умолчанию «2» на «1». Этот параметр заставит Firefox принять любое изображение без профиля ICC sRGB и отобразит его как таковое. Затем изображения должны появляться так, как вы ожидали бы, и идентичны Photoshop / Lightroom / etc. Почему все браузеры не используют этот подход здравого смысла, поскольку их значение по умолчанию находится вне меня.

К сожалению, моя корзина настроена только для использования PHP GD, поэтому я не могу получить хорошие результаты в это время. Я бы очень хотел, чтобы GD обновился, чтобы оставить профили ICC прикрепленными или иметь возможность добавления простого sRGB-профиля при экспорте.

Подробнее здесь: http://www.gballard.net/psd/go_live_page_profile/embeddedJPEGprofiles.html#

Я нашел этот скрипт:

https://github.com/slavicv/jpeg-icc/blob/master/class.jpeg_icc.php

Этот скрипт копирует цветовой профиль из исходного изображения в новое изображение. Поэтому после изменения размера вы можете добавить цветовой профиль из исходного изображения. Этот скрипт не нуждается в Imagick, чтобы сделать трюк.