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:
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
Para eliminar el fragmento de iCCP no válido de todos los archivos PNG en una carpeta (directorio), puede usarlo
mogrify
desde ImageMagick:Esto requiere que su ImageMagick se haya creado con libpng16. Puede verificarlo fácilmente ejecutando:
Si desea averiguar qué archivos deben corregirse en lugar de procesarlos a ciegas, puede ejecutar
donde los
-n
medios no reescriben 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
res
carpeta.Por ejemplo:
fuente
mogrify **/*.png
parece modificar todos los archivos del árbol. Preferiría actualizar solo la imagen defectuosa.find . -type f -name '*.png' -execute mogrify \{\} \;
para modificar recursivamente.png
archivos en el directorio actual.-ow
para 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.Use
pngcrush
para eliminar el perfil sRGB incorrecto del archivo 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 bitsEn 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.fuente
find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;
(Probado en GNU / Linux)Solución
El perfil incorrecto podría repararse mediante:
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:
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!
fuente
También puedes arreglar esto en Photoshop ...
fuente
Para agregar a la gran respuesta de Glenn, esto es lo que hice para encontrar qué archivos estaban defectuosos:
Utilicé find y xargs porque pngcrush no podía manejar muchos argumentos (que fueron devueltos por
**/*.png
). El-print0
y-0
se 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
.Y para cada uno de ellos, ejecute mogrify en él para arreglarlos.
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 :)
fuente
find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;
Cada PNG erróneo generarápngcrush: iCCP: known incorrect sRGB profile
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:
fuente
mogrify **/*.png
.Hay una manera más fácil de solucionar este problema con Mac OS y Homebrew:
Instale homebrew si aún no está instalado
o hacerlo con cada archivo en el directorio actual:
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.
fuente
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.
La secuencia de comandos:
fuente
pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8
pero mi pngcrush no tiene-warn
ni-reduce
banderas, por lo que esta solución no funciona.alguna información de fondo sobre esto:
(fuente: https://wiki.archlinux.org/index.php/Libpng_errors )
(fuente: https://forum.qt.io/topic/58638/solved-libpng-warning-iccp-known-incorrect-srgb-profile-drive-me-nuts/16 )
fuente
Usando el visor de imágenes IrfanView en Windows, simplemente volví a guardar la imagen PNG y eso corrigió el problema.
fuente
Extendiendo la solución friederbluemle, descargue pngcrush y luego use el código como este si lo está ejecutando en múltiples archivos png
aquí todos los archivos png relacionados con proyectos están en 1 carpeta.
fuente
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 "@":
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.
fuente
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
fuente