将 PDF(具有透明度 * 和 * CMYK)转换为 jpg
Convert PDF (with transparency *and* CMYK) to jpg
我需要从 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");
这按预期工作,因为 t运行sparency 变为白色而不是黑色。但是,我 运行 遇到了一些生成的 jpg 图像的问题,所以我 运行 jpeginfo
处理它们:
$ jpeginfo -c test.jpg
test.jpg 960 x 480 32bit JFIF N 9481 Unsupported color conversion request [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,好的。但是,由于某些不明确的原因,它会再次生成具有 黑色背景 的图像。换句话说:t运行sparency 问题又回来了。为什么 Imagick 这样做,更重要的是,t运行sparency 问题和 CMYK
问题的解决方案是什么?
正确使用的函数是 transformImageColorspace 而不是 setImageColorspace。 TransformImageColorspace 用于现有图像,setImageColorspace 用于新图像,例如svg 绘图..
我已经将其添加到手册中,应该很快就会出现。
我需要从 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");
这按预期工作,因为 t运行sparency 变为白色而不是黑色。但是,我 运行 遇到了一些生成的 jpg 图像的问题,所以我 运行 jpeginfo
处理它们:
$ jpeginfo -c test.jpg
test.jpg 960 x 480 32bit JFIF N 9481 Unsupported color conversion request [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,好的。但是,由于某些不明确的原因,它会再次生成具有 黑色背景 的图像。换句话说:t运行sparency 问题又回来了。为什么 Imagick 这样做,更重要的是,t运行sparency 问题和 CMYK
问题的解决方案是什么?
正确使用的函数是 transformImageColorspace 而不是 setImageColorspace。 TransformImageColorspace 用于现有图像,setImageColorspace 用于新图像,例如svg 绘图..
我已经将其添加到手册中,应该很快就会出现。