web-dev-qa-db-ja.com

libpng警告:iCCP:不正確なsRGBプロファイルがわかっています

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

libpng警告:iCCP:不正確なsRGBプロファイルがわかっています

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

141
rkarami

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
144

Pngファイルから誤ったsRGBプロファイルを削除するには、 pngcrush を使用します。

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

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

65
friederbluemle

溶液

誤ったプロファイルは、次の方法で修正できます。

  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 にあります。

17
scopchanov

あなたはまたちょうどフォトショップでこれを修正することができます...私はCC2015を持っていますが、これはすべてのバージョンで同じであると確信しています。

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

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 にお礼を申し上げます。コメントよりも見つけやすいのですが、答えを追加するだけです。

7
Uflex

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)
6
Devan Williams

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

5
Adriel Jr

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

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チャンクは、どのようなカラータイプの画像にも使用できます。

(出典: https://forum.qt.io/topic/58638/solved-libpng-warning-iccp-known-incorrect-srgb-profile-drive-me-nuts/16

4
George Birbilis

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

WindowsのIrfanView画像ビューアを使用して、PNG画像を保存し直したところ、問題が解決しました。

3
Neil Roy

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

1
prashant rana