avviso libpng: iCCP: profilo sRGB errato noto


173

Sto cercando di caricare un'immagine PNG usando SDL ma il programma non funziona e questo errore appare nella console

avviso libpng: iCCP: profilo sRGB errato noto

Perché appare questo avviso? Cosa devo fare per risolvere questo problema?



Risposte:


180

Libpng-1.6 è più rigoroso nel controllare i profili ICC rispetto alle versioni precedenti. Puoi ignorare l'avvertimento. Per sbarazzartene, rimuovi il blocco iCCP dall'immagine PNG.

Alcune applicazioni considerano gli avvisi come errori; se si utilizza un'applicazione del genere, è necessario rimuovere il blocco. Puoi farlo con uno qualsiasi dei vari editor di PNG come ImageMagick

convert in.png out.png

Per rimuovere il blocco iCCP non valido da tutti i file PNG in una cartella (directory), è possibile utilizzare mogrifyda ImageMagick:

mogrify *.png

Ciò richiede che ImageMagick sia stato creato con libpng16. Puoi verificarlo facilmente eseguendo:

convert -list format | grep PNG

Se desideri scoprire quali file devono essere riparati anziché elaborarli alla cieca, puoi eseguirli

pngcrush -n -q *.png

dove i -nmezzi non riscrivono i file e -qsignificano sopprimere la maggior parte dell'output tranne che per gli avvisi. Siamo spiacenti, non esiste ancora alcuna opzione in pngcrush per eliminare tutto tranne gli avvisi.


Le versioni binarie di ImageMagick sono qui


Per i progetti Android (Android Studio) navigare nella rescartella.

Per esempio:

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

13
Con ImageMagick è possibile utilizzare il comando -strip . In particolare, ho usato il mogrify per influenzare tutte le immagini in una cartella. Il mio comando era simile al seguente: mogrify -strip * .png
Maxito

24
L'opzione -strip rimuoverà tutti i profili. Se si omette l'opzione -strip ( mogrify * .png ), verranno eliminati solo i profili errati.
Glenn Randers-Pehrson,

2
C'è un modo per scoprire quale file sta attivando l'avviso? L'esecuzione mogrify **/*.pngsembra modificare tutti i file nella struttura. Preferirei aggiornare solo l'immagine difettosa.
Uflex,

1
Utilizzare find . -type f -name '*.png' -execute mogrify \{\} \;per modificare in modo ricorsivo i .pngfile nella directory corrente.
dice Val Reinstate Monica il

I binari di ImageMagick hanno bloccato il mio computer, forse per aver lavorato troppo duramente, e dopo essere partito durante la notte, ho dovuto riavviare forzatamente. Utilizzato l'applicazione pngcrush per rilevare il problema come menzionato, -owper sovrascrivere e correggere il file e anche ridurre la dimensione di circa 1/6! Dovevo solo ottenere il codice sorgente del programma per il mio mac, compilare, installare manualmente ed eseguirlo. GitHub Kjuly / pngcrush potrebbe avere un binario precompilato, ma non ne sono sicuro. Sourceforge sembrava avere solo Windows exe disponibile e il codice sorgente. La risposta di friederbluemle sembra fare questo e altro.
Pysis il

73

Utilizzare pngcrushper rimuovere il profilo sRGB errato dal file png:

pngcrush -ow -rem allb -reduce file.png
  • -ow sovrascriverà il file di input
  • -rem allb rimuoverà tutti i pezzi ausiliari tranne tRNS e gAMA
  • -reduce riduce il tipo di colore senza perdita o la profondità di bit

Nell'output della console dovresti vedere Removed the sRGB chunk, e possibilmente più messaggi sulla rimozione dei blocchi. Ti ritroverai con un file PNG più piccolo e ottimizzato. Poiché il comando sovrascriverà il file originale, assicurarsi di creare un backup o utilizzare il controllo versione.


7
Ha funzionato! Fallo ricorsivamente dalla cartella corrente inseriscilo in un file .bat: Per / R %% i in (* .png) esegui PNGCRUSH.EXE -ow -rem allb -reduce %% i
Andy Brice,

13
E un one-liner per * nix per correggere ricorsivamente tutti i file png nella directory corrente: find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;(Testato su GNU / Linux)
friederbluemle,

