advertencia de libpng: iCCP: perfil sRGB incorrecto conocido


173

Estoy tratando de cargar una imagen PNG usando SDL pero el programa no funciona y este error aparece en la consola

advertencia de libpng: iCCP: perfil sRGB incorrecto conocido

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



Respuestas:


180

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 PNG, como ImageMagick's

convert in.png out.png

Para eliminar el fragmento de iCCP no válido de todos los archivos PNG en una carpeta (directorio), puede usarlo mogrifydesde ImageMagick:

mogrify *.png

Esto requiere que su ImageMagick se haya creado con libpng16. Puede verificarlo fácilmente ejecutando:

convert -list format | grep PNG

Si desea averiguar qué archivos deben corregirse en lugar de procesarlos a ciegas, puede ejecutar

pngcrush -n -q *.png

donde los -nmedios no reescriben los archivos y -qsignifica 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 rescarpeta.

Por ejemplo:

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

13
Con ImageMagick puedes usar el comando -strip . Específicamente, usé mogrify para afectar todas las imágenes en una carpeta. Mi comando se veía así: mogrify -strip * .png
Maxito

24
La opción -strip eliminará todos los perfiles. Si omite la opción -strip ( mogrify * .png ), solo se eliminarán los perfiles incorrectos.
Glenn Randers-Pehrson el

2
¿Hay alguna forma de averiguar qué archivo está activando la advertencia? La ejecución mogrify **/*.pngparece modificar todos los archivos del árbol. Preferiría actualizar solo la imagen defectuosa.
Uflex

1
Use find . -type f -name '*.png' -execute mogrify \{\} \;para modificar recursivamente .pngarchivos en el directorio actual.
Val dice Reinstate Monica

Los binarios de ImageMagick congelaron mi computadora, tal vez por trabajar demasiado duro, y después de salir durante la noche, tuve que reiniciar con fuerza. ¡Utilicé la aplicación pngcrush para detectar el problema como se mencionó, -owpara sobrescribir y corregir el archivo, y también reduje el tamaño en aproximadamente 1/6! Solo tenía que obtener el código fuente del programa para mi mac, compilarlo, instalarlo manualmente y ejecutarlo. GitHub Kjuly / pngcrush podría tener un binario precompilado, pero no estoy seguro. Sourceforge solo parecía tener el exe de Windows disponible y el código fuente. La respuesta de Friederbluemle parece hacer esto y más.
Pysis

73

Use pngcrushpara 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 auxiliares excepto tRNS y gAMA
  • -reduce hace una reducción sin pérdida de color o profundidad de bits

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


77
¡Eso funciono! Hazlo de forma recursiva desde la carpeta actual, pon esto en un archivo .bat: Para / R %% i en (* .png) haz PNGCRUSH.EXE -ow -rem allb -reduce %% i
Andy Brice

13
Y una línea para * nix para reparar recursivamente todos los archivos png en el directorio actual: find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;(Probado en GNU / Linux)
friederbluemle

2
La línea de arriba de frieder también funciona dentro de git bash en ventanas.
iKlsR

Pngcrush no elimina este fragmento en mi caso. Pero la magia de imagemagick lo hizo.
Nikos

25

Solución

El perfil incorrecto podría repararse mediante:

  1. Abrir la imagen con el perfil incorrecto usando QPixmap :: load
  2. Guardar la imagen nuevamente en el disco (ya con el perfil correcto) usando QPixmap :: save

Nota: Esta solución usa la Biblioteca Qt .

Ejemplo

Aquí hay un ejemplo mínimo que he escrito en C ++ para demostrar cómo implementar la solución propuesta:

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

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

El código fuente completo de una aplicación GUI basada en este ejemplo está disponible en GitHub .

ACTUALIZACIÓN DESDE 05.12.2019: La respuesta fue y sigue siendo válida, sin embargo, hubo un error en la aplicación GUI que he compartido en GitHub, lo que provocó que la imagen de salida estuviera vacía. ¡Lo acabo de arreglar y me disculpo por las molestias!


44
Me sorprende que esta respuesta no haya sido votada. No requiere instalar nada y funciona ... ¿qué más se puede pedir :)
Quantuple

17

También puedes arreglar esto en Photoshop ...

  1. Abre tu archivo .png.
  2. Archivo -> Guardar como y en el cuadro de diálogo que se abre, desmarque "Perfil ICC: sRGB IEC61966-2.1"
  3. Desmarca "Como copia".
  4. Valientemente guarde sobre su .png original.
  5. Continúa con tu vida sabiendo que has eliminado solo ese poquito de maldad del mundo.

8

Para agregar a la gran respuesta de Glenn, esto es lo que hice para encontrar qué archivos estaban defectuosos:

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

Utilicé find y xargs porque pngcrush no podía manejar muchos argumentos (que fueron devueltos por **/*.png). El -print0y -0se requiere para manejar nombres de archivos que contienen espacios.

