avertissement libpng: iCCP: profil sRGB incorrect connu


173

J'essaye de charger une image PNG en utilisant SDL mais le programme ne fonctionne pas et cette erreur apparaît dans la console

avertissement libpng: iCCP: profil sRGB incorrect connu

Pourquoi cet avertissement apparaît-il? Que dois-je faire pour résoudre ce problème?



Réponses:


180

Libpng-1.6 est plus strict sur la vérification des profils ICC que les versions précédentes. Vous pouvez ignorer l'avertissement. Pour vous en débarrasser, supprimez le bloc iCCP de l'image PNG.

Certaines applications traitent les avertissements comme des erreurs; si vous utilisez une telle application, vous devez supprimer le bloc. Vous pouvez le faire avec l'un des nombreux éditeurs PNG tels que ImageMagick

convert in.png out.png

Pour supprimer le bloc iCCP non valide de tous les fichiers PNG d'un dossier (répertoire), vous pouvez utiliser à mogrifypartir d'ImageMagick:

mogrify *.png

Cela nécessite que votre ImageMagick ait été construit avec libpng16. Vous pouvez facilement le vérifier en exécutant:

convert -list format | grep PNG

Si vous souhaitez savoir quels fichiers doivent être corrigés au lieu de tous les traiter à l'aveugle, vous pouvez exécuter

pngcrush -n -q *.png

où les -nmoyens ne réécrivent pas les fichiers et -qsuppriment la plupart de la sortie, à l'exception des avertissements. Désolé, il n'y a pas encore d'option dans pngcrush pour supprimer tout sauf les avertissements.


Les versions binaires d'ImageMagick sont disponibles


Pour les projets Android (Android Studio), accédez au resdossier.

Par exemple:

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

13
Avec ImageMagick, vous pouvez utiliser la commande -strip . Plus précisément, j'ai utilisé mogrify pour affecter toutes les images d'un dossier. Ma commande ressemblait à ceci: mogrify -strip * .png
Maxito

24
L'option -strip supprimera tous les profils. Si vous omettez l'option -strip ( mogrify * .png ), seuls les profils incorrects seront supprimés.
Glenn Randers-Pehrson

2
Existe-t-il un moyen de savoir quel fichier déclenche l'avertissement? L'exécution mogrify **/*.pngsemble modifier tous les fichiers de l'arborescence. Je préférerais ne mettre à jour que la seule image défectueuse.
Uflex

1
Utilisez find . -type f -name '*.png' -execute mogrify \{\} \;pour modifier récursivement les .pngfichiers dans le répertoire courant.
val dit Réintégrer Monica le

Si les binaires ImageMagick avaient gelé mon ordinateur, peut-être parce qu'il travaillait trop dur, et après être parti pendant la nuit, ils ont dû redémarrer avec force. Utilisé l'application pngcrush pour détecter le problème comme mentionné, -owpour écraser et corriger le fichier, et également réduit la taille d'environ 1 / 6ème! Je devais juste obtenir le code source du programme pour mon mac, le compiler, l'installer manuellement et l'exécuter. GitHub Kjuly / pngcrush peut avoir un binaire précompilé, mais pas sûr. Sourceforge semblait n'avoir que les exe Windows disponibles et le code source. La réponse de friederbluemle semble faire cela et plus encore.
Pysis

73

Utilisez pngcrushpour supprimer le profil sRGB incorrect du fichier png:

pngcrush -ow -rem allb -reduce file.png
  • -ow écrasera le fichier d'entrée
  • -rem allb supprimera tous les morceaux auxiliaires sauf tRNS et gAMA
  • -reduce réduit le type de couleur ou la profondeur de bits sans perte

Dans la sortie de la console, vous devriez voir Removed the sRGB chunk, et peut-être plus de messages sur les suppressions de blocs. Vous vous retrouverez avec un fichier PNG plus petit et optimisé. Comme la commande écrasera le fichier d'origine, assurez-vous de créer une sauvegarde ou d'utiliser le contrôle de version.


7
Ça a marché! Faites-le de manière récursive à partir du dossier actuel, mettez-le dans un fichier .bat: Pour / R %% i dans (* .png) faites PNGCRUSH.EXE -ow -rem allb -reduce %% i
Andy Brice

13
Et un one-liner pour * nix pour corriger récursivement tous les fichiers png dans le répertoire actuel: find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;(Testé sur GNU / Linux)
friederbluemle

2
Au-dessus de la ligne de frieder fonctionne également dans git bash sur Windows.
iKlsR

Pngcrush ne supprime pas ce morceau dans mon cas. Mais la mogrifie d'imagemagick l'a fait.
Nikos

25

Solution

Le profil incorrect peut être corrigé par:

  1. Ouverture de l'image avec le profil incorrect à l'aide de QPixmap :: load
  2. Sauvegarde de l'image sur le disque (déjà avec le profil correct) à l'aide de QPixmap :: save

Remarque: cette solution utilise la bibliothèque Qt .

Exemple

Voici un exemple minimal que j'ai écrit en C ++ afin de démontrer comment implémenter la solution proposée:

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

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

Le code source complet d'une application GUI basée sur cet exemple est disponible sur GitHub .

MISE À JOUR DU 05.12.2019: La réponse était et est toujours valide, mais il y avait un bogue dans l'application GUI que j'ai partagée sur GitHub, rendant l'image de sortie vide. Je viens de le réparer et je m'excuse pour la gêne occasionnée!


4
Je suis surpris que cette réponse n'ait pas été votée. Cela ne nécessite rien d'installer et cela fonctionne ... que demander de plus :)
Quantuple

17

Vous pouvez également simplement résoudre ce problème dans Photoshop ...

  1. Ouvrez votre fichier .png.
  2. Fichier -> Enregistrer sous et dans la boîte de dialogue qui s'ouvre, décochez "Profil ICC: sRGB IEC61966-2.1"
  3. Décochez "En tant que copie".
  4. Sauvegardez courageusement votre fichier .png d'origine.
  5. Poursuivez votre vie en sachant que vous avez éliminé ce petit peu de mal du monde.

8

Pour ajouter à l'excellente réponse de Glenn, voici ce que j'ai fait pour trouver les fichiers défectueux:

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

J'ai utilisé la recherche et les xargs car pngcrush ne pouvait pas gérer beaucoup d'arguments (qui ont été retournés par **/*.png). Le -print0et -0est requis pour gérer les noms de fichiers contenant des espaces.