2
Sopra la linea di Frieder funziona anche con Git Bash su Windows.
iKlsR

Pngcrush non rimuove questo pezzo nel mio caso. Ma la mogrifia di imagemagick l'ha fatto.
Nikos,

25

Soluzione

Il profilo errato potrebbe essere corretto da:

  1. Apertura dell'immagine con il profilo errato usando QPixmap :: load
  2. Salvataggio dell'immagine sul disco (già con il profilo corretto) usando QPixmap :: save

Nota: questa soluzione utilizza la libreria Qt .

Esempio

Ecco un esempio minimo che ho scritto in C ++ per dimostrare come implementare la soluzione proposta:

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

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

Il codice sorgente completo di un'applicazione GUI basato su questo esempio è disponibile su GitHub .

AGGIORNAMENTO DAL 05.12.2019: la risposta è stata ed è ancora valida, tuttavia si è verificato un errore nell'applicazione GUI che ho condiviso su GitHub, causando il vuoto dell'immagine di output. L'ho appena risolto e mi scuso per l'inconveniente!


4
Sono sorpreso che questa risposta non sia stata votata. Non richiede installazione e funziona ... cosa si può chiedere di più :)
Quantuple,

17

Puoi anche risolvere questo problema in Photoshop ...

  1. Apri il tuo file .png.
  2. File -> Salva con nome e nella finestra di dialogo che si apre deseleziona "Profilo ICC: sRGB IEC61966-2.1"
  3. Deseleziona "Come copia".
  4. Salva con coraggio il tuo png originale.
  5. Continua con la tua vita sapendo che hai rimosso solo quel pezzetto di male dal mondo.

8

Per aggiungere alla grande risposta di Glenn, ecco cosa ho fatto per scoprire quali file erano difettosi:

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

