SDLを使用してPNG画像を読み込もうとしていますが、プログラムが機能せず、このエラーがコンソールに表示されます
libpng警告:iCCP:不正確なsRGBプロファイルがわかっています
なぜこの警告が表示されるのですか?この問題を解決するにはどうすればいいですか。
Libpng-1.6は以前のバージョンよりもICCプロファイルをチェックすることに関してより厳格です。あなたは警告を無視することができます。それを取り除くには、PNGイメージからiCCPチャンクを削除します。
一部のアプリケーションは警告をエラーとして扱います。そのようなアプリケーションを使用している場合は、チャンクを削除する必要があります。 ImageMagickのようなさまざまなPNGエディタのどれでもそれをすることができます
convert in.png out.png
フォルダ(ディレクトリ)内のすべてのPNGファイルから無効なiCCPチャンクを削除するには、ImageMagickのmogrify
を使用します。
mogrify *.png
これはあなたのImageMagickがlibpng16で構築されたことを必要とします。次のコマンドを実行すると簡単に確認できます。
convert -list format | grep PNG
盲目的にすべてのファイルを処理するのではなく、どのファイルを修正する必要があるかを知りたい場合は、次のコマンドを実行します。
pngcrush -n -q *.png
-n
はファイルを書き換えないことを意味し、-q
は警告を除いてほとんどの出力を抑制することを意味します。申し訳ありませんが、pngcrushには警告以外のすべてを抑制するオプションはまだありません。
ImageMagickのバイナリリリースはこちら です
Androidプロジェクト(Android Studio)の場合はres
フォルダーに移動します。
例えば:
C:\{your_project_folder}\app\src\main\res\drawable-hdpi\mogrify *.png
Pngファイルから誤ったsRGBプロファイルを削除するには、 pngcrush
を使用します。
pngcrush -ow -rem allb -reduce file.png
-ow
は入力ファイルを上書きします-rem allb
は、tRNSとgAMAを除くすべての補助チャンクを削除します-reduce
はロスレスカラータイプまたはビット深度の削減を行いますコンソールの出力にRemoved the sRGB chunk
と、チャンクの削除に関するより多くのメッセージがあるはずです。あなたはより小さく、最適化されたPNGファイルになるでしょう。コマンドによって元のファイルが上書きされるため、必ずバックアップを作成するか、バージョン管理を使用してください。
誤ったプロファイルは、次の方法で修正できます。
注:このソリューションでは Qtライブラリ を使用します。
提案されたソリューションを実装する方法を示すために、C++で書いた最小限の例を示します。
QPixmap pixmap;
pixmap.load("badProfileImage.png");
QFile file("goodProfileImage.png");
file.open(QIODevice::WriteOnly);
pixmap.save(&file, "PNG");
この例に基づいたGUIアプリケーションの完全なソースコードは、 GitHub にあります。
あなたはまたちょうどフォトショップでこれを修正することができます...私はCC2015を持っていますが、これはすべてのバージョンで同じであると確信しています。
Glennのすばらしい答えに加えて、どのファイルが不良であるかを見つけるために私がしたことがここにあります:
find . -name "*.png" -type f -print0 | xargs \
-0 pngcrush_1_8_8_w64.exe -n -q > pngError.txt 2>&1
Pngcrushが(**/*.png
によって返された)多くの引数を処理できなかったため、findとxargsを使用しました。スペースを含むファイル名を処理するには-print0
と-0
が必要です。
次に、出力でこれらの行を検索します:iCCP: Not recognizing known sRGB profile that has been edited
。
./Installer/Images/installer_background.png:
Total length of data found in critical chunks = 11286
pngcrush: iCCP: Not recognizing known sRGB profile that has been edited
そしてそれらのそれぞれに対して、それらを修正するためにそれに対してmogrifyを実行してください。
mogrify ./Installer/Images/installer_background.png
これを行うことで、実際にはほんの少ししか変更されていないのに、リポジトリ内のすべてのpngファイルをコミットで変更することを防ぐことができます。さらに、どのファイルに問題があるのかを正確に示すことができます。
私はこれをWindows上で Cygwinコンソール とzshシェルでテストしました。 Glenn にお礼を申し上げます。コメントよりも見つけやすいのですが、答えを追加するだけです。
Glenn の 素晴らしい回答 のおかげで、私は ImageMagik を使用しました。 " mogrify * .png "機能しかし、サブフォルダに画像を埋め込んだので、この単純な Python スクリプトを使用して、すべてのサブフォルダ内のすべての画像にこれを適用し、他の人に役立つ可能性があると考えました。
import os
import subprocess
def system_call(args, cwd="."):
print("Running '{}' in '{}'".format(str(args), cwd))
subprocess.call(args, cwd=cwd)
pass
def fix_image_files(root=os.curdir):
for path, dirs, files in os.walk(os.path.abspath(root)):
# sys.stdout.write('.')
for dir in dirs:
system_call("mogrify *.png", "{}".format(os.path.join(path, dir)))
fix_image_files(os.curdir)
Mac OSとHomebrewでこの問題を解決する簡単な方法があります。
自作がまだインストールされていない場合はインストールします。
$brew install libpng
$pngfix --strip=color --out=file2.png file.png
または現在のディレクトリ内のすべてのファイルに対してそれを行うには、
mkdir tmp; for f in ./*.png; do pngfix --strip=color --out=tmp/"$f" "$f"; done
現在のディレクトリの各pngファイルに対して固定コピーを作成し、それをtmpサブディレクトリに配置します。その後、すべて問題なければ、元のファイルを上書きするだけです。
もう1つのヒントは、KeynoteとPreviewアプリケーションを使ってアイコンを作成することです。私はKeynoteを使って、背景が白いスライド上に120×120ピクセルの大きさで描きます(ポリゴンを編集可能にするオプションは素晴らしいです)。プレビューにエクスポートする前に、アイコンの周りに長方形を描き(塗りつぶしや影は付けずに、アウトラインだけで、サイズは約135 x 135)、すべてをクリップボードにコピーします。その後、プレビューツールで[クリップボードから新規作成]を使用して開き、アイコンの周囲の128 x 128ピクセルの領域を選択してコピーし、[クリップボードから新規作成]を使用してPNGにエクスポートするだけです。あなたはpngfixツールを実行する必要はありません。
これに関するいくつかの背景情報:
Libpngバージョン1.6+のいくつかの変更はそれが警告を発するか、あるいは次の標準エラーに通じる正しくさえ働かない原因となります:libpng警告:iCCP:既知の間違ったsRGBプロファイル古いプロファイルはD50ホワイトポイントを使います、 D65が標準です。デフォルトでは画像に埋め込まれていませんでしたが、このプロファイルは珍しいことではなく、Adobe Photoshopで使用されています。
(出典: https://wiki.archlinux.org/index.php/Libpng_errors )
いくつかのチャンクのエラー検出は改善されました。特に、iCCPチャンクリーダーは現在、基本フォーマットのかなり完全な検証を行っています。以前に受け入れられていたいくつかの悪いプロファイル、特に非常に古い壊れたMicrosoft/HP sRGBプロファイルは現在拒否されています。カラータイプ0または4のイメージにはグレースケールプロファイルのみが表示され、イメージにグレーピクセルのみが含まれている場合でも、カラータイプ2、3、または6のイメージにはRGBプロファイルのみが表示されるというPNG仕様の要件が適用されます。 sRGBチャンクは、どのようなカラータイプの画像にも使用できます。
このページでいくつかの提案を試した後、私はpngcrushソリューションを使いました。下記のbashスクリプトを使って、悪いpngプロファイルを再帰的に検出し修正することができます。 pngファイルを検索したいディレクトリへのフルパスを渡してください。
fixpng "/path/to/png/folder"
スクリプト:
#!/bin/bash
FILES=$(find "$1" -type f -iname '*.png')
FIXED=0
for f in $FILES; do
WARN=$(pngcrush -n -warn "$f" 2>&1)
if [[ "$WARN" == *"PCS illuminant is not D50"* ]] || [[ "$WARN" == *"known incorrect sRGB profile"* ]]; then
pngcrush -s -ow -rem allb -reduce "$f"
FIXED=$((FIXED + 1))
fi
done
echo "$FIXED errors fixed"
WindowsのIrfanView画像ビューアを使用して、PNG画像を保存し直したところ、問題が解決しました。
Friederbluemleソリューションを拡張するには、 pngcrush をダウンロードし、複数のpngファイルで実行している場合はこのようなコードを使用します。
path =r"C:\\project\\project\\images" # path to all .png images
import os
png_files =[]
for dirpath, subdirs, files in os.walk(path):
for x in files:
if x.endswith(".png"):
png_files.append(os.path.join(dirpath, x))
file =r'C:\\Users\\user\\Downloads\\pngcrush_1_8_9_w64.exe' #pngcrush file
for name in png_files:
cmd = r'{} -ow -rem allb -reduce {}'.format(file,name)
os.system(cmd)
ここで、プロジェクトに関連するすべてのpngファイルが1つのフォルダーにあります。