libpng警告:iCCP:既知の不正なsRGBプロファイル


173

SDLを使用してPNG画像を読み込もうとしていますが、プログラムが機能せず、このエラーがコンソールに表示されます

libpng警告:iCCP:既知の不正なsRGBプロファイル

この警告が表示されるのはなぜですか?この問題を解決するにはどうすればよいですか?



回答:


180

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

13
ImageMagickでは、-stripコマンドを使用できます。具体的には、mogrifyを使用してフォルダ内のすべての画像に影響を与えました。私のコマンドは次のようになりました:mogrify -strip * .png
Maxito

24
-stripオプションはすべてのプロファイルを削除します。-stripオプションを省略した場合(mogrify * .png)、誤ったプロファイルのみが削除されます。
Glenn Randers-Pehrson 2014年

2
警告をトリガーしているファイルを見つける方法はありますか?実行mogrify **/*.pngすると、ツリー内のすべてのファイルが変更されるようです。問題のある画像を1つだけ更新することをお勧めします。
Uflex 2016年

1
現在のディレクトリ内のファイルfind . -type f -name '*.png' -execute mogrify \{\} \;を再帰的に変更するために使用し.pngます。
ヴァルはモニカを復活させる

ImageMagickバイナリーがコンピューターをフリーズさせた場合、おそらくハードな作業が原因であり、夜通し離れた後、強制的に再起動する必要がありました。pngcrushアプリケーションを使用して前述の問題を検出し-ow、ファイルを上書きして修正し、サイズを約1/6に削減しました!私のMac用のプログラムのソースコードを取得し、コンパイルして手動でインストールし、実行するだけでした。GitHub Kjuly / pngcrushには、コンパイル済みのバイナリが含まれている可能性がありますが、確実ではありません。Sourceforgeには、Windows exeが利用可能であり、ソースコードしか含まれていないようです。friederbluemleの答えはこれ以上のことをするようです。
Pysis

73

pngcrushpngファイルから誤ったsRGBプロファイルを削除するために使用します。

pngcrush -ow -rem allb -reduce file.png
  • -ow 入力ファイルを上書きします
  • -rem allb tRNSとgAMAを除くすべての補助チャンクを削除します
  • -reduce ロスレスカラータイプまたはビット深度の削減を行います

コンソールの出力にRemoved the sRGB chunk、チャンクの削除に関するメッセージが表示されます。最終的には、より小さく最適化されたPNGファイルになります。コマンドは元のファイルを上書きするため、必ずバックアップを作成するか、バージョン管理を使用してください。


7
うまくいきました!現在のフォルダーから再帰的に実行します。これを.batファイルに入れます。/R%% i in(* .png)を実行するには、PNGCRUSH.EXE -ow -rem allb -reduce %% i
Andy Brice

13
そして、* nixが現在のディレクトリにあるすべてのpngファイルを再帰的に修正するためのワンライナー:find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;(GNU / Linuxでテスト済み)
friederbluemle

2
上のフライヤーの上の行は、ウィンドウのgit bashでも動作します。
iKlsR 2017年

私の場合、Pngcrushはこのチャンクを削除しません。しかし、imagemagickのmogrifyはそれを行いました。
ニコス

25

解決

不適切なプロファイルは、次の方法で修正できます。

  1. QPixmap :: loadを使用して不適切なプロファイルで画像を開く
  2. QPixmap :: saveを使用して画像をディスクに保存します(すでに正しいプロファイルが使用されています)。

注:このソリューションではQtライブラリを使用します

ここに、提案されたソリューションを実装する方法を示すために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アプリケーションにバグがあり、出力画像が空になりました。直したところ、ご不便をおかけして申し訳ございません。


4
この回答が賛成されなかったことに驚いています。それは何もインストールする必要がなく、それは機能します...それ以上に何が求められるか:)
Quantuple

17

フォトショップでこれを修正することもできます...

  1. .pngファイルを開きます。
  2. ファイル-> 名前を付けて保存して開くダイアログで、「ICCプロファイル:sRGB IEC61966-2.1」のチェックを外します
  3. 「コピーとして」のチェックを外します。
  4. 元の.pngよりも勇気をもって保存します。
  5. 世界からほんの少しの悪を取り除いたということを知って、あなたの人生を先に進んでください。

8

グレンの素晴らしい答えに追加するために、欠陥のあるファイルを見つけるために私がしたことは次のとおりです:

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に感謝します。コメントよりも見つけやすいので答えを追加します:)


3
Debianでは、ソフトウェアで問題のあるファイルを見つけるために、find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;pngcrush: iCCP: known incorrect sRGB profile
エラーのある

7

おかげで素晴らしい答えからグレンは、私が使用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)

2
これはクロスプラットフォームですが、ZshやBashなどの* NIX-yシェルをサポートするプラットフォームを使用してmogrify **/*.pngいる場合は、そのまま使用できます。
カイルストランド

1
ええ、良い点です。WindowsとLinuxで開発していて、このスクリプトをリポジトリにコミットして将来使用できるようにしたかったため、私はPythonのみを使用しました。
Devan Williams

5

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ツールを実行する必要はありません。


1
標準のOS El Capitanインストールでpngfixを見つけられませんでした(または、十分に検索できなかった可能性があります)が、私が持っていたMAMPインストールでそれを見つけました。完璧に働きました!ありがとう!Upvoted
グイド

あなたが正しいです!昔は「brew install libpng」でインストールしていました。
Adriel Jr 2017

これを10.13.2で実行すると、「n!ew ERR 08 read Undefined_error:_0 Undefined_error:_0 not_a_PNG_(too_short)car.png」が表示されました。
ミッチ

10.13.6にアップグレードした後でも、@ Mitchは問題なく動作します。
Adriel Jr

4

このページのいくつかの提案を試した後、私は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"

2
これは、より多くの賛成投票に値します。他のすべてのソリューションはすべてのファイルにアクセスしますが、バージョン管理システムに多数の画像がある場合は特に問題があります。スクリプトをありがとう!
kfunk 2017

私は持ってpngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8いますが、pngcrushにはフラグ-warnもない-reduceので、このソリューションは機能しません。
pbhj

4

これに関するいくつかの背景情報:

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


3

WindowsでIrfanView画像ビューアを使用して、PNG画像を再保存するだけで問題が修正されました。


1

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つのフォルダーにあります。


0

これら2つのコマンドをプロジェクトのルートで実行し、修正しました。

基本的に、「find」コマンドの出力をテキストファイルにリダイレクトして、処理するファイルのリストとして使用します。次に、「@」フラグを使用して、そのテキストファイルを「mogrify」に読み込むことができます。

* .png -mtime -1> list.txtを見つけます

mogrify-サイズ変更50%@ list.txt

これは「検索」を使用して、1日より新しい* .png画像をすべて取得し、「list.txt」という名前のファイルに出力します。次に、「mogrify」はそのリストを読み取り、画像を処理し、サイズ変更されたバージョンでオリジナルを上書きします。システムごとに「検索」の動作にわずかな違いがある可能性があるため、正確な使用方法については、マニュアルページを確認する必要があります。


-2

ここに途方もなく総当たりの答えがあります:

gradlewスクリプトを変更しました。これは、ファイルの最後にある新しいexecコマンドです

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.