Ho usato find e xargs perché pngcrush non è in grado di gestire molti argomenti (che sono stati restituiti da **/*.png). L' -print0e -0è necessario per i nomi di file contenenti spazi manico.

Quindi cercare in uscita per queste linee: 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

E per ognuno di questi, corri su di esso per risolverli.

mogrify ./Installer/Images/installer_background.png

In questo modo si evita che un commit cambi ogni singolo file png nel repository quando solo pochi sono stati effettivamente modificati. Inoltre ha il vantaggio di mostrare esattamente quali file erano difettosi.

Ho provato questo su Windows con una console Cygwin e una shell zsh. Grazie ancora a Glenn che ha inserito la maggior parte di quanto sopra, sto solo aggiungendo una risposta in quanto di solito è più facile da trovare dei commenti :)


3
Su Debian, per trovare i file problematici nel mio software, ho usato find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;Ogni PNG errato genereràpngcrush: iCCP: known incorrect sRGB profile
Gabriel Devillers,

7

Grazie alla fantastica risposta di Glenn , ho usato la funzionalità "mogrify * .png" di ImageMagik . Tuttavia, avevo delle immagini sepolte in sottocartelle, quindi ho usato questo semplice script Python per applicarlo a tutte le immagini in tutte le sottocartelle e ho pensato che potesse aiutare gli altri:

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
Questo è ben multipiattaforma, anche se se sei su una piattaforma che supporta una bella shell * NIX-y come Zsh o Bash, puoi semplicemente usare mogrify **/*.png.
Kyle Strand,

1
Sì, buon punto. Ho usato Python solo perché sviluppiamo su Windows e Linux e volevo affidare questo script al nostro repository per un uso futuro.
Devan Williams,

5

C'è un modo più semplice per risolvere questo problema con Mac OS e Homebrew:

Installa homebrew se non è ancora installato

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

o per farlo con tutti i file nella directory corrente:

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

Creerà una copia fissa per ogni file png nella directory corrente e lo inserirà nella sottodirectory tmp. Dopodiché, se tutto va bene, devi solo sovrascrivere i file originali.

Un altro suggerimento è utilizzare le applicazioni Keynote e Anteprima per creare le icone. Li disegno usando Keynote, delle dimensioni di circa 120x120 pixel, su una diapositiva con uno sfondo bianco (l'opzione per rendere modificabili i poligoni è fantastica!). Prima di esportare in Anteprima, disegno un rettangolo attorno all'icona (senza alcun riempimento o ombra, solo il contorno, con le dimensioni di circa 135x135) e copio tutto negli appunti. Dopodiché, devi solo aprirlo con lo strumento Anteprima usando "Nuovo dagli Appunti", selezionare un'area di 128x128 pixel intorno all'icona, copiare, utilizzare di nuovo "Nuovo dagli Appunti" ed esportarlo in PNG. Non è necessario eseguire lo strumento pngfix.


1
Non ho trovato pngfix nell'installazione standard di El Capitan (o forse non ho cercato abbastanza bene), ma l'ho trovato nell'installazione MAMP che avevo. Ha funzionato perfettamente! Grazie! Votato
guido

Hai ragione! L'ho installato con "brew install libpng" molto tempo fa.
Adriel Jr

Ho ottenuto "n! Ew ERR 08 letto Undefined_error: _0 Undefined_error: _0 not_a_PNG_ (too_short) car.png" quando eseguo questo su 10.13.2.
Mitch,

@Mitch funziona ancora bene dopo l'aggiornamento a 10.13.6.
Adriel Jr,

4

Dopo aver provato un paio di suggerimenti in questa pagina ho finito per usare la soluzione pngcrush. Puoi usare lo script bash di seguito per rilevare ricorsivamente e correggere profili png errati. Basta passare il percorso completo alla directory che si desidera cercare i file png.

fixpng "/path/to/png/folder"

Il copione:

#!/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
Questo merita più voti. Tutte le altre soluzioni toccano ogni file, il che è particolarmente negativo se si hanno molte immagini in un sistema di controllo della versione. Grazie per la sceneggiatura!
kfunk,

Ho pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8ma il mio pngcrush non ha -warn-reduceflag, quindi questa soluzione non funziona.
pbhj,

4

alcune informazioni di base su questo:

Alcune modifiche nella versione 1.6+ di libpng causano un avviso o addirittura non funzionano correttamente con il profilo sRGB HP / MS originale, portando al seguente standard: avviso libpng: iCCP: noto profilo sRGB errato Il vecchio profilo utilizza un punto bianco D50, dove D65 è standard. Questo profilo non è insolito, essendo utilizzato da Adobe Photoshop, sebbene non sia stato incorporato nelle immagini per impostazione predefinita.

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

Il rilevamento degli errori in alcuni blocchi è migliorato; in particolare il lettore di blocchi iCCP ora esegue una validazione abbastanza completa del formato di base. Alcuni profili errati precedentemente accettati vengono ora rifiutati, in particolare il vecchio profilo sRGB Microsoft / HP non funzionante. Il requisito delle specifiche PNG secondo cui solo i profili in scala di grigi possono apparire nelle immagini con tipo di colore 0 o 4 e che anche se l'immagine contiene solo pixel grigi, ora vengono visualizzati solo i profili RGB nelle immagini con tipo di colore 2, 3 o 6. Il pezzo sRGB può apparire nelle immagini con qualsiasi tipo di colore.

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


3

Usando il visualizzatore di immagini IrfanView in Windows, ho semplicemente salvato l'immagine PNG e questo ha corretto il problema.


1

Estendendo la soluzione friederbluemle, scarica pngcrush e usa il codice in questo modo se lo stai eseguendo su più file 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)

qui tutti i file png relativi ai progetti sono in 1 cartella.


0

Ho eseguito quei due comandi nella radice del progetto ed è stato risolto.

Fondamentalmente reindirizzare l'output del comando "trova" su un file di testo da utilizzare come elenco di file da elaborare. Quindi puoi leggere quel file di testo in "mogrify" usando il flag "@":

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

mogrify -resize 50% @ list.txt

Quello userebbe "trova" per ottenere tutte le immagini * .png più recenti di 1 giorno e stamparle su un file chiamato "list.txt". Quindi "mogrify" legge quell'elenco, elabora le immagini e sovrascrive gli originali con le versioni ridimensionate. Potrebbero esserci delle lievi differenze nel comportamento di "trova" da un sistema all'altro, quindi dovrai controllare la pagina man per l'uso esatto.


-2

Ecco una risposta ridicolmente bruta:

Ho modificato lo script gradlew. Ecco il mio nuovo comando exec alla fine del file in

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.