SDLを使用してPNG画像を読み込もうとしていますが、プログラムが機能せず、このエラーがコンソールに表示されます
libpng警告:iCCP:既知の不正なsRGBプロファイル
この警告が表示されるのはなぜですか?この問題を解決するにはどうすればよいですか?
SDLを使用してPNG画像を読み込もうとしていますが、プログラムが機能せず、このエラーがコンソールに表示されます
libpng警告:iCCP:既知の不正なsRGBプロファイル
この警告が表示されるのはなぜですか?この問題を解決するにはどうすればよいですか?
回答:
Libpng-1.6は、以前のバージョンよりもICCプロファイルのチェックに関してより厳格です。警告は無視してかまいません。それを取り除くには、PNG画像からiCCPチャンクを削除します。
一部のアプリケーションは警告をエラーとして扱います。このようなアプリケーションを使用している場合は、チャンクを削除する必要があります。ImageMagickのようなさまざまなPNGエディターのいずれかでそれを行うことができます。
convert in.png out.png
フォルダー(ディレクトリ)内のすべてのPNGファイルから無効なiCCPチャンクを削除するにはmogrify
、ImageMagickから使用できます。
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
mogrify **/*.png
すると、ツリー内のすべてのファイルが変更されるようです。問題のある画像を1つだけ更新することをお勧めします。
find . -type f -name '*.png' -execute mogrify \{\} \;
を再帰的に変更するために使用し.png
ます。
-ow
、ファイルを上書きして修正し、サイズを約1/6に削減しました!私のMac用のプログラムのソースコードを取得し、コンパイルして手動でインストールし、実行するだけでした。GitHub Kjuly / pngcrushには、コンパイル済みのバイナリが含まれている可能性がありますが、確実ではありません。Sourceforgeには、Windows exeが利用可能であり、ソースコードしか含まれていないようです。friederbluemleの答えはこれ以上のことをするようです。
pngcrush
pngファイルから誤ったsRGBプロファイルを削除するために使用します。
pngcrush -ow -rem allb -reduce file.png
-ow
入力ファイルを上書きします-rem allb
tRNSとgAMAを除くすべての補助チャンクを削除します-reduce
ロスレスカラータイプまたはビット深度の削減を行いますコンソールの出力にRemoved the sRGB chunk
、チャンクの削除に関するメッセージが表示されます。最終的には、より小さく最適化されたPNGファイルになります。コマンドは元のファイルを上書きするため、必ずバックアップを作成するか、バージョン管理を使用してください。
find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;
(GNU / Linuxでテスト済み)
不適切なプロファイルは、次の方法で修正できます。
ここに、提案されたソリューションを実装する方法を示すためにC ++で記述した最小限の例を示します。
QPixmap pixmap;
pixmap.load("badProfileImage.png");
QFile file("goodProfileImage.png");
file.open(QIODevice::WriteOnly);
pixmap.save(&file, "PNG");
この例に基づくGUIアプリケーションの完全なソースコードは、GitHubで入手できます。
2019年5月12日からの更新:答えは有効で、現在も有効ですが、GitHubで共有したGUIアプリケーションにバグがあり、出力画像が空になりました。直したところ、ご不便をおかけして申し訳ございません。
グレンの素晴らしい答えに追加するために、欠陥のあるファイルを見つけるために私がしたことは次のとおりです:
find . -name "*.png" -type f -print0 | xargs \
-0 pngcrush_1_8_8_w64.exe -n -q > pngError.txt 2>&1
pngcrushが多数の引数(によって返された**/*.png
)を処理できなかったため、私は検索と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に感謝します。コメントよりも見つけやすいので答えを追加します:)
find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;
pngcrush: iCCP: known incorrect sRGB profile
おかげで素晴らしい答えからグレンは、私が使用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)
mogrify **/*.png
いる場合は、そのまま使用できます。
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を使用して、背景が白のスライドの上に約120x120ピクセルのサイズで描画します(ポリゴンを編集可能にするオプションは素晴らしいです!)。プレビューにエクスポートする前に、アイコンの周りに四角形を描き(塗りつぶしや影なし、輪郭だけで、サイズは約135x135)、すべてをクリップボードにコピーします。その後、「クリップボードから新規作成」を使用してプレビューツールで開き、アイコンの周りの128x128ピクセルの領域を選択してコピーし、「クリップボードから新規作成」を再度使用して、PNGにエクスポートするだけです。pngfixツールを実行する必要はありません。
このページのいくつかの提案を試した後、私は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"
pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8
いますが、pngcrushにはフラグ-warn
もない-reduce
ので、このソリューションは機能しません。
これに関するいくつかの背景情報:
libpngバージョン1.6+の一部の変更により、警告が発行されるか、元のHP / MS sRGBプロファイルで正しく機能しなくなり、次のstderrが発生します。libpng警告:iCCP:既知の不正なsRGBプロファイル古いプロファイルはD50ホワイトポイントを使用します。 D65が標準です。このプロファイルは珍しくなく、Adobe Photoshopで使用されていますが、デフォルトでは画像に埋め込まれていません。
(ソース:https : //wiki.archlinux.org/index.php/Libpng_errors)
一部のチャンクのエラー検出が改善されました。特に、iCCPチャンクリーダーは、基本フォーマットの完全な検証を実行します。以前は受け入れられていた一部の不良プロファイル、特に非常に古い壊れたMicrosoft / HP sRGBプロファイルが拒否されました。グレースケールプロファイルのみがカラータイプ0または4の画像に表示される可能性があり、画像にグレーピクセルのみが含まれている場合でも、RGBプロファイルのみがカラータイプ2、3、または6の画像に表示される可能性があるというPNG仕様の要件が適用されます。sRGBチャンクは、任意のカラータイプの画像に表示できます。
(ソース:https : //forum.qt.io/topic/58638/solved-libpng-warning-iccp-known-incorrect-srgb-profile-drive-me-nuts/16)
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つのフォルダーにあります。
これら2つのコマンドをプロジェクトのルートで実行し、修正しました。
基本的に、「find」コマンドの出力をテキストファイルにリダイレクトして、処理するファイルのリストとして使用します。次に、「@」フラグを使用して、そのテキストファイルを「mogrify」に読み込むことができます。
* .png -mtime -1> list.txtを見つけます
mogrify-サイズ変更50%@ list.txt
これは「検索」を使用して、1日より新しい* .png画像をすべて取得し、「list.txt」という名前のファイルに出力します。次に、「mogrify」はそのリストを読み取り、画像を処理し、サイズ変更されたバージョンでオリジナルを上書きします。システムごとに「検索」の動作にわずかな違いがある可能性があるため、正確な使用方法については、マニュアルページを確認する必要があります。