2014-03-30 8 views
100

Ich versuche, eine PNG-Datei mit SDL zu laden, aber das Programm nicht funktioniert und dieser Fehler wird in der Konsolelibpng Warnung: ICCP: bekannt falsches sRGB-Profil

„libpng Warnung: ICCP: bekannt falscher sRGB Profil“

Warum diese Warnung angezeigt wird? Was soll ich tun, um dieses Problem zu lösen?

+0

Siehe http://tex.stackexchange.com/questions/125612/warning-pdflatex-libpng-warning-iccp-known-incorrect-srgb-profile –

+0

Und https://groups.google.com/forum/#! msg/adt-dev/rjTQ_STR3OE/-UcNQRISTKsJ –

Antwort

104

Libpng-1.6 ist strikter beim Überprüfen von ICC-Profilen als frühere Versionen. Sie können die Warnung ignorieren. Um es loszuwerden, entfernen Sie den iCCP-Chunk aus dem PNG-Bild.

Einige Anwendungen behandeln Warnungen als Fehler; Wenn Sie eine solche Anwendung verwenden, müssen Sie den Chunk entfernen. Sie können dies mit einer Vielzahl von PNG-Editoren wie ImageMagick's convert in.png out.png tun.

Um die ungültigen ICCP Brocken aus allen PNG-Dateien in einem Ordner (Verzeichnis) zu entfernen, können Sie ImageMagicks verwenden mogrify *.png, vorausgesetzt, dass Ihr ImageMagick mit libpng16 gebaut wurde (convert -list format | grep PNG laufen sicher davon zu sein).

Wenn Sie möchten, um herauszufinden, welche Dateien behoben werden müssen, anstatt blind alle von ihnen verarbeiten, können Sie meine pngcrush -n -q *.png , wo die „-n“ bedeutet umschreiben nicht laufen die Dateien und „-q“ Mittel unterdrücken der größte Teil der Ausgabe außer Warnungen. Entschuldigung, es gibt in pngcrush noch keine Option, um alles außer den Warnungen zu unterdrücken.


Binary Releases von ImageMagick sind here


Für Android Projects (Android Studio) Ebene in res Ordner.

Zum Beispiel: C:\AndroidProjects\{your_project_folder}\app\src\main\res\drawable-hdpi\mogrify *.png

+12

Mit ImageMagick können Sie den Befehl [-strip] (http://www.imagemagick.org/script/command-line-options.php#strip) verwenden. Insbesondere verwendete ich [mogrify] (http://www.imagemagick.org/Usage/basics/#mogrify), um alle Bilder in einem Ordner zu beeinflussen. Mein Befehl sah so aus: _mogrify -strip * .png_ – Maxito

+18

Die Option -strip entfernt alle Profile. Wenn Sie die Option -strip (_mogrify * .png_) weglassen, werden nur falsche Profile gelöscht. –

+0

Gibt es eine Möglichkeit herauszufinden, welche Datei die Warnung auslöst? Das Ausführen von 'mogrify **/*. Png' scheint alle Dateien in der Baumstruktur zu ändern. Ich würde es vorziehen, nur das eine fehlerhafte Bild zu aktualisieren. – Uflex

47

Verwenden pngcrush das falsche sRGB-Profil von der PNG-Datei zu entfernen:

pngcrush -ow -rem allb -reduce file.png 
  • -ow wird die Eingabedatei
  • -rem allb überschreiben alle Neben Brocken entfernen außer tRNS und gAMA
  • -reduce tut lossless Farbtyp oder Bittiefe Reduktion

In der Konsolenausgabe sollten Sie Removed the sRGB chunk. und möglicherweise mehr Meldungen über chunk Umzüge sehen. Sie erhalten am Ende eine kleinere, optimierte PNG-Datei. Da der Befehl die ursprüngliche Datei überschreibt, stellen Sie sicher, dass Sie ein Backup erstellen oder die Versionskontrolle verwenden.

+0

Danke! Das hat geholfen. –

+3

Das hat funktioniert! Machen Sie es rekursiv aus dem aktuellen Ordner in eine .bat-Datei: Für/R %% i in (* .png) tun PNGCRUSH.EXE -oder -rem allb -reduce %% i –

+7

Und ein Einzeiler für * nix rekursiv alle png-Dateien im aktuellen Verzeichnis zu reparieren: 'find. -type f -iname '* .png' -exec pngcrush -ow -rem allb -reduce {} \; '(Getestet unter GNU/Linux) – friederbluemle

-2

Hier ist eine lächerlich Brute-Force-Antwort:

ich das gradlew Skript geändert. Hier ist mein neuer exec-Befehl am Ende der Datei, in den

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "[email protected]" **| grep -v "libpng warning:"** 
2

Mit Irfanview Bildbetrachtern in Windows, ich erneut gespeichert einfach das PNG-Bild und dass das Problem behoben.

3

Dank der fantastic answer von Glenn, benutzte ich ImageMagik ‚s "mogrify * .png" Funktionalität. Allerdings hatte ich Bilder in Unterordner begraben, so habe ich diesen einfachen Python Skript dies in allen Unterordner auf alle Bilder anzuwenden und dachte, es könnte andere helfen:

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) 
+1

Dies ist schön plattformübergreifend, wenn Sie jedoch auf einer Plattform sind, die eine nette * NIX-y-Shell wie Zsh oder Bash unterstützt, können Sie einfach 'mogrify **/*. Png' verwenden. –

+1

Ja, guter Punkt. Ich habe Python nur verwendet, weil wir unter Windows und Linux entwickelt haben und dieses Skript für den zukünftigen Gebrauch in unserem Repository speichern wollten. –

3

