Внедрение профиля icc в картинку GD с помощью ImageMagic

Полезные скрипты
Ответить
Аватара пользователя
mihas
Администратор
Сообщения: 1371
Зарегистрирован: 18 авг 2004, 16:58
Откуда: Москва
Контактная информация:

Внедрение профиля icc в картинку GD с помощью ImageMagic

Сообщение mihas »

Была такая история: вначале научил с помощью библиотеки GD для PHP рисовать нужные мне схемы а потом понял, что без внедренного цветового профиля icc выдавать картинку пользователю нехорошо: не бывает RGB без профиля, цветовой профиль все равно любая программа будет использовать, только не факт, что нужный. Даже программы без поддержки CMS и те присвоят изображению профиль монитора. Вобщем, религия мне не позволяет публиковать фотки и любые изображения с претензией на точную цветопредачу без внедренного цветового профиля. (На тему необходимости внедрения цветового профиля я писал здесь и здесь).
И тут я нарвался на то, что GD icc-профиль в изображение внедрять не умеет. Умеет Image Magic или сокращенно Imagic. Пришлось поставить эту библиотеку на сервер тоже и задачу я решил, однако были сложные моменты. Во первых выяснил, что Imagic наотрез отказывается работать с переменной $image, созданной GD. В одном скрипте но вместе с одним имиджем эти библиотеки работать не могут. Пришлось сохранять промежуточный результат GD в файл на сервере и c этим файлом заставлять работать Imagic. Во вторых выяснил, что в файл png не все программы умеют внедрять профиль: операционка MacOS например при создании скриншотов сама внедряет, а вот Фотошоп и Imagic - не могут внедрить icc в png. Сохранил в результате файл с внедренным профилем icc в формате tif (сжатия жпег не хотелось), у меня спектральный калькулятор рассчитан на профессионалов, которые умеют обращаться с форматом tif.
Вот кусок кода - собственно переход от GD к Imagic через сохранение переменной $image в файл. Не забудьте открыть папку img для записи и задать к ней полный путь от корня сайта. Не забудьте положить туда нужный цветовой профиль, в моем примере это sRGB.icc:

Код: Выделить всё

imagepng($image, "/img/image$example.png");
imagedestroy($image);
// end GD

// start imagic
$handle = fopen("/img/image$example.png", "rb");
flock($handle,LOCK_EX);
$img = new Imagick();
$img->readImageFile($handle);
$img->setImageFormat('tiff');
$icc_rgb = file_get_contents('/img/sRGB.icc');
$img -> profileImage('icc', $icc_rgb);
flock($handle,LOCK_UN);
fclose($handle);
$img->writeImage("/img/sRGB_colortable_$example.tif");

$file = "http://rudtp.pp.ru/img/sRGB_colortable_" . $example . ".tif";

header("Content-Type: image/tiff");
header("Content-Disposition: attachment; filename=sRGB_colortable_" . $example . ".tif");
readfile($file);
// end imagic
В аттаче пример картинки tif с внедренным цветовым профилем icc, которую может сам нарисовать на сервере мой спектральный калькулятор.
Вложения
Ответить

Вернуться в «PHP»