Advertencia libpng: iCCP: perfil sRGB incorrecto conocido

Estoy intentando cargar un archivo PNG usando SDL pero el progtwig no funciona y este error aparece en la consola

libpng warning: iCCP: perfil sRGB incorrecto conocido”

¿Por qué aparece esta advertencia? ¿Qué debo hacer para resolver este problema?

Libpng-1.6 es más estricto para verificar los perfiles ICC que las versiones anteriores. Puedes ignorar la advertencia. Para deshacerse de él, elimine el fragmento iCCP de la imagen PNG.

Algunas aplicaciones tratan las advertencias como errores; si está utilizando una aplicación de este tipo, debe eliminar el fragmento. Puede hacerlo con cualquiera de una variedad de editores de PNG, como ImageMagick’s convert in.png out.png .

Para eliminar el fragmento iCCP no válido de todos los archivos PNG en una carpeta (directorio), puede usar mogrify *.png ImageMagick, siempre que su ImageMagick se haya creado con libpng16 (ejecute el convert -list format | grep PNG para asegurarse de que )

Si desea averiguar qué archivos deben pngcrush -n -q *.png lugar de procesarlos a ciegas, puede ejecutar mi pngcrush -n -q *.png donde ” -n ” significa que no reescribe los archivos y ” -q “significa suprimir la mayor parte de la salida excepto las advertencias. Lo sentimos, todavía no hay una opción en pngcrush para suprimir todo excepto las advertencias.


Las versiones binarias de ImageMagick están aquí


Para proyectos de Android (Android Studio) navegue a la carpeta res.

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

Use pngcrush para eliminar el perfil sRGB incorrecto del archivo png:

 pngcrush -ow -rem allb -reduce file.png 
  • -ow sobrescribirá el archivo de entrada
  • -rem allb eliminará todos los fragmentos secundarios excepto tRNS y gAMA
  • -reduce tipo de color sin pérdida o la profundidad de bits

En la salida de la consola, debería ver Removed the sRGB chunk. , y posiblemente más mensajes sobre eliminaciones de fragmentos. Usted terminará con un archivo png optimizado y más pequeño. Como el comando sobrescribirá el archivo original, asegúrese de crear una copia de seguridad o usar el control de la versión.

Otra opción simple para los progtwigdores que usan Qt y C ++ es escribir su propia pequeña utilidad en forma de Qt Widgets o aplicación de consola para arreglar el perfil:

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

Gracias a la fantástica respuesta de Glenn , utilicé la funcionalidad “mogrify * .png” de ImageMagik . Sin embargo, tenía imágenes ocultas en subcarpetas, así que usé este script simple de Python para aplicar esto a todas las imágenes en todas las subcarpetas y pensé que podría ayudar a otros:

 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) 

También puedes arreglar esto en photoshop … Tengo CC2015 pero estoy seguro de que es el mismo para todas las versiones.

  1. Abra su archivo .png.
  2. Archivo -> Guardar como y en el cuadro de diálogo que se abre desmarque “Perfil ICC: sRGB IEC61966-2.1”
  3. Desmarque “Como una copia”.
  4. Ahorre valientemente sobre su .png original.
  5. Continúa con tu vida sabiendo que has eliminado del mundo ese pequeño mal.

Para agregar a la excelente respuesta de Glenn, esto es lo que hice para encontrar los archivos defectuosos:

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

Usé find y xargs porque pngcrush no podía manejar muchos argumentos (que fueron devueltos por **/*.png ). Se -print0 y -0 para manejar los nombres de archivo que contienen espacios.

A continuación, busque en el resultado de estas líneas: iCCP: Not recognizing known sRGB profile that has been edited .

./Installer/Images/installer_background.png:
Longitud total de los datos encontrados en fragmentos críticos = 11286
pngcrush: iCCP: no reconoce el perfil sRGB conocido que se ha editado

Y para cada uno de ellos, ejecute mogrify en él para arreglarlos.

 mogrify ./Installer/Images/installer_background.png 

Al hacer esto, se evita tener un commit cambiando cada archivo png en el repository cuando solo unos pocos han sido realmente modificados. Además, tiene la ventaja de mostrar exactamente qué archivos son defectuosos.

Probé esto en Windows con una consola Cygwin y un shell zsh. Gracias de nuevo a Glenn, quien puso la mayor parte de lo anterior, solo estoy agregando una respuesta, ya que generalmente es más fácil de encontrar que los comentarios 🙂

Hay una manera más fácil de solucionar este problema con Mac OS con Homebrew:

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

o para hacerlo con cada archivo en el directorio actual:

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

Creará una copia fija para cada archivo png en el directorio actual y lo colocará en el subdirectorio tmp. Después de eso, si todo está bien, solo tiene que anular los archivos originales.

Otro consejo es usar las aplicaciones Keynote y Preview para crear los íconos. Los dibujo usando Keynote, en el tamaño de aproximadamente 120×120 píxeles, sobre una diapositiva con un fondo blanco (¡la opción de hacer que los polígonos sean editables es genial!). Antes de exportar a Vista previa, dibujo un rectángulo alrededor del icono (sin ningún relleno o sombra, solo el contorno, con un tamaño de aproximadamente 135×135) y copio todo en el portapapeles. Después de eso, solo tiene que abrirlo con la herramienta Vista previa usando “Nuevo desde el portapapeles”, seleccionar un área de 128×128 píxeles alrededor del icono, copiar, usar “Nuevo desde portapapeles” nuevamente, y exportarlo a PNG. No necesitará ejecutar la herramienta pngfix.

Utilizando el visor de imágenes IrfanView en Windows, simplemente volví a guardar la imagen PNG y eso corrigió el problema.

alguna información de fondo sobre esto:

Algunos cambios en libpng versión 1.6+ hacen que emita una advertencia o incluso que no funcione correctamente con el perfil sRGB original de HP / MS, lo que lleva a la siguiente advertencia stderr: libpng: iCCP: perfil sRGB incorrecto conocido El perfil anterior usa un punto blanco D50 donde D65 es estándar. Este perfil no es infrecuente y lo utiliza Adobe Photoshop, aunque no estaba incorporado en las imágenes de forma predeterminada.

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

La detección de errores en algunos fragmentos ha mejorado; en particular, el lector de fragmentos iCCP ahora realiza una validación bastante completa del formato básico. Algunos perfiles defectuosos que se aceptaron anteriormente ahora se rechazan, en particular el muy viejo perfil roto sRGB de Microsoft / HP. El requisito de especificación PNG de que solo puedan aparecer perfiles de escala de grises en imágenes con color tipo 0 o 4 y que incluso si la imagen solo contiene píxeles grises, solo los perfiles RGB pueden aparecer en imágenes con color tipo 2, 3 o 6 ahora se aplica. El fragmento sRGB puede aparecer en imágenes con cualquier tipo de color.

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

Después de probar algunas de las sugerencias en esta página, terminé usando la solución pngcrush. Puede utilizar el script bash a continuación para detectar de forma recursiva y corregir los perfiles png incorrectos. Solo pásalo por la ruta completa al directorio en el que deseas buscar los archivos png.

 fixpng "/path/to/png/folder" 

La secuencia de comandos:

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

Aquí hay una respuesta de fuerza brutalmente ridícula:

Modifiqué el script de gradlew. Aquí está mi nuevo comando ejecutivo al final del archivo en el

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