Мне нужно сгенерировать jpg-изображения из файлов PDF (только первая страница). Файлы PDF создаются пользователем, поэтому они могут содержать что угодно. В настоящее время я использую следующий код:
// Load PDF. $i = new Imagick; // Create thumbnail of first page of PDF. $i->setResolution(150, 150); $i->loadImage("test.pdf[0]"); $i->thumbnailImage(640, 480, true); // Remove transparency, fill transparent areas with white rather than black. $i->setImageBackgroundColor("white"); $i->setImageAlphaChannel(11); // Imagick::ALPHACHANNEL_REMOVE $i->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN); // Output. $i->writeImage("test.jpg");
Это работает так, как ожидается, что прозрачность становится белой, а не черной. Тем не менее, у меня возникли проблемы с некоторыми созданными jpg-изображениями, поэтому я запускал jpeginfo
на них:
$ jpeginfo -c test.jpg
test.jpg 960 x 480 32bit JFIF N 9481 Неподдерживаемый запрос преобразования цвета [ОШИБКА]
Оказывается, что некоторые исходные PDF-файлы действительно используют CMYK и, по-видимому, не конвертируются в RGB при сохранении как jpg. Поэтому я изменил свой код на следующее (добавив одну строку), чтобы явно преобразовать в RGB:
// Load PDF. $i = new Imagick; // Create thumbnail of first page of PDF. $i->setResolution(150, 150); $i->loadImage("test.pdf[0]"); $i->thumbnailImage(640, 480, true); // Remove transparency, fill transparent areas with white rather than black. $i->setImageBackgroundColor("white"); $i->setImageAlphaChannel(11); // Imagick::ALPHACHANNEL_REMOVE $i->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN); // Convert to RGB to prevent creating a jpg with CMYK colors. $i->setImageColorspace(Imagick::COLORSPACE_RGB); // Output. $i->writeImage("test.jpg");
Это создает jpeg с цветовым профилем RGB
, все в порядке. Однако, по какой-то неясной причине, это приводит к образам с черным фоном . Другими словами: проблема прозрачности вернулась. Почему Imagick делает это, и что более важно, каково решение проблемы прозрачности и проблемы CMYK
?
Правильной функцией для использования является transformImageColorspace, а не setImageColorspace. TransformImageColorspace используется для существующих изображений, setImageColorspace для новых изображений, например, svg drawing ..
Я добавил его в руководство, и он скоро появится.