У меня есть веб-страница, на которой много pdf-документов, представляющих собой 1-страничные изображения в CMYK. Мне нужно преобразовать их в png/jpg, чтобы отобразить на веб-странице. Я пытаюсь использовать родной PHP Imagick, но наткнулся на странную проблему. Код, выполняющий преобразование, выглядит следующим образом:
$im = new Imagick();
$im->setResolution(200, 200);
$im->readimage($file->getAbsolutePath());
$im->setImageFormat('png');
$im->transformImageColorspace(Imagick::COLORSPACE_SRGB);
$im->writeImage($file->getAbsolutePath() . '.png');
Теперь в моей локальной установке все работает нормально, файл PNG выглядит как документ PDF. Но на своем сервере я заметил, что иногда цвета совершенно неточны.
Вот пример:
Локальный результат преобразования
Результат преобразования сервера
Единственная разница, которую я заметил, заключается в версиях Imagick, о которых сообщает phpinfo:
Локально: PHP 5.5.9 Imagick: 6.7.7-10 06.03.2014 Q16
Сервер: PHP 5.4.42 Imagick: 6.8.9-7 Q16 x86_64 21 марта 2015 г.
Кто-нибудь знает, как заставить сервер использовать правильное цветовое пространство для преобразования pdf в png?
[ИЗМЕНИТЬ / ОБНОВИТЬ]
Как предложил @fab-sa, я попытался использовать профили icc, теперь код выглядит так:
$icc_cmyk = file_get_contents(dirname(__FILE__).'/USWebUncoated.icc');
$icc_rgb = file_get_contents(dirname(__FILE__).'/sRGB_v4_ICC_preference.icc');
$im->setResolution(200,200);
$im->readimage($file->getAbsolutePath());
$im->setImageFormat('png');
$im->profileImage('icc', $icc_cmyk);
$im->profileImage('icc', $icc_rgb);
$im->transformImageColorspace(Imagick::COLORSPACE_SRGB);
$im->writeImage($file->getAbsolutePath().'.png');
И профили icc:
https://github.com/vivid-planet/library/blob/master/icc/sRGB_v4_ICC_preference.icc
Однако до сих пор нет ожидаемого результата.