我使用 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
答案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 is not waiting a顏色嵌入的 ICC 配置文件灰階巴布亞紐幾內亞.
要擺脫警告,我們可以
- 保留 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 $
-colorspace RGB
相反,如果您在已經處於 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顏色類型以避免自動轉換為灰度,從而避免警告。對於我的範例文件,我可能需要“Truecolour with 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這提供了極好的支持。