在 ImageMagick 中将 PDF 转换为 PNG 时出错

在 ImageMagick 中将 PDF 转换为 PNG 时出错

我使用 Imagemagick convert 将 pdf 文件转换为 png,如下所示:

Magick convert -density 300 PointOnLine.pdf -quality 90 PointOnLine.png

它发出警告:

convert: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG `PointOnLine.png' @ warning/png.c/MagickPNGWarningHandler/1744.

生成的 png 图像全是黑色。但是,转换为 jpg 图像就可以了。问题是什么?谢谢。

答案1

尝试在输出文件名前添加 -colorspace RGB。

convert -density 300 PointOnLine.pdf -quality 90 -colorspace RGB PointOnLine.png

答案2

文档说:

PNG RW 便携式网络图形需要 libpng-1.0.11 或更高版本,建议使用 libpng-1.2.5 或更高版本。PNG 规范不支持每英寸像素单位,仅支持每厘米像素单位。要避免读取特定的关联图像配置文件,请使用 -define profile:skip=name(例如 profile:skip=ICC)。

因此,请尝试在输出文件名前添加-define profile:skip=ICC(或)。skip="*"

也可以看看:关于 define 命令的文档

答案3

我正在使用 ImageMagick 7.1.1-8,并且遇到了同样的问题:

$ magick example.pdf output.png
magick: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG `output.png' @ warning/png.c/MagickPNGWarningHandler/1526.
$ magick -version
Version: ImageMagick 7.1.1-8 Q16-HDRI x86_64 d92cb0e65:20230421 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI OpenMP(4.5) 
Delegates (built-in): bzlib djvu fontconfig freetype heic jbig jng jpeg lcms lqr lzma openexr png raqm tiff webp x xml zlib
Compiler: gcc (7.5)
$ 

就我而言,ImageMagick(使用 Ghostscript)正在读取我输入的 PDF 文件并使用嵌入的 ICC 配置文件在 sRGB 色彩空间中生成图像数据:

$ magick example.pdf -verbose info: | grep "Colorspace:"
  Colorspace: sRGB
$ magick example.pdf -verbose info: | grep -A1 "Profiles:"
  Profiles:
    Profile-icc: 2576 bytes
$ 

当将该图像数据保存为 PNG 文件时,ImageMagick 会自动优化色彩空间,并将文件保存为灰度 PNG,并使用颜色类型 0

$ magick output.png -verbose info: | grep "Colorspace:"
  Colorspace: Gray
$ magick output.png -verbose info: | grep "color_type"
    png:IHDR.color_type: 0 (Grayscale)
$ 

但确实如此不是删除嵌入的 ICC 配置文件:

$ magick output.png -verbose info: | grep -A1 "Profiles:"
  Profiles:
    Profile-icc: 2576 bytes
$ 

这就是警告的内容:libpng 不期望颜色嵌入在 ICC 配置文件中灰度PNG。

为了消除警告,我们可以

  1. 保留 ICC 配置文件,但隐藏一般警告,
  2. 删除 ICC 配置文件或
  3. 保留 ICC 配置文件并且保存为非灰度 PNG。

保留 ICC 配置文件但隐藏一般警告

如果您只想隐藏警告,请使用该-quiet选项。毕竟,这不是错误,而只是警告:

$ magick example.pdf -quiet output.png
$ 

缺点可能是,如果将来出现其他警告,您将不会注意到,因为您也已经隐藏了它们。

删除 ICC 配置文件

相反,您可以选择删除 ICC 配置文件。有多种方法可以做到这一点。例如,其他答案提到更改色彩空间。这(有时)有效,因为 ImageMagick 在更改色彩空间时会自动删除嵌入的配置文件:

(void) DeleteImageProfile(image,"icc");
(void) DeleteImageProfile(image,"icm");

来源:https://github.com/ImageMagick/ImageMagick/blob/7a63f554dc0f986aa3ef2767d041a0f3294decd2/MagickCore/colorspace.c#L1624-L1625

这种方法有两个缺点:

  1. 如果您的图像已经在色彩空间 sRGB 中,并且您使用它-colorspace sRGB来转换为色彩空间 sRGB,ImageMagick 将忽略该运算符,因此不会删除配置文件。例如,我的输入 PDF 文件在 sRGB 色彩空间中生成了一个图像,这意味着-colorspace sRGB没有效果并且不会删除配置文件:

    $ magick example.pdf -colorspace sRGB -verbose info: | grep -A1 "Profiles:"
      Profiles:
        Profile-icc: 2576 bytes
    $ 
    

    相反,如果您在已经是 RGB 颜色空间的图像上使用,情况也是如此-colorspace RGB。因此,如果您想使用此方法删除 ICC 配置文件,您必须提前检查您的图像是 sRGB 还是 RGB,然后-colorspace相应地使用。

  2. 显然,如果您使用-colorspace来更改图像的色彩空间,图像的颜色可能会发生变化,从而使图像看起来不同。因此,在将色彩空间转换为不同的色彩空间以删除配置文件后,您应该将色彩空间转换回原始色彩空间。因此您的命令将使用-colorspace两次运算符。对于我的示例文件(sRGB),我首先转换为 RGB,然后再转换回 sRGB:

    $ magick example.pdf -colorspace RGB -colorspace sRGB -verbose info: | grep "Colorspace:"
      Colorspace: sRGB
    $ magick example.pdf -colorspace RGB -colorspace sRGB -verbose info: | grep -A1 "Profiles:"
    $ 
    

    您可能仍会从转换中得到一些舍入误差,但图像或多或少看起来相同。

删除配置文件的另一种方法是使用-strip

$ magick example.pdf -strip -verbose info: | grep -A1 "Profiles:"
$ 

但是,该选项不仅会删除所有配置文件,还会删除其他元数据,这可能不是我们想要的行为。请参阅https://imagemagick.org/script/command-line-options.php#strip了解更多信息。

要在保存之前从图像中专门删除 ICC 配置文件,您可以使用+profile icc

$ magick example.pdf +profile icc -verbose info: | grep -A1 "Profiles:"
$ 

或者,为了首先不从输入文件中读取任何 ICC 配置文件,您可以使用-define profile:skip=icc

$ magick -define profile:skip=icc example.pdf -verbose info: | grep -A1 "Profiles:"
$ 

请注意,此设置会影响阅读,所以你必须把它放在输入文件之前。

保留 ICC 配置文件并且不保存为灰度 PNG

最后,如果你想保留配置文件,你可以使用-define png:color-type=它来设置你想要的 PNG颜色类型以避免自动转换为灰度,从而避免出现警告。对于我的示例文件,我可能需要“带 alpha 的真彩色”,即颜色类型 6:

$ magick example.pdf -define png:color-type=6 output.png
$ magick output.png -verbose info: | grep "color_type"
    png:IHDR.color_type: 6 (RGBA)
$

或者,您可以使用例如PNG32:输出前缀:

$ magick example.pdf PNG32:output.png
$ magick output.png -verbose info: | grep "color_type"
    png:IHDR.color_type: 6 (RGBA)
$ 

在这两种情况下,都不会出现警告,但 ICC 配置文件仍会保留:

$ magick output.png -verbose info: | grep -A1 "Profiles:"
  Profiles:
    Profile-icc: 2576 bytes
$ 

您可以在 ImageMagick 的 GitHub 讨论页面中进一步了解此问题,网址为https://github.com/ImageMagick/ImageMagick/discussions/2730https://github.com/ImageMagick/ImageMagick/discussions/6292提供了极好的支持。

相关内容