A continuación, busque en la salida de estas líneas: 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

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

mogrify ./Installer/Images/installer_background.png

Hacer esto evita que una confirmación cambie todos los archivos png del repositorio cuando solo unos pocos hayan sido modificados. Además, tiene la ventaja de mostrar exactamente qué archivos estaban defectuosos.

Probé esto en Windows con una consola Cygwin y un shell zsh. Gracias de nuevo a Glenn que 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 :)


3
En Debian, para encontrar los archivos que eran problemáticos en mi software, utilicé find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;Cada PNG erróneo generarápngcrush: iCCP: known incorrect sRGB profile
Gabriel Devillers

7

Gracias a la fantástica respuesta de Glenn , utilicé la funcionalidad "mogrify * .png" de ImageMagik . Sin embargo, tenía imágenes enterradas en subcarpetas, así que utilicé este simple script 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)

2
Esto es agradablemente multiplataforma, aunque si está en una plataforma que admite un agradable * NIX-y shell como Zsh o Bash, puede usarlo mogrify **/*.png.
Kyle Strand

1
Si, buen punto. Solo usé Python porque desarrollamos en Windows y Linux y quería comprometer este script en nuestro repositorio para uso futuro.
Devan Williams

5

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

Instale homebrew si aún no está instalado

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

o 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 necesita 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 120x120 píxeles, sobre una diapositiva con un fondo blanco (¡la opción de hacer polígonos editables es genial!). Antes de exportar a Vista previa, dibujo un rectángulo alrededor del icono (sin relleno ni sombra, solo el contorno, con un tamaño de aproximadamente 135x135) y copio todo al portapapeles. Después de eso, solo necesita abrirlo con la herramienta Vista previa usando "Nuevo del portapapeles", seleccionar un área de 128x128 píxeles alrededor del icono, copiar, usar "Nuevo del portapapeles" nuevamente y exportarlo a PNG. No necesitará ejecutar la herramienta pngfix.


1
No encontré pngfix en la instalación estándar de El Capitan del sistema operativo (o tal vez no busqué lo suficientemente bien), pero lo encontré en la instalación de MAMP que tenía. Funcionó perfectamente! ¡Gracias! Upvoted
guido

¡Tienes razón! Lo instalé con "brew install libpng" hace mucho tiempo.
Adriel Jr

Obtuve "n! Ew ERR 08 read Undefined_error: _0 Undefined_error: _0 not_a_PNG_ (too_short) car.png" al ejecutar esto en 10.13.2.
Mitch

@Mitch Aún funciona bien después de actualizar a 10.13.6.
Adriel Jr

4

Después de probar un par de sugerencias en esta página, terminé usando la solución pngcrush. Puede usar el script bash a continuación para detectar y corregir de forma recursiva los malos perfiles png. Simplemente páselo por la ruta completa al directorio en el que desea buscar 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"

2
Esto merece más votos a favor. Todas las demás soluciones tocan cada archivo, lo que es especialmente malo si tiene muchas imágenes en un sistema de control de versiones. Gracias por el guion!
kfunk

Tengo pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8pero mi pngcrush no tiene -warnni -reducebanderas, por lo que esta solución no funciona.
pbhj

4

alguna información de fondo sobre esto:

Algunos cambios en libpng versión 1.6+ hacen que emita una advertencia o que incluso no funcione correctamente con el perfil sRGB original de HP / MS, lo que lleva a la siguiente advertencia de 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, ya que Adobe Photoshop lo utiliza, aunque no está incrustado 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 sRGB de Microsoft / HP roto. Ahora se aplica el requisito de especificación PNG de que solo los perfiles en escala de grises pueden aparecer en imágenes con tipo de color 0 o 4 y que incluso si la imagen solo contiene píxeles grises, solo pueden aparecer perfiles RGB en imágenes con tipo de color 2, 3 o 6. 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 )


3

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


1

Extendiendo la solución friederbluemle, descargue pngcrush y luego use el código como este si lo está ejecutando en múltiples archivos 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)

aquí todos los archivos png relacionados con proyectos están en 1 carpeta.


0

Ejecuté esos dos comandos en la raíz del proyecto y está arreglado.

Básicamente redirige la salida del comando "buscar" a un archivo de texto para usar como tu lista de archivos para procesar. Luego puede leer ese archivo de texto en "mogrify" usando la bandera "@":

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

mogrify -resize 50% @ list.txt

Eso usaría "find" para obtener todas las imágenes * .png más recientes que 1 día e imprimirlas en un archivo llamado "list.txt". Luego, "mogrify" lee esa lista, procesa las imágenes y sobrescribe los originales con las versiones redimensionadas. Puede haber pequeñas diferencias en el comportamiento de "buscar" de un sistema a otro, por lo que deberá consultar la página del manual para conocer el uso exacto.


-2

Aquí hay una respuesta de fuerza bruta ridículamente:

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

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.