libpng-Warnung: iCCP: Bekanntes falsches sRGB-Profil

173

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?

rkarami
quelle

Antworten:

180

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

convert in.png out.png

Um den ungültigen iCCP-Block aus allen PNG-Dateien in einem Ordner (Verzeichnis) zu entfernen, können Sie Folgendes in mogrifyImageMagick verwenden:

mogrify *.png

Dies setzt voraus, dass Ihr ImageMagick mit libpng16 erstellt wurde. Sie können es einfach überprüfen, indem Sie Folgendes ausführen:

convert -list format | grep PNG

Wenn Sie herausfinden möchten, welche Dateien repariert werden müssen, anstatt alle blind zu verarbeiten, können Sie sie ausführen

pngcrush -n -q *.png

Wobei die -nMittel die Dateien nicht neu schreiben und -qdie 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 resOrdner.

Beispielsweise:

C:\{your_project_folder}\app\src\main\res\drawable-hdpi\mogrify *.png
Glenn Randers-Pehrson
quelle
13
Mit ImageMagick können Sie den Befehl -strip verwenden . Insbesondere habe ich mogrify verwendet , um alle Bilder in einem Ordner zu beeinflussen. Mein Befehl sah folgendermaßen aus: mogrify -strip * .png
Maxito
24
Mit der Option -strip werden alle Profile entfernt. Wenn Sie die Option -strip ( mogrify * .png ) weglassen , werden nur falsche Profile gelöscht.
Glenn Randers-Pehrson
2
Gibt es eine Möglichkeit herauszufinden, welche Datei die Warnung auslöst? Das Ausführen mogrify **/*.pngscheint alle Dateien im Baum zu ändern. Ich würde es vorziehen, nur das eine fehlerhafte Bild zu aktualisieren.
Uflex
1
Verwenden Sie find . -type f -name '*.png' -execute mogrify \{\} \;diese Option, um .pngDateien im aktuellen Verzeichnis rekursiv zu ändern .
Val sagt Reinstate Monica
Hatten die ImageMagick-Binärdateien meinen Computer eingefroren, möglicherweise weil sie zu hart gearbeitet hatten, und mussten sie nach dem Verlassen über Nacht gewaltsam neu gestartet werden. Verwendete die pngcrush-Anwendung, um das erwähnte Problem zu erkennen, -owdie 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.
Pysis
73

Verwenden Sie pngcrushdiese Option , um das falsche sRGB-Profil aus der PNG-Datei zu entfernen:

pngcrush -ow -rem allb -reduce file.png
  • -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 durch

In der Konsolenausgabe sollten Sie Removed the sRGB chunkmö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.

friederbluemle
quelle
7
Das hat funktioniert! Machen Sie es rekursiv aus dem aktuellen Ordner und fügen Sie dies in eine .bat-Datei ein: Für / R %% i in (* .png) tun Sie PNGCRUSH.EXE -ow -rem allb -reduce %% i
Andy Brice
13
Und ein Einzeiler für * nix, um alle PNG-Dateien im aktuellen Verzeichnis rekursiv zu reparieren: find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;(Getestet unter GNU / Linux)
friederbluemle
2
Die obige Zeile von Frieder funktioniert auch in Git Bash an Fenstern.
iKlsR
Pngcrush entfernt diesen Block in meinem Fall nicht. Aber Imagemagicks Mogrify hat es geschafft.
Nikos
25

Lösung

Das falsche Profil könnte behoben werden durch:

  1. Öffnen des Bildes mit dem falschen Profil mit QPixmap :: load
  2. Speichern Sie das Image mit QPixmap :: save auf der Festplatte (bereits mit dem richtigen Profil)

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:

QPixmap pixmap;
pixmap.load("badProfileImage.png");

QFile file("goodProfileImage.png");
file.open(QIODevice::WriteOnly);
pixmap.save(&file, "PNG");

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!

scopchanov
quelle
4
Ich bin überrascht, dass diese Antwort nicht positiv bewertet wurde. Es erfordert keine Installation und es funktioniert ... was kann man mehr verlangen :)
Quantuple
17

Sie können dies auch einfach in Photoshop beheben ...

  1. Öffnen Sie Ihre PNG-Datei.
  2. Datei -> Speichern unter und deaktivieren Sie im daraufhin angezeigten Dialogfeld "ICC-Profil: sRGB IEC61966-2.1".
  3. Deaktivieren Sie "Als Kopie".
  4. Speichern Sie mutig über Ihre ursprüngliche .png.
  5. Fahren Sie mit Ihrem Leben fort und wissen Sie, dass Sie nur ein bisschen Böses von der Welt entfernt haben.
Spencer
quelle
8

Um Glenns großartige Antwort zu ergänzen, habe ich Folgendes getan, um herauszufinden, 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 habe find und xargs verwendet, weil pngcrush nicht viele Argumente verarbeiten konnte (die von zurückgegeben wurden **/*.png). Das -print0und-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.