Ensuite , la recherche dans la sortie de ces lignes: 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

Et pour chacun de ceux-ci, exécutez mogrify dessus pour les réparer.

mogrify ./Installer/Images/installer_background.png

Cela évite qu'un commit ne modifie chaque fichier png dans le référentiel alors que seuls quelques-uns ont été modifiés. De plus, il a l'avantage de montrer exactement quels fichiers étaient défectueux.

J'ai testé cela sur Windows avec une console Cygwin et un shell zsh. Merci encore à Glenn qui a mis la plupart de ce qui précède, j'ajoute simplement une réponse car c'est généralement plus facile à trouver que les commentaires :)


3
Sur Debian, pour trouver les fichiers qui posaient problème dans mon logiciel, j'ai utilisé find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;Chaque PNG erroné générerapngcrush: iCCP: known incorrect sRGB profile
Gabriel Devillers

7

Grâce à la réponse fantastique de Glenn , j'ai utilisé la fonctionnalité "mogrify * .png" d' ImageMagik . Cependant, j'avais des images enterrées dans des sous-dossiers, alors j'ai utilisé ce simple script Python pour appliquer cela à toutes les images de tous les sous-dossiers et j'ai pensé que cela pourrait aider les autres:

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
C'est bien multiplateforme, mais si vous êtes sur une plate-forme qui prend en charge un joli shell * NIX-y tel que Zsh ou Bash, vous pouvez simplement utiliser mogrify **/*.png.
Kyle Strand

1
Ouais, bon point. Je n'ai utilisé Python que parce que nous développons sous Windows et Linux et que nous voulions valider ce script dans notre dépôt pour une utilisation future.
Devan Williams

5

Il existe un moyen plus simple de résoudre ce problème avec Mac OS et Homebrew:

Installez homebrew s'il n'est pas encore installé

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

ou pour le faire avec tous les fichiers du répertoire courant:

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

Il créera une copie fixe pour chaque fichier png dans le répertoire courant et le placera dans le sous-répertoire tmp. Après cela, si tout va bien, il vous suffit de remplacer les fichiers d'origine.

