libpng warning: iCCP: known incorrect sRGB profile
Libpng-1.6 is more stringent about checking ICC profiles than previous versions. You can ignore the warning. To get rid of it, remove the iCCP chunk from the PNG image.
Some applications treat warnings as errors; if you are using such an application you do have to remove the chunk. You can do that with any of a variety of PNG editors such as ImageMagick’s
To remove the invalid iCCP chunk from all of the PNG files in a folder (directory), you can use mogrify from ImageMagick:
This requires that your ImageMagick was built with libpng16. You can easily check it by running:
convert -list format | grep PNG
If you’d like to find out which files need to be fixed instead of blindly processing all of them, you can run
where the -n means don’t rewrite the files and -q means suppress most of the output except for warnings. Sorry, there’s no option yet in pngcrush to suppress everything but the warnings.
Binary Releases of ImageMagick are here
For Android Projects (Android Studio) navigate into res folder.
C:\\app\src\main\res\drawable-hdpi\mogrify *.png
Solution 2
Use pngcrush to remove the incorrect sRGB profile from the png file:
pngcrush -ow -rem allb -reduce file.png
- -ow will overwrite the input file
- -rem allb will remove all ancillary chunks except tRNS and gAMA
- -reduce does lossless color-type or bit-depth reduction
In the console output you should see Removed the sRGB chunk , and possibly more messages about chunk removals. You will end up with a smaller, optimized PNG file. As the command will overwrite the original file, make sure to create a backup or use version control.
Solution 3
Solution
The incorrect profile could be fixed by:
- Opening the image with the incorrect profile using QPixmap::load
- Saving the image back to the disk (already with the correct profile) using QPixmap::save
Note: This solution uses the Qt Library.
Example
Here is a minimal example I have written in C++ in order to demonstrate how to implement the proposed solution:
QPixmap pixmap; pixmap.load("badProfileImage.png"); QFile file("goodProfileImage.png"); file.open(QIODevice::WriteOnly); pixmap.save(&file, "PNG");
The complete source code of a GUI application based on this example is available on GitHub.
UPDATE FROM 05.12.2019: The answer was and is still valid, however there was a bug in the GUI application I have shared on GitHub, causing the output image to be empty. I have just fixed it and apologise for the inconvenience!
Solution 4
You can also just fix this in photoshop.
- Open your .png file.
- File -> Save As and in the dialog that opens up uncheck «ICC Profile: sRGB IEC61966-2.1»
- Uncheck «As a Copy».
- Courageously save over your original .png.
- Move on with your life knowing that you’ve removed just that little bit of evil from the world.
Solution 5
To add to Glenn’s great answer, here’s what I did to find which files were faulty:
find . -name "*.png" -type f -print0 | xargs \ -0 pngcrush_1_8_8_w64.exe -n -q > pngError.txt 2>&1
I used the find and xargs because pngcrush could not handle lots of arguments (which were returned by **/*.png ). The -print0 and -0 is required to handle file names containing spaces.
Then search in the output for these lines: 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
And for each of those, run mogrify on it to fix them.
mogrify ./Installer/Images/installer_background.png
Doing this prevents having a commit changing every single png file in the repository when only a few have actually been modified. Plus it has the advantage to show exactly which files were faulty.
I tested this on Windows with a Cygwin console and a zsh shell. Thanks again to Glenn who put most of the above, I’m just adding an answer as it’s usually easier to find than comments 🙂
предупреждение: libpng warning: iCCP: known incorrect sRGB profile
Почему эта предупреждение появляется что я должен сделать что бы решить эту проблему ??
Вопрос является переводом с английского , но честно сказать он мне понравился и я сам с такой проблемой столкнулся.
Ответы (3 шт):
ibpng-1.6 более жестко проверяет профили ICC, чем предыдущие. Вы можете игнорировать предупреждение. Чтобы избавиться от него, удалите кусок iCCP из изображения PNG.
Некоторые приложения (в моём случае OpenGL) рассматривают предупреждения как ошибки; если вы используете такое приложение, вам нужно удалить iCCP кусок из изображения PNG. Это можно сделать с помощью любого из множества редакторов PNG (по правде говоря стандартный paint в windows у меня не смог). Пример редактор ImageMagick’s : convert in.png out.png.
Что бы удалить дефектный кусок (iCCP) из всех файлов PNG лежащих в директории можно воспользоваться командой mogrify *.png при условии, что ваш ImageMagick был собран с помощью libpng16(запустите такой командой convert -list format | grep PNG что бы быть уверренным в том что собираете в «верных» настройках).
Если вы хотите узнать, какие файлы нужно исправлять, а не слепо обрабатывать их все, вы можете запустить pngcrush -n -q *.png , где -n означает, что вы не переписываете файлы и — q означает подавление «технической» части вывода, за исключением предупреждений. К сожалению, в pngcrush еще нет опции для подавления всех «технических» сообщений, кроме предупреждений.
Бинарные релизы ImageMagick здесь
Для Android-проектов (Android Studio) перейдите в папку res.
Пример: C:\AndroidProjects\\app\src\main\res\drawable-hdpi\mogrify *.png
Используйте pngcrush чтобы удалить неправильный профиль sRGB из файла png:
pngcrush -ow -rem allb -reduce file.png
- ow будет перезаписывать входной файл
- rem allb удалит все вспомогательные куски, кроме tRNS и gAMA
- reduce сохраняет цвет и глубину
На выходе консоли вы должны увидеть Removed the sRGB chunk . , и, возможно, больше сообщений об удалении кусков iCCP. В конечном итоге вы получите меньший оптимизированный файл png. Когда команда перезапишет исходный файл, обязательно создайте резервную копию или контроль версий (гит_хаб, тартуисеХГ и т.д.).
Решение (мне это вариант нравится потому что он в Qt-е :3 )
Не корректный файл может быть исправлен :
- Открываем картинку(некорректный файл) с помощью QPixmap::load
- Сохраняем картинку(уже корректный файл) на диск с помощью QPixmap::save
Примечание это решение использует Qt билиотеку.
Вот минимальный пример, который я написал на C++, чтобы продемонстрировать, как реализовать предлагаемое решение:
QPixmap pixmap; pixmap.load("badProfileImage.png"); QFile file("goodProfileImage.png"); file.open(QIODevice::WriteOnly); pixmap.save(&file, "PNG");
Полный исходный код «GUI приложение», основано на этом примере, доступно в GitHub.
Вы можете исправить это в фотошопе. У меня есть CC2015, но я уверен, что такая возможность присутствует во всех версиях.
- Откройте ваш .png файл
- File -> Save As и в открывшемся диалоговом окне снимите флажок «ICC Profile: sRGB IEC61966-2.1»
- снимите флажок «As a Copy»
- Смело сохраняйте свой «новый» оригинальный .png.
- Двигайтесь своей жизнью, зная, что вы удалили маленький кусочек зла из этого мира.
Я использовал функцию «mogrify * .png» ImageMagik. Однако у меня были изображения, зарытые в под папках, поэтому я использовал этот простой скрипт Python для применения ко всем изображениям во всех под папках и думал, что он может помочь другим людям:
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)
Используя первый метод решения сего вопроса изменил вид запроса :
find . -name "*.png" -type f -print0 | xargs -0 pngcrush_1_8_8_w64.exe -n -q > pngError.txt 2>&1
Я использовал find и xargs, потому что pngcrush не мог обрабатывать множество аргументов (которые были возвращены ** / *. Png ). Параметры -print0 и -0 необходимы для обработки имен файлов, содержащих пробелы.
Затем выполните поиск в вывод для этих строк: 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
И для каждого из них, запустить mogrify, чтобы исправить их.
mogrify ./Installer/Images/installer_background.png
Это предотвращает возможность индексации будто бы все png файлы изменены, когда только некоторые из них действительно были изменены. Кроме того, у этого метода есть преимущество, чтобы точно показать, какие файлы были неисправны.
Я тестировал это на Windows с консолью Cygwin и оболочкой zsh. И еще спасибо первому варианту(автор которого глен ) за точное пояснение как эту проблему можно решить.
вот более простой способ исправить эту проблему с Mac OS с помощью Homebrew:
> install homebrew if it is not installed yet $brew install libpng $pngfix --strip=color --out=file2.png file.png
или сделать с каждым файлом в текущем каталоге:
mkdir tmp; for f in ./*.png; do pngfix --strip=color --out=tmp/"$f" "$f"; done
Homebrew создаст фиксированную копию для каждого файла png в текущем каталоге и поместит его в подкаталог tmp. После этого, если все в порядке, вам просто нужно переопределить исходные файлы.
Иной совет- использовать приложения Keynote и Preview для создания иконок. Я рисую их, используя Keynote, размером около 120×120 пикселей, над слайдом с белым фоном (опция для редактирования многоугольников — это замечательно!). Перед экспортом в Preview я рисую прямоугольник вокруг значка (без заливки или тени, только контур размером около 135×135) и скопируйте все в буфер обмена. После этого вам просто нужно открыть его с помощью инструмента «Просмотр» с помощью «Создать из буфера обмена», выбрать область размером 128×128 пикселей вокруг значка, скопировать, снова использовать «Создать из буфера обмена» и экспортировать его в PNG. Вам не нужно будет запускать инструмент pngfix.
Используя программу просмотра изображений IrfanView в Windows, я просто сохранил изображение PNG и исправил проблему.
Попробовав пару предложений на этой странице, я остановился на использовании pngcrush. Вы можете использовать скрипт bash ниже для рекурсивного обнаружения и исправления плохих профилей png. Просто передайте ему полный путь к каталогу, который вы хотите найти для png-файлов.
#!/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"
некоторые справочные данные по этому поводу:
Некоторые изменения в версии libpng 1.6+ приводят к тому, что он выдаёт предупреждение или даже неправильно работает с исходным профилем HP / MS sRGB, что приводит к следующему предупреждению libpng warning: iCCP: known incorrect sRGB profile . Старый профиль использует стандарт белой точки D50, когда в новом стандарте D65 является белой точкой . Этот профиль не редкость, используеться в Adobe Photoshop, хотя он по умолчанию не был встроен в изображения.
Обнаружение ошибок было улучшено в некоторых элементах.в частности, читатель iCCP элемента теперь делает довольно полную проверку базового формата.Некоторые неудачные профили, которые были ранее приняты, теперь отклонены, в частности, очень старый сломанный профиль Microsoft / HP sRGB. Требование спецификации PNG, что только изображения с оттенками серого могут отображаться на изображениях с типом цвета 0 или 4, и даже если изображение содержит только серые пиксели, теперь применяются только профили RGB в изображениях с типом цвета 2, 3 или 6. Элементу sRGB разрешено появляться на изображениях с любым типом цвета.
Сохраните нужный вам графический объект в формате .PNG откройте Photoshop, создайте новый проект, в самом низу есть меню, «Цветовой профиль». Выбираете самую первую опцию, «Отменить управление цветом в документе». Жмете ОК. Копируете ваше изображение в проект, сохраняете в формате .PNG. Наслаждаетесь результатом без всплывающей ошибки.
Эту проблему можно легко решить в фотошопе. Открой фотошоп и выполни: Edit > Assign Profile > Don’t Color Manage This Document