./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 diesen führen Sie mogrify darauf aus, um sie zu beheben.

mogrify ./Installer/Images/installer_background.png

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 :)

Uflex
quelle
3
Auf Debian, um die Dateien zu finden, die in meiner Software problematisch waren, habe ich verwendet. find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;Jedes fehlerhafte PNG wird generiertpngcrush: iCCP: known incorrect sRGB profile
Gabriel Devillers
7

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:

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)
Devan Williams
quelle
2
Dies ist sehr plattformübergreifend. Wenn Sie sich jedoch auf einer Plattform befinden, die eine nette * NIX-y-Shell wie Zsh oder Bash unterstützt, können Sie diese einfach verwenden mogrify **/*.png.
Kyle Strand
1
Ja, guter Punkt. Ich habe Python nur verwendet, weil wir unter Windows und Linux entwickelt haben und dieses Skript für die zukünftige Verwendung in unser Repo übernehmen wollten.
Devan Williams
5

Es gibt eine einfachere Möglichkeit, dieses Problem mit Mac OS und Homebrew zu beheben:

Installieren Sie Homebrew, falls es noch nicht installiert ist

$brew install libpng
$pngfix --strip=color --out=file2.png file.png

oder um 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 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.

Adriel Jr.
quelle
1
Ich habe pngfix in der Standardinstallation von OS El Capitan nicht gefunden (oder vielleicht habe ich nicht gut genug gesucht), aber ich habe es in der MAMP-Installation gefunden, die ich hatte. Hat perfekt funktioniert! Vielen Dank! Upvoted
Guido
Sie haben Recht! Ich habe es vor langer Zeit mit "Brew Install Libpng" installiert.
Adriel Jr
Ich habe "n! Ew ERR 08 read Undefined_error: _0 Undefined_error: _0 not_a_PNG_ (too_short) car.png" erhalten, als dies am 10.13.2 ausgeführt wurde.
Mitch
@Mitch läuft nach dem Upgrade auf 10.13.6 immer noch in Ordnung.
Adriel Jr.
4

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.

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"
Gülle
quelle
2
Dies verdient mehr Gegenstimmen. Alle anderen Lösungen berühren jede Datei, was besonders schlecht ist, wenn Sie viele Bilder in einem Versionskontrollsystem haben. Danke für das Drehbuch!
Funk
Ich habe pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8aber mein pngcrush hat noch -warnkeine -reduceFlags, so dass diese Lösung nicht funktioniert.
pbhj
4

Einige Hintergrundinformationen dazu:

Einige Änderungen in libpng Version 1.6+ führen dazu, dass eine Warnung ausgegeben wird oder sogar nicht richtig mit dem ursprünglichen HP / MS-sRGB-Profil funktioniert, was zu folgendem stderr führt: libpng-Warnung: iCCP: bekanntes falsches sRGB-Profil Das alte Profil verwendet einen D50-Weißpunkt. wo D65 Standard ist. Dieses Profil wird nicht selten von Adobe Photoshop verwendet, obwohl es standardmäßig nicht in Bilder eingebettet war.

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

Die Fehlererkennung in einigen Blöcken hat sich verbessert. Insbesondere der iCCP-Chunk-Reader überprüft das Grundformat jetzt ziemlich vollständig. Einige zuvor akzeptierte fehlerhafte Profile werden jetzt abgelehnt, insbesondere das sehr alte fehlerhafte Microsoft / HP sRGB-Profil. Die PNG-Spezifikationsanforderung, dass in Bildern mit Farbtyp 0 oder 4 nur Graustufenprofile angezeigt werden dürfen und dass, selbst wenn das Bild nur graue Pixel enthält, in Bildern mit Farbtyp 2, 3 oder 6 nur RGB-Profile angezeigt werden dürfen, wird jetzt erzwungen. Der sRGB-Block darf in Bildern mit einem beliebigen Farbtyp angezeigt werden.

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

George Birbilis
quelle
3

Mit dem IrfanView-Bildbetrachter in Windows habe ich das PNG-Bild einfach erneut gespeichert, wodurch das Problem behoben wurde.

Neil Roy
quelle
1

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

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)

Hier befinden sich alle PNG-Dateien, die sich auf Projekte beziehen, in einem Ordner.

sahasrara62
quelle
0

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:

find * .png -mtime -1> list.txt

mogrify -resize 50% @ list.txt

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.

Yadayada
quelle
-2

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

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