将带有透明度和CMYK的PDF转换为jpg。

5
我需要从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 32位 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问题的解决方案是什么?


尝试在删除 Alpha 通道之前压平图层。 - zoonman
1个回答

7
正确的函数是使用transformImageColorspace而不是setImageColorspacetransformImageColorspace用于现有图像,setImageColorspace用于新图像,例如svg绘图。我已将其添加到手册中,很快就会显示出来。

1
太棒了!它起作用了!我实际上找到了一个小技巧,但我将改变我的实现方式。我的做法是setFormat('png')然后获取图像 blob,在新的 Imagick 对象中加载图像 blob,然后保存为 jpg。 - aross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接