zu Glenns großer Antwort hinzuzufügen, hier ist, was tat ich feststellen, welche Dateien fehlerhaft waren:

find . -name "*.png" -type f -print0 | xargs -0 pngcrush_1_8_8_w64.exe -n -q > pngError.txt 2>&1 

ich die Entdeckung und xargs verwendet, weil pngcrush nicht viele Argumente umgehen konnte (die von **/*.png zurückgegeben wurden). Die -print0 und -0 ist erforderlich, um Dateinamen mit Leerzeichen zu behandeln.

Dann suchen Sie in der Ausgabe für diese Zeilen: 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

Und für jeden von denen, laufen mogrify darauf, um sie zu beheben.

Dies verhindert, dass ein Commit jede einzelne PNG-Datei im Repository ändert, wenn nur wenige tatsächlich geändert wurden. Außerdem hat es den Vorteil, genau zu zeigen, welche Dateien fehlerhaft waren.

Ich habe dies unter Windows mit einer Cygwin console und einer zsh-Shell getestet. Nochmals vielen Dank an Glenn, die meisten der oben genannten, ich bin nur eine Antwort hinzufügen, wie es in der Regel einfacher zu finden ist als Kommentare :)

1

Nach dem Versuch, ein paar der Vorschläge auf dieser Seite habe ich am Ende mit der pngcrush-Lösung. Sie können das folgende Bash-Skript verwenden, um fehlerhafte PNG-Profile rekursiv zu erkennen und zu beheben. Übergeben Sie einfach den vollständigen Pfad zu dem Verzeichnis, in dem Sie nach PNG-Dateien suchen möchten.

fixpng "/path/to/png/folder" 

Das Skript:

#!/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" 
+0

Dies verdient mehr Upvotes. Alle anderen Lösungen berühren * jede * Datei, was besonders schlimm ist, wenn Sie viele Bilder in einem Versionskontrollsystem haben. Danke für das Skript! – kfunk

1

Es ist ein einfacher Weg, um dieses Problem mit Mac OS mit Homebrew zu beheben:

-> install homebrew if it is not installed yet 
$brew install libpng 
$pngfix --strip=color --out=file2.png file.png 

oder es mit jeder Datei im aktuellen Verzeichnis zu tun :

mkdir tmp; for f in ./*.png; do pngfix --strip=color --out=tmp/"$f" "$f"; done 

Es wird Ich erstelle für jede PNG-Datei im aktuellen Verzeichnis eine feste Kopie und lege sie in das Unterverzeichnis tmp. Wenn alles in Ordnung ist, müssen Sie nur die ursprünglichen Dateien überschreiben.

Ein weiterer Tipp ist die Verwendung der Keynote- und Preview-Anwendungen zum Erstellen der Symbole. Ich zeichne sie mit Keynote, in der Größe von etwa 120x120 Pixel, über eine Folie mit einem weißen Hintergrund (die Option, Polygone editierbar zu machen, ist großartig!). Vor dem Export in die Vorschau zeichne ich ein Rechteck um das Symbol (ohne Füllung oder Schatten, nur die Kontur mit der Größe von etwa 135x135) und kopiere alles in die Zwischenablage. Danach müssen Sie es nur mit dem Vorschau-Werkzeug mit "Neu aus Zwischenablage" öffnen, einen 128x128 Pixel großen Bereich um das Symbol auswählen, kopieren, "Neu aus Zwischenablage" erneut verwenden und es nach PNG exportieren. Sie müssen das pngfix-Tool nicht ausführen.

+1

Ich habe pngfix in der Standard-Installation von El Capitan nicht gefunden (oder vielleicht habe ich nicht gut genug gesucht), aber ich fand es in der MAMP-Installation, die ich hatte. Arbeitete perfekt! Vielen Dank! Upvoted – guido

+0

Sie haben Recht! Ich habe es vor langer Zeit mit "brew install libpng" installiert. –

+0

Ich habe "n! Ew ERR 08 lesen Undefined_error: _0 Undefined_error: _0 not_a_PNG_ (too_short) car.png" wenn Sie dies auf 10.13.2. – Mitch

1

einige Hintergrundinformationen zu diesem Thema:

Some changes in libpng version 1.6+ cause it to issue a warning or even not work correctly with the original HP/MS sRGB profile, leading to the following stderr: libpng warning: iCCP: known incorrect sRGB profile The old profile uses a D50 whitepoint, where D65 is standard. This profile is not uncommon, being used by Adobe Photoshop, although it was not embedded into images by default.

(Quelle: https://wiki.archlinux.org/index.php/Libpng_errors)

Error detection in some chunks has improved; in particular the iCCP chunk reader now does pretty complete validation of the basic format. Some bad profiles that were previously accepted are now rejected, in particular the very old broken Microsoft/HP sRGB profile. The PNG spec requirement that only grayscale profiles may appear in images with color type 0 or 4 and that even if the image only contains gray pixels, only RGB profiles may appear in images with color type 2, 3, or 6, is now enforced. The sRGB chunk is allowed to appear in images with any color type.

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

1

Sie können dies auch nur in Photoshop beheben ... I habe CC2015, aber ich bin mir sicher, dass dies für alle Versionen gleich ist.

  1. Öffnen Sie Ihre .png-Datei.
  2. Datei -> Speichern unter, und in dem sich öffnenden Dialog uncheck eröffnet "ICC Profil: sRGB IEC61966-2.1"
  3. Uncheck "Als Copy".
  4. Mutig sparen Sie über Ihre ursprüngliche .png.
  5. Geh weiter mit deinem Leben, wissend, dass du nur dieses kleine bisschen Böses von der Welt entfernt hast.