在 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="*"

也可以看看:有關定義命令的文檔

答案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 配置文件灰階巴布亞紐幾內亞.

要擺脫警告,我們可以

  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
    $ 
    

    -colorspace RGB相反,如果您在已經處於 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顏色類型以避免自動轉換為灰度,從而避免警告。對於我的範例文件,我可能需要“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/2730https://github.com/ImageMagick/ImageMagick/discussions/6292這提供了極好的支持。

相關內容