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