Ich versuche, ein PNG-Image mit SDL zu laden, aber das Programm funktioniert nicht und dieser Fehler wird in der Konsole angezeigt
libpng-Warnung: iCCP: Bekanntes falsches sRGB-Profil
Warum wird diese Warnung angezeigt? Was soll ich tun, um dieses Problem zu lösen?
Antworten:
Libpng-1.6 prüft ICC-Profile strenger als frühere Versionen. Sie können die Warnung ignorieren. Entfernen Sie den iCCP-Block aus dem PNG-Image, um ihn zu entfernen.
Einige Anwendungen behandeln Warnungen als Fehler. Wenn Sie eine solche Anwendung verwenden, müssen Sie den Block entfernen. Sie können dies mit einer Vielzahl von PNG-Editoren wie ImageMagick tun
Um den ungültigen iCCP-Block aus allen PNG-Dateien in einem Ordner (Verzeichnis) zu entfernen, können Sie Folgendes in
mogrify
ImageMagick verwenden:Dies setzt voraus, dass Ihr ImageMagick mit libpng16 erstellt wurde. Sie können es einfach überprüfen, indem Sie Folgendes ausführen:
Wenn Sie herausfinden möchten, welche Dateien repariert werden müssen, anstatt alle blind zu verarbeiten, können Sie sie ausführen
Wobei die
-n
Mittel die Dateien nicht neu schreiben und-q
die meisten Ausgaben außer Warnungen unterdrücken. Leider gibt es in pngcrush noch keine Option, um alles außer den Warnungen zu unterdrücken.Binäre Releases von ImageMagick sind hier
Navigieren Sie für Android-Projekte (Android Studio) in den
res
Ordner.Beispielsweise:
quelle
mogrify **/*.png
scheint alle Dateien im Baum zu ändern. Ich würde es vorziehen, nur das eine fehlerhafte Bild zu aktualisieren.find . -type f -name '*.png' -execute mogrify \{\} \;
diese Option, um.png
Dateien im aktuellen Verzeichnis rekursiv zu ändern .-ow
die Datei zu überschreiben und zu beheben und die Größe um etwa 1/6 zu reduzieren! Ich musste nur den Quellcode des Programms für meinen Mac abrufen, kompilieren, manuell installieren und ausführen. GitHub Kjuly / pngcrush hat möglicherweise eine vorkompilierte Binärdatei, ist sich aber nicht sicher. Sourceforge schien nur Windows-Exe und den Quellcode zur Verfügung zu haben. friederbluemles antwort scheint dies und mehr zu tun.Verwenden Sie
pngcrush
diese Option , um das falsche sRGB-Profil aus der PNG-Datei zu entfernen:-ow
überschreibt die Eingabedatei-rem allb
entfernt alle Nebenstücke außer tRNS und gAMA-reduce
führt eine verlustfreie Reduzierung des Farbtyps oder der Bittiefe durchIn der Konsolenausgabe sollten Sie
Removed the sRGB chunk
möglicherweise weitere Meldungen zu Blockentfernungen sehen. Sie erhalten eine kleinere, optimierte PNG-Datei. Stellen Sie sicher, dass Sie ein Backup erstellen oder die Versionskontrolle verwenden, da der Befehl die Originaldatei überschreibt.quelle
find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;
(Getestet unter GNU / Linux)Lösung
Das falsche Profil könnte behoben werden durch:
Hinweis: Diese Lösung verwendet die Qt-Bibliothek .
Beispiel
Hier ist ein minimales Beispiel, das ich in C ++ geschrieben habe, um zu demonstrieren, wie die vorgeschlagene Lösung implementiert wird:
Der vollständige Quellcode einer GUI-Anwendung basierend auf diesem Beispiel ist auf GitHub verfügbar .
UPDATE VOM 05.12.2019: Die Antwort war und ist gültig, es gab jedoch einen Fehler in der GUI-Anwendung, die ich auf GitHub freigegeben habe, was dazu führte, dass das Ausgabebild leer war. Ich habe es gerade behoben und entschuldige mich für die Unannehmlichkeiten!
quelle
Sie können dies auch einfach in Photoshop beheben ...
quelle
Um Glenns großartige Antwort zu ergänzen, habe ich Folgendes getan, um herauszufinden, welche Dateien fehlerhaft waren:
Ich habe find und xargs verwendet, weil pngcrush nicht viele Argumente verarbeiten konnte (die von zurückgegeben wurden
**/*.png
). Das-print0
und-0
ist erforderlich, um Dateinamen zu verarbeiten, die Leerzeichen enthalten.Suchen Sie dann in der Ausgabe nach diesen Zeilen :
iCCP: Not recognizing known sRGB profile that has been edited
.Und für jeden von diesen führen Sie mogrify darauf aus, um sie zu beheben.
Auf diese Weise wird 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 anzuzeigen, welche Dateien fehlerhaft waren.
Ich habe dies unter Windows mit einer Cygwin-Konsole und einer zsh-Shell getestet . Nochmals vielen Dank an Glenn, der die meisten der oben genannten Punkte formuliert hat. Ich füge nur eine Antwort hinzu, da sie normalerweise leichter zu finden ist als Kommentare :)
quelle
find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;
Jedes fehlerhafte PNG wird generiertpngcrush: iCCP: known incorrect sRGB profile
Dank der fantastischen Antwort von Glenn habe ich die "mogrify * .png" -Funktionalität von ImageMagik verwendet . Da ich jedoch Bilder in Unterordnern vergraben hatte, verwendete ich dieses einfache Python- Skript, um dies auf alle Bilder in allen Unterordnern anzuwenden, und dachte, es könnte anderen helfen:
quelle
mogrify **/*.png
.Es gibt eine einfachere Möglichkeit, dieses Problem mit Mac OS und Homebrew zu beheben:
Installieren Sie Homebrew, falls es noch nicht installiert ist
oder um es mit jeder Datei im aktuellen Verzeichnis zu tun:
Es wird eine feste Kopie für jede PNG-Datei im aktuellen Verzeichnis erstellt und im Unterverzeichnis tmp abgelegt. Wenn danach alles in Ordnung ist, müssen Sie nur noch die Originaldateien überschreiben.
Ein weiterer Tipp ist die Verwendung der Keynote- und Vorschau-Anwendungen zum Erstellen der Symbole. Ich zeichne sie mit Keynote in einer Größe von ca. 120 x 120 Pixel über eine Folie mit weißem Hintergrund (die Option, Polygone bearbeitbar zu machen, ist großartig!). Vor dem Export in die Vorschau zeichne ich ein Rechteck um das Symbol (ohne Füllung oder Schatten, nur den Umriss mit einer Größe von ca. 135 x 135) und kopiere alles in die Zwischenablage. Danach müssen Sie es nur noch mit dem Vorschau-Tool unter "Neu aus der Zwischenablage" öffnen, einen Bereich mit 128 x 128 Pixel um das Symbol herum auswählen, kopieren, erneut "Neu aus der Zwischenablage" verwenden und in PNG exportieren. Sie müssen das pngfix-Tool nicht ausführen.
quelle
Nachdem ich einige der Vorschläge auf dieser Seite ausprobiert hatte, verwendete ich schließlich die 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.
Das Skript:
quelle
pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8
aber mein pngcrush hat noch-warn
keine-reduce
Flags, so dass diese Lösung nicht funktioniert.Einige Hintergrundinformationen dazu:
(Quelle: https://wiki.archlinux.org/index.php/Libpng_errors )
(Quelle: https://forum.qt.io/topic/58638/solved-libpng-warning-iccp-known-incorrect-srgb-profile-drive-me-nuts/16 )
quelle
Mit dem IrfanView-Bildbetrachter in Windows habe ich das PNG-Bild einfach erneut gespeichert, wodurch das Problem behoben wurde.
quelle
Erweitern Sie die friederbluemle-Lösung, laden Sie den pngcrush herunter und verwenden Sie den folgenden Code, wenn Sie ihn auf mehreren png-Dateien ausführen
Hier befinden sich alle PNG-Dateien, die sich auf Projekte beziehen, in einem Ordner.
quelle
Ich habe diese beiden Befehle im Stammverzeichnis des Projekts ausgeführt und es wurde behoben.
Leiten Sie die Ausgabe des Befehls "find" grundsätzlich in eine Textdatei um, die Sie als Liste der zu verarbeitenden Dateien verwenden können. Dann können Sie diese Textdatei mit dem Flag "@" in "mogrify" einlesen:
Das würde "find" verwenden, um alle * .png-Bilder, die neuer als 1 Tag sind, abzurufen und in eine Datei mit dem Namen "list.txt" zu drucken. Dann liest "mogrify" diese Liste, verarbeitet die Bilder und überschreibt die Originale mit den veränderten Versionen. Es kann geringfügige Unterschiede im Verhalten von "find" von einem System zum anderen geben, daher müssen Sie die Manpage auf die genaue Verwendung überprüfen.
quelle
Hier ist eine lächerlich brutale Antwort:
Ich habe das Gradlew-Skript geändert. Hier ist mein neuer Befehl exec am Ende der Datei in der
quelle