使用PHP和Imagick

问题描述

我正在尝试使用Imagick和PHP将PDF文档的首页转换为JPEG。只要PDF的色彩空间是SRGB,转换就会成功,并且生成的图像具有正确的颜色。但是,如果PDF具有CMYK色彩空间,则在转换后,图像的颜色会变暗(变亮或变暗)。

我当前正在使用以下软件:

  • PHP 7.4.3
  • ImageMagick 6.9.10-23 Q16 x86_64 20190101(deb软件包)
  • Ghostscript 9.50(2019-10-15)

我正在Windows 10上使用WSL2。

我的测试PDF可以找到here

由于我对最终的转换不满意,因此我首先尝试查看是否有可能使用Imagick cli进行成功的转换。经过大量的反复试验,我发现以下命令产生了最佳结果:

convert -density 300 -colorspace srgb input.pdf[0] -layers flatten -strip output.jpg

结果:

enter image description here

然后我将命令重写为PHP:

$input = 'input.pdf';
$output = 'output.pdf';
$image = new Imagick();
$image->setResolution(300,300);
$image->readImage("{$input}[0]");
$image->transformImageColorspace(Imagick::COLORSPACE_SRGB);
$image = $image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
$image->setImageFormat('jpeg');
$image->stripImage();
$image->writeImage($output);
$image->destroy();

结果:

enter image description here

PHP代码的结果与CLI版本和原始PDF的结果不同。结果与我将在以下CLI命令中运行te的结果相同:

convert -density 300 input.pdf[0] -colorspace srgb -layers flatten -strip output.jpg

该命令看起来几乎相同,但是色彩空间的转换稍后发生。

我的问题是:我想在PHP代码中错过哪一步才能达到与命令相同的结果

convert -density 300 -colorspace srgb input.pdf[0] -layers flatten -strip output.jpg

其他信息: 我还尝试使用颜色配置文件进行颜色空间转换。代替

$image->transformImageColorspace(Imagick::COLORSPACE_SRGB);

我用过

$cmyk = file_get_contents('USWebCoatedSWOP.icc');
$rgb = file_get_contents('sRGB_v4_ICC_preference.icc');
$image->profileImage('icc',$cmyk);
$image->profileImage('icc',$rgb);

除了这两个配置文件外,我还尝试了其他CMYK(CoatedFOGRA39,JapanColor2001Coated ...)和SRGB(AdobeRGB1998,AppleRGB,sRGB_v4_ICC_preference_displayclass ...)配置文件的组合。

但是,我找不到与CLI输出和原始PDF文件接近的配置文件组合。

解决方法

由于@ fmw42,我得以解决我的问题。要解决此问题,请在阅读pdf之前使用setColorSpace()设置颜色空间。

$input = 'input.pdf';
$output = 'output.pdf';

$image = new Imagick();

$image->setResolution(300,300);
$image->setColorSpace(Imagick::COLORSPACE_SRGB); // Add this line

$image->readImage("{$input}[0]");

// $image->transformImageColorspace(Imagick::COLORSPACE_SRGB); // You don't need this line
$image = $image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);

$image->setImageFormat('jpeg');
$image->stripImage();
$image->writeImage($output);

$image->destroy();

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...