Подтвердить что ты не робот

Как остановить 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:

http://www.flickr.com/photos/fledder/3763538865/in/set-72157621744113979

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

enter image description here

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

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

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

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

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

enter image description here

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

4b9b3361

Ответ 1

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

Imagick sRGB Test

Левая половина изображения была обработана с помощью изображения 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 Comparison

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


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;

Ответ 2

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

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

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

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

Ответ 3

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

Я использую онлайн-инструмент для продажи фотографий, который преобразует все мои изображения с помощью 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#

Ответ 4

Я нашел этот script:

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

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