次のように、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。
警告を消すには、
- ICCプロファイルを維持しながら警告を非表示にする
- ICCプロファイルを削除するか
- ICC プロファイルを保持し、グレースケール PNG として保存しないでください。
ICCプロファイルを維持しながら、警告を非表示にする
警告を単に非表示にしたい場合は、-quiet
オプションを使用します。結局のところ、これはエラーではなく、単なる警告です。
$ magick example.pdf -quiet output.png
$
欠点としては、将来的に他の警告が表示されても、すでに非表示になっているため気付かない可能性があることです。
ICCプロファイルを削除する
代わりに、ICC プロファイルを削除することを選択できます。削除する方法は複数あります。他の回答では、たとえばカラースペースの変更について言及されています。これは (場合によっては) 機能します。これは、カラースペースを変更すると、ImageMagick が埋め込まれたプロファイルを自動的に削除するためです。
(void) DeleteImageProfile(image,"icc");
(void) DeleteImageProfile(image,"icm");
このアプローチには 2 つの欠点があります。
画像がすでに 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
2 回使用します。私のサンプル ファイル (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優れたサポートを提供します。