Une autre astuce consiste à utiliser les applications Keynote et Preview pour créer les icônes. Je les dessine à l'aide de Keynote, dans la taille d'environ 120x120 pixels, sur une diapositive avec un fond blanc (l'option de rendre les polygones modifiables est géniale!). Avant d'exporter vers Aperçu, je dessine un rectangle autour de l'icône (sans aucun remplissage ni ombre, juste le contour, d'une taille d'environ 135x135) et je copie le tout dans le presse-papiers. Après cela, il vous suffit de l'ouvrir avec l'outil de prévisualisation en utilisant "Nouveau depuis le Presse-papiers", de sélectionner une zone de 128x128 pixels autour de l'icône, de copier, d'utiliser à nouveau "Nouveau depuis le Presse-papiers" et de l'exporter au format PNG. Vous n'aurez pas besoin d'exécuter l'outil pngfix.


1
Je n'ai pas trouvé pngfix dans l'installation standard de l'OS El Capitan (ou peut-être que je n'ai pas assez bien cherché), mais je l'ai trouvé dans l'installation MAMP que j'avais. A parfaitement fonctionné! Merci! Vote positif
guido

Vous avez raison! Je l'ai installé avec "brew install libpng" il y a longtemps.
Adriel Jr

J'ai eu "n! Ew ERR 08 lu Undefined_error: _0 Undefined_error: _0 not_a_PNG_ (too_short) car.png" lors de l'exécution de ceci sur 10.13.2.
Mitch

@Mitch fonctionne toujours correctement après la mise à niveau vers 10.13.6.
Adriel Jr

4

Après avoir essayé quelques suggestions sur cette page, j'ai fini par utiliser la solution pngcrush. Vous pouvez utiliser le script bash ci-dessous pour détecter et corriger de manière récursive les mauvais profils png. Passez-lui simplement le chemin complet du répertoire dans lequel vous souhaitez rechercher les fichiers png.

fixpng "/path/to/png/folder"

Le scénario:

#!/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
Cela mérite plus de votes positifs. Toutes les autres solutions touchent chaque fichier, ce qui est particulièrement mauvais si vous avez beaucoup d'images dans un système de contrôle de version. Merci pour le script!
kfunk

J'ai pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8mais mon pngcrush n'a -warnni -reducedrapeaux, donc cette solution ne fonctionne pas.
pbhj

4

quelques informations générales à ce sujet:

Certains changements dans la version 1.6+ de libpng provoquent un avertissement ou même un fonctionnement incorrect avec le profil HP / MS sRGB d'origine, conduisant à l'avertissement suivant: stderr: libpng: iCCP: profil sRGB incorrect connu L'ancien profil utilise un point blanc D50, où D65 est standard. Ce profil n'est pas rare, étant utilisé par Adobe Photoshop, bien qu'il n'ait pas été intégré dans les images par défaut.

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

La détection d'erreurs dans certains segments s'est améliorée; en particulier, le lecteur de blocs iCCP effectue maintenant une validation assez complète du format de base. Certains mauvais profils précédemment acceptés sont désormais rejetés, en particulier le très ancien profil Microsoft / HP sRGB cassé. La spécification PNG exigeant que seuls les profils en niveaux de gris puissent apparaître dans les images de type de couleur 0 ou 4 et que même si l'image ne contient que des pixels gris, seuls les profils RVB peuvent apparaître dans les images de type de couleur 2, 3 ou 6, est désormais appliquée. Le bloc sRGB est autorisé à apparaître dans les images avec n'importe quel type de couleur.

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


3

En utilisant la visionneuse d'images IrfanView sous Windows, j'ai simplement réenregistré l'image PNG et cela a corrigé le problème.


1

Extension de la solution friederbluemle, téléchargez le pngcrush puis utilisez le code comme celui-ci si vous l'exécutez sur plusieurs fichiers 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)

ici tous les fichiers png liés aux projets sont dans 1 dossier.


0

J'ai exécuté ces deux commandes à la racine du projet et son correctif.

En gros, redirigez la sortie de la commande "find" vers un fichier texte à utiliser comme liste de fichiers à traiter. Ensuite, vous pouvez lire ce fichier texte dans "mogrify" en utilisant le drapeau "@":

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

mogrify -resize 50% @ list.txt

Cela utiliserait "find" pour obtenir toutes les images * .png plus récentes que 1 jour et les imprimer dans un fichier nommé "list.txt". Puis «mogrify» lit cette liste, traite les images et écrase les originaux avec les versions redimensionnées. Il peut y avoir des différences mineures dans le comportement de "find" d'un système à un autre, vous devrez donc consulter la page de manuel pour connaître l'utilisation exacte.


-2

Voici une réponse ridiculement brutale:

J'ai modifié le script gradlew. Voici ma nouvelle commande exec à la fin du fichier dans le

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.