我使用 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。
为了消除警告,我们可以
- 保留 ICC 配置文件,但隐藏一般警告,
- 删除 ICC 配置文件或
- 保留 ICC 配置文件并且保存为非灰度 PNG。
保留 ICC 配置文件但隐藏一般警告
如果您只想隐藏警告,请使用该-quiet
选项。毕竟,这不是错误,而只是警告:
$ magick example.pdf -quiet output.png
$
缺点可能是,如果将来出现其他警告,您将不会注意到,因为您也已经隐藏了它们。
删除 ICC 配置文件
相反,您可以选择删除 ICC 配置文件。有多种方法可以做到这一点。例如,其他答案提到更改色彩空间。这(有时)有效,因为 ImageMagick 在更改色彩空间时会自动删除嵌入的配置文件:
(void) DeleteImageProfile(image,"icc");
(void) DeleteImageProfile(image,"icm");
这种方法有两个缺点:
如果您的图像已经在色彩空间 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
相应地使用。显然,如果您使用
-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/2730和https://github.com/ImageMagick/ImageMagick/discussions/6292提供了极好的支持。