将PDF(透明度*和* CMYK)转换为jpg

时间:2015-03-27 09:03:23

标签: php imagick

我需要从PDF文件生成jpg图像(仅限第一页)。 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不支持的颜色转换请求[ERROR]

事实证明,某些源PDF实际上使用CMYK,并且在保存为jpg时显然不会转换为RGB。所以我将我的代码更改为以下(添加一行)以显式转换为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");

这样就可以创建一个带有RGB颜色配置文件的jpeg。但是,由于某些不明原因,它会导致图像再次出现黑色背景。换句话说:透明度问题又回来了。为什么Imagick会这样做,更重要的是,透明度问题和CMYK问题的解决方案是什么?

1 个答案:

答案 0 :(得分:5)

要使用的正确函数是transformImageColorspace而不是setImageColorspace。 TransformImageColorspace用于现有图像,setImageColorspace用于新图像,例如svg drawing ..

我已将其添加到手册中,它很快就会显示出来。