【问题标题】:Convert PDF (with transparency *and* CMYK) to jpg将 PDF(具有透明度 * 和 * CMYK)转换为 jpg
【发布时间】:2015-05-31 13:13:01
【问题描述】:

我需要从 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 不支持的颜色转换请求 [错误]

事实证明,某些源 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 通道之前尝试展平图层。

标签: php imagick


【解决方案1】:

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

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

【讨论】:

  • 太棒了!有用!我实际上找到了一个解决方法,但我会改变我的实现。我所做的是setFormat('png') 然后获取图像 blob,将图像 blob 加载到新的 Imagick 对象中,然后另存为 jpg。
猜你喜欢
  • 2014-05-24
  • 1970-01-01
  • 2018-06-05
  • 2012-11-17
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
相关资源
最近更新 更多