Предупреждение libpng: iCCP: известный неправильный профиль sRGB
Я пытаюсь загрузить изображение PNG с помощью SDL, но программа не работает, и эта ошибка появляется в консоли
Предупреждение libpng: iCCP: известен неправильный профиль sRGB
Почему появляется это предупреждение? Что я должен сделать, чтобы решить эту проблему?
Ответы
Ответ 1
Libpng-1.6 более строг в проверке профилей ICC, чем предыдущие версии. Вы можете игнорировать предупреждение. Чтобы избавиться от него, удалите кусок iCCP из изображения PNG.
Некоторые приложения обрабатывают предупреждения как ошибки; Если вы используете такое приложение, вы должны удалить чанк. Вы можете сделать это с любым из множества редакторов PNG, таких как ImageMagick's
convert in.png out.png
Чтобы удалить недействительный кусок iCCP из всех файлов PNG в папке (каталоге), вы можете использовать mogrify
из ImageMagick:
mogrify *.png
Это требует, чтобы ваш ImageMagick был собран с libpng16. Вы можете легко проверить это, запустив:
convert -list format | grep PNG
Если вы хотите выяснить, какие файлы необходимо исправить, а не обрабатывать их вслепую, вы можете запустить
pngcrush -n -q *.png
где -n
означает не переписывать файлы, а -q
означает подавить большую часть вывода, за исключением предупреждений. Извините, в pngcrush пока нет возможности подавить все, кроме предупреждений.
Бинарные выпуски ImageMagick находятся здесь
Для проектов Android (Android Studio) перейдите в папку res
.
Например:
C:\{your_project_folder}\app\src\main\res\drawable-hdpi\mogrify *.png
Ответ 2
Используйте pngcrush
для удаления неправильного профиля sRGB из файла png:
pngcrush -ow -rem allb -reduce file.png
-
-ow
перезапишет входной файл -
-rem allb
удалит все вспомогательные фрагменты, кроме tRNS и gAMA -
-reduce
выполняет уменьшение цвета без потерь или глубины цвета
В выводе консоли вы должны увидеть Removed the sRGB chunk
и, возможно, больше сообщений об удалении чанка. В итоге вы получите меньший, оптимизированный файл PNG. Поскольку команда перезапишет исходный файл, обязательно создайте резервную копию или используйте контроль версий.
Ответ 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");
Полный исходный код приложения с графическим интерфейсом на основе этого примера доступен на GitHub.
Ответ 4
Вы также можете исправить это в фотошопе... У меня есть CC2015, но я уверен, что это то же самое для всех версий.
- Откройте файл .png.
- Файл → Сохранить как и в диалоговом окне, который открывается снимите флажок "ICC-профиль: sRGB IEC61966-2.1"
- Снимите флажок "Как копировать".
- Смело сохраняйте свой оригинальный .png.
- Двигайтесь своей жизнью, зная, что вы удалили из этого всего лишь немного зла.
Ответ 5
Чтобы добавить Гленну отличный ответ, вот что я сделал, чтобы найти, какие файлы были неисправны:
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
поиск в выходных данных следующих строк: 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. Еще раз спасибо Гленну, который поставил большую часть вышеупомянутого, я просто добавляю ответ, поскольку его обычно легче найти, чем комментарии :)
Ответ 6
Благодаря фантастическому ответу Гленна, я использовал функциональность ImageMagik "mogrify *.png". Однако у меня были изображения, спрятанные в подпапках, поэтому я использовал этот простой скрипт 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)
Ответ 7
Существует более простой способ решить эту проблему с Mac OS и Homebrew:
Установите homebrew, если он еще не установлен
$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
Он создаст фиксированную копию для каждого файла png в текущем каталоге и поместит его в подкаталог tmp. После этого, если все в порядке, вам просто нужно переопределить исходные файлы.
Другой совет - использовать приложения Keynote и Preview для создания значков. Я рисую их с помощью Keynote, размером около 120x120 пикселей, поверх слайда с белым фоном (возможность сделать редактируемые полигоны великолепной!). Перед экспортом в Preview я рисую прямоугольник вокруг значка (без заливки или тени, только контур, размером около 135x135) и копирую все в буфер обмена. После этого вам просто нужно открыть его с помощью инструмента "Просмотр", используя "Новый из буфера обмена", выделить область размером 128x128 пикселей вокруг значка, скопировать, снова использовать "Новый из буфера обмена" и экспортировать его в PNG. Вам не нужно запускать инструмент pngfix.
Ответ 8
некоторая справочная информация об этом:
Некоторые изменения в версии libpng 1.6+ вызывают предупреждение или даже неправильно работают с исходным профилем HP/MS sRGB, к следующему stderr: предупреждение libpng: iCCP: известный неправильный sRGB profile В старом профиле используется точка белого D50, где D65 является стандартным. Этот профиль не редкость, он используется Adobe Photoshop, хотя по умолчанию он не был встроен в изображения.
(источник: https://wiki.archlinux.org/index.php/Libpng_errors)
Обнаружение ошибок в некоторых кусках улучшилось; в частности, iCCP chunk reader теперь делает довольно полную проверку базового формата. Некоторые плохие профили, которые были ранее приняты, теперь отвергаются, в в частности, очень старый сломанный профиль Microsoft sRGB. Спецификация PNG что в изображениях могут отображаться только профили оттенков серого цвет 0 или 4, и даже если изображение содержит только серый цвет пикселей, только изображения RGB могут отображаться на изображениях с типом цвета 2, 3, или 6, теперь применяется. Блоку sRGB разрешено появляться в изображениях с любым типом цвета.
(источник: https://forum.qt.io/topic/58638/solved-libpng-warning-iccp-known-incorrect-srgb-profile-drive-me-nuts/16)
Ответ 9
Попробовав пару предложений на этой странице, я закончил использование решения pngcrush. Вы можете использовать bash script ниже для рекурсивного обнаружения и исправления плохих png-профилей. Просто передайте ему полный путь к каталогу, который вы хотите найти для png файлов.
fixpng "/path/to/png/folder"
script:
#!/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"
Ответ 10
Используя программу просмотра изображений IrfanView в Windows, я просто сохранил изображение PNG, и это исправило проблему.
Ответ 11
Расширяя решение friederbluemle, загрузите pngcrush и затем используйте код, подобный этому, если вы запускаете его для нескольких файлов 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)
здесь все png файлы, относящиеся к проектам, находятся в 1 папке.
Ответ 12
Вот смехотворный ответ грубой силы:
Я изменил gradlew script. Вот моя новая команда exec в конце файла в
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "[email protected]" **| grep -v "libpng warning:"**