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が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

このアプローチには 2 つの欠点があります。

  1. 画像がすでに sRGB カラースペースにあり、 を使用して-colorspace sRGBsRGB カラースペースに変換する場合、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画像のカラースペースを変更すると、画像の色が変化し、画像の見た目が変わる可能性があります。したがって、プロファイルを削除するためにカラースペースを別のカラースペースに変換した後、カラースペースを元のカラースペースに戻す必要があります。そのため、コマンドでは演算子を-colorspace2 回使用します。私のサンプル ファイル (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#ストリップ詳細については。

保存する前に画像から 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を設定するために使用できます。色の種類グレースケールへの自動変換を回避し、警告を回避します。私のサンプル ファイルでは、カラー タイプ 6 である「アルファ付き Truecolour」が必要になる場合があります。

$ 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優れたサポートを提供します。

関連情報