使用 PHP ImageMagick 拼合透明 PDF 生成负片
Flattening A Transparent PDF With PHP ImageMagick Produces Negative
正如标题所说,我正在尝试拼合一个透明的 PDF 并将其另存为 jpg。然而,我一直得到负面形象。我知道我可以在压平它之后做一个负片图像,但我更感兴趣的是为什么会这样。下面是我的代码。在此先感谢您提供的任何启发。
$imagick->readImage($imageFile);
$imagick->setImageBackgroundColor('#FFFFFF');
$imagick->setImage($imagick->mergeImageLayers(imagick::LAYERMETHOD_FLATTEN));
$imagick->setImageFormat("jpg");
$imagick->setImageCompression(imagick::COMPRESSION_JPEG);
$imagick->setImageCompressionQuality(100);
$imagick->writeImage($saveImageAs);
编辑
Link to file
请注意,Imagemagick 使用 Ghostscript 来读取 PDF。如果 PDF 是 CMYKA,则 Ghostscript 无法正确处理。因此,首先通过在 读取 PDF 之前添加等效的 -colorspace sRGB 来转换为 RGBA。如果这不起作用,那么 post 一个 link 到你的一个 PDF 文件,它的行为与你描述的一样。参见 http://us3.php.net/manual/en/imagick.setcolorspace.php
我不太了解 Imagick,所以我可能没有下面的颜色空间语法。如果需要,请更正我的命令。
所以尝试这样的事情:
$imagick->setColorspace(imagick::COLORSPACE_SRGB);
$imagick->readImage($imageFile);
$imagick->setImageBackgroundColor('#FFFFFF');
$imagick->setImage($imagick->mergeImageLayers(imagick::LAYERMETHOD_FLATTEN));
$imagick->setImageFormat("jpg");
$imagick->setImageCompression(imagick::COMPRESSION_JPEG);
$imagick->setImageCompressionQuality(100);
$imagick->writeImage($saveImageAs);
我假设您已经使用 $imagick = new Imagick(); 初始化了 $imagick已经。如果没有,那么您需要这样做。
这是我使用 Imagemagick 6.9.10.25 Q16 使用您的图片得到的 Mac OSX Sierra。
直接 CMYK 光栅化(背景 alpha 丢失,背景变为白色):
convert 5_5x4_25-Grid.pdf -background skyblue -flatten result1.jpg
在光栅化之前从 CMYK 转换为 sRGB。
convert -colorspace sRGB 5_5x4_25-Grid.pdf -background skyblue -flatten result2.jpg
在光栅化之前从 CMYK 转换为 sRGB,然后使用 -colorspace(颜色略有偏差)转换回 CMYK。
convert -colorspace sRGB 5_5x4_25-Grid.pdf -background skyblue -flatten -colorspace CMYK result3.jpg
在光栅化之前从 CMYK 转换为 sRGB,然后使用 -profile(更好地表示颜色)转换回 CMYK:
convert -colorspace sRGB 5_5x4_25-Grid.pdf -background skyblue -flatten -profile /Users/fred/images/profiles/USWebCoatedSWOP.icc result4.jpg
请注意,使用 Ghostscript 的 Imagemagick 不显示 CMYK PDF 的 Alpha 通道。
Image: 5_5x4_25-Grid.pdf
Format: PDF (Portable Document Format)
Mime type: application/pdf
Class: DirectClass
Geometry: 414x324+0+0
Resolution: 72x72
Print size: 5.75x4.5
Units: Undefined
Colorspace: CMYK
Type: ColorSeparation
Endianess: Undefined
Depth: 16/8-bit
Channel depth:
cyan: 8-bit
magenta: 8-bit
yellow: 8-bit
black: 8-bit
Channel statistics:
Pixels: 134136
Cyan:
min: 0 (0)
max: 34695 (0.529412)
mean: 2051.88 (0.0313097)
standard deviation: 6698 (0.102205)
kurtosis: 14.5033
skewness: 3.89729
entropy: 0.258857
Magenta:
min: 0 (0)
max: 54998 (0.839216)
mean: 5682.95 (0.0867162)
standard deviation: 13648.7 (0.208265)
kurtosis: 2.95123
skewness: 2.13618
entropy: 0.258857
Yellow:
min: 0 (0)
max: 55255 (0.843137)
mean: 5710.18 (0.0871318)
standard deviation: 13735.4 (0.209589)
kurtosis: 3.0097
skewness: 2.14687
entropy: 0.258857
Black:
min: 0 (0)
max: 42405 (0.647059)
mean: 1985.17 (0.0302918)
standard deviation: 8063.54 (0.123042)
kurtosis: 16.6119
skewness: 4.23784
entropy: 0.258857
问题出在我使用的 ghostscript 版本上。升级到 ghostscript 9.22 解决了这个问题。
正如标题所说,我正在尝试拼合一个透明的 PDF 并将其另存为 jpg。然而,我一直得到负面形象。我知道我可以在压平它之后做一个负片图像,但我更感兴趣的是为什么会这样。下面是我的代码。在此先感谢您提供的任何启发。
$imagick->readImage($imageFile);
$imagick->setImageBackgroundColor('#FFFFFF');
$imagick->setImage($imagick->mergeImageLayers(imagick::LAYERMETHOD_FLATTEN));
$imagick->setImageFormat("jpg");
$imagick->setImageCompression(imagick::COMPRESSION_JPEG);
$imagick->setImageCompressionQuality(100);
$imagick->writeImage($saveImageAs);
编辑 Link to file
请注意,Imagemagick 使用 Ghostscript 来读取 PDF。如果 PDF 是 CMYKA,则 Ghostscript 无法正确处理。因此,首先通过在 读取 PDF 之前添加等效的 -colorspace sRGB 来转换为 RGBA。如果这不起作用,那么 post 一个 link 到你的一个 PDF 文件,它的行为与你描述的一样。参见 http://us3.php.net/manual/en/imagick.setcolorspace.php
我不太了解 Imagick,所以我可能没有下面的颜色空间语法。如果需要,请更正我的命令。
所以尝试这样的事情:
$imagick->setColorspace(imagick::COLORSPACE_SRGB);
$imagick->readImage($imageFile);
$imagick->setImageBackgroundColor('#FFFFFF');
$imagick->setImage($imagick->mergeImageLayers(imagick::LAYERMETHOD_FLATTEN));
$imagick->setImageFormat("jpg");
$imagick->setImageCompression(imagick::COMPRESSION_JPEG);
$imagick->setImageCompressionQuality(100);
$imagick->writeImage($saveImageAs);
我假设您已经使用 $imagick = new Imagick(); 初始化了 $imagick已经。如果没有,那么您需要这样做。
这是我使用 Imagemagick 6.9.10.25 Q16 使用您的图片得到的 Mac OSX Sierra。
直接 CMYK 光栅化(背景 alpha 丢失,背景变为白色):
convert 5_5x4_25-Grid.pdf -background skyblue -flatten result1.jpg
在光栅化之前从 CMYK 转换为 sRGB。
convert -colorspace sRGB 5_5x4_25-Grid.pdf -background skyblue -flatten result2.jpg
在光栅化之前从 CMYK 转换为 sRGB,然后使用 -colorspace(颜色略有偏差)转换回 CMYK。
convert -colorspace sRGB 5_5x4_25-Grid.pdf -background skyblue -flatten -colorspace CMYK result3.jpg
在光栅化之前从 CMYK 转换为 sRGB,然后使用 -profile(更好地表示颜色)转换回 CMYK:
convert -colorspace sRGB 5_5x4_25-Grid.pdf -background skyblue -flatten -profile /Users/fred/images/profiles/USWebCoatedSWOP.icc result4.jpg
请注意,使用 Ghostscript 的 Imagemagick 不显示 CMYK PDF 的 Alpha 通道。
Image: 5_5x4_25-Grid.pdf
Format: PDF (Portable Document Format)
Mime type: application/pdf
Class: DirectClass
Geometry: 414x324+0+0
Resolution: 72x72
Print size: 5.75x4.5
Units: Undefined
Colorspace: CMYK
Type: ColorSeparation
Endianess: Undefined
Depth: 16/8-bit
Channel depth:
cyan: 8-bit
magenta: 8-bit
yellow: 8-bit
black: 8-bit
Channel statistics:
Pixels: 134136
Cyan:
min: 0 (0)
max: 34695 (0.529412)
mean: 2051.88 (0.0313097)
standard deviation: 6698 (0.102205)
kurtosis: 14.5033
skewness: 3.89729
entropy: 0.258857
Magenta:
min: 0 (0)
max: 54998 (0.839216)
mean: 5682.95 (0.0867162)
standard deviation: 13648.7 (0.208265)
kurtosis: 2.95123
skewness: 2.13618
entropy: 0.258857
Yellow:
min: 0 (0)
max: 55255 (0.843137)
mean: 5710.18 (0.0871318)
standard deviation: 13735.4 (0.209589)
kurtosis: 3.0097
skewness: 2.14687
entropy: 0.258857
Black:
min: 0 (0)
max: 42405 (0.647059)
mean: 1985.17 (0.0302918)
standard deviation: 8063.54 (0.123042)
kurtosis: 16.6119
skewness: 4.23784
entropy: 0.258857
问题出在我使用的 ghostscript 版本上。升级到 ghostscript 9.22 解决了这个问题。