PDF缩略图始终使用Imagick生成为灰度

时间:2016-01-27 00:25:39

标签: php ghostscript imagick cmyk

我被困住了,真的可以在这个上使用一些帮助。我正在使用PHP和Imagick生成一个效果很好的缩略图。但是,我注意到CMYK PDF总是以灰度生成。所以我通过获取CMYK PDF并使用Adobe Acrobat Pro手动将其转换为RGB来测试这一点。然后我通过以下代码重新运行它,它产生了一个彩色图像。我知道

$image->transformImageColorSpace(1);
or
$image->setImageColorSpace(1);

然而,这不起作用。 将pdf转换为彩色PNG图像的正确方法是什么?我看过以下链接没有运气:

http://php.net/manual/en/imagick.setimagecolorspace.php

Convert PDF to JPEG with PHP and ImageMagick

对此的任何帮助都会很棒。

以下是代码:

$filePath = fileSaveUserUpload("path/to/file", ""); //path changed here...
    $_SESSION['FILEPATH'] = $filePath;

    //-------------first makes a thumbnail of first page in image/pdf
    $extension_pos = strrpos($filePath, '.');                        // find position (number) of the last dot, so where the extension starts

    $image = new Imagick();
    $image->readImage($filePath."[0]");                              //reads an image at a path(first page only in this case)
    $image->transformImageColorSpace(1);                             //convert to RGB
    $image->setbackgroundcolor('white');                             //replace transparency with this color
    $image->setCompression(Imagick::COMPRESSION_LOSSLESSJPEG);
    $image->setCompressionQuality(150);
    $image->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);      //remove transparency
    $image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);          //make everything that was transparent white
    $image->thumbnailImage(0,250);                                   //max height 300 but try and preserve aspect ratio (wdithxheight)
    $thumbnail = substr($filePath, 0, $extension_pos) . '_thumb.png';// . substr($filePath, $extension_pos);

    $image->writeImage($thumbnail);
    $image->clear();
    $image->destroy();

更新

我正在使用以下imagick版本:

ImageMagick 6.9.1-2 Q16 x86 2015-04-14

3.3.0RC2

GhostScript版本: 9.18

这是原始PDF(在此处更改为图片):

enter image description here

以下是它制作的缩略图:

enter image description here

这仅适用于CMYK PDF。如果我使用相同的PDF并通过adobe acrobat将其转换为RGB,它就会出现颜色。我对此进行了测试,但仍然适用。

3 个答案:

答案 0 :(得分:1)

从2019年开始打招呼。此问题仍然存在于gs 9.26上(9.27在 all 上不起作用)

设置颜色空间,然后再加载文件,然后进行转换。

// setup imagick for colour
$Img = new Imagick();
$Img->SetResolution(200,200);
$Img->SetColorspace(Imagick::COLORSPACE_SRGB);

// now read pdf first page.
$Img->ReadImage("{$File}[0]");
$Img->TransformImageColorSpace(Imagick::COLORSPACE_SRGB);

// the rest of your stuff.

答案 1 :(得分:0)

您可以尝试更改:

$image->transformImageColorSpace(1);

$image->transformImageColorSpace(Imagick::COLORSPACE_RGB);

我不确定你要对1做什么,但是根据PHP.net,有预定义的颜色空间可以添加到transformImageColorSpace();以获得图像输出使用正确的色彩空间。

答案 2 :(得分:0)

您看到的问题很可能是GhostScript的旧版本没有正确进行转换。下面是在安装了GhostScript版本8.70的系统上调用代码时生成的图像:

a pwetty twee

顺便说一句,你几乎肯定想要使用SRGB色彩空间,而不是普通的旧RGB。 SRGB是用于在计算机屏幕上显示图像的正确选项。

$image->transformImageColorSpace(\Imagick::COLORSPACE_SRGB);

这是一个命令行来测试ghostscript本身进行转换:

./gs-916-linux_x86_64 \
  -q -dQUIET -dSAFER -dBATCH \
  -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 \
  -dAlignToPixels=0 -dGridFitTT=1 -sDEVICE=pngalpha \
  -dFirstPage=1 -dLastPage=3 \
  -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -r72 \
  -sOutputFile=gs-%d.png tree-blackandwhite.pdf

它应该将图像转换为PNG。您可能需要仅使用./gs-916-linux_x86_64替换gs