Я пытаюсь загрузить изображение PNG с помощью SDL, но программа не работает, и эта ошибка появляется в консоли
Предупреждение libpng: iCCP: известен неправильный профиль sRGB
Почему появляется это предупреждение? Что я должен сделать, чтобы решить эту проблему?
Ответы:
Libpng-1.6 более строг в проверке профилей ICC, чем предыдущие версии. Вы можете игнорировать предупреждение. Чтобы избавиться от него, удалите кусок iCCP из изображения PNG.
Некоторые приложения обрабатывают предупреждения как ошибки; Если вы используете такое приложение, вы должны удалить чанк. Вы можете сделать это с любым из множества редакторов PNG, таких как ImageMagick's
Чтобы удалить недействительный кусок iCCP из всех файлов PNG в папке (каталоге), вы можете использовать
mogrify
из ImageMagick:Это требует, чтобы ваш ImageMagick был собран с libpng16. Вы можете легко проверить это, запустив:
Если вы хотите выяснить, какие файлы необходимо исправить, а не обрабатывать их вслепую, вы можете запустить
где
-n
средства не переписывают файлы, а-q
средства подавляют большую часть вывода, за исключением предупреждений. Извините, в pngcrush пока нет возможности подавить все, кроме предупреждений.Бинарные выпуски ImageMagick находятся здесь
Для проектов Android (Android Studio) перейдите в
res
папку.Например:
источник
mogrify **/*.png
кажется, изменяет все файлы в дереве. Я бы предпочел обновить только один неисправный образ.find . -type f -name '*.png' -execute mogrify \{\} \;
для рекурсивного изменения.png
файлов в текущем каталоге.-ow
перезаписать и исправить файл, а также уменьшил размер примерно на 1/6! Просто нужно было получить исходный код программы для моего Mac, скомпилировать, установить вручную и запустить его. GitHub Kjuly / pngcrush может иметь предварительно скомпилированный бинарный файл, но не уверен. Sourceforge, казалось, только имел доступный exe-файл Windows и исходный код. Ответ Friederbluemle, кажется, делает это и многое другое.Используйте
pngcrush
для удаления неправильного профиля sRGB из файла png:-ow
перезапишет входной файл-rem allb
удалит все вспомогательные фрагменты, кроме tRNS и gAMA-reduce
делает без потерь цветового типа или битовой глубиныВ выводе консоли вы должны увидеть
Removed the sRGB chunk
и, возможно, больше сообщений об удалении чанка. В итоге вы получите меньший, оптимизированный файл PNG. Поскольку команда перезапишет исходный файл, обязательно создайте резервную копию или используйте контроль версий.источник
find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;
(протестировано на GNU / Linux)Решение
Неправильный профиль может быть исправлен с помощью:
Примечание: этом решении используется библиотека Qt .
пример
Вот минимальный пример, который я написал на C ++ для демонстрации того, как реализовать предложенное решение:
Полный исходный код приложения с графическим интерфейсом на основе этого примера доступен на GitHub .
ОБНОВЛЕНИЕ ОТ 05.12.2019: Ответ был и остается в силе, однако в приложении с графическим интерфейсом, которым я поделился на GitHub, была ошибка, из-за которой выходное изображение было пустым. Я только что исправил это и извиняюсь за неудобство!
источник
Вы также можете просто исправить это в фотошопе ...
источник
Чтобы добавить отличный ответ Гленна, вот что я сделал, чтобы найти, какие файлы были неисправны:
Я использовал find и xargs, потому что pngcrush не смог обработать множество аргументов (которые были возвращены
**/*.png
).-print0
и-0
требуется для имен файлов , содержащих дескриптор пространства.Тогда поиск в выводе этих строк:
iCCP: Not recognizing known sRGB profile that has been edited
.И для каждого из них запустите mogrify, чтобы исправить их.
Это предотвращает изменение фиксации каждого png-файла в хранилище, если только некоторые из них были изменены. Плюс у него есть преимущество, чтобы показать, какие именно файлы были неисправны.
Я протестировал это на Windows с консолью Cygwin и оболочкой zsh. Еще раз спасибо Гленну, который поставил большую часть всего вышеперечисленного, я просто добавляю ответ, поскольку его обычно легче найти, чем комментарии :)
источник
find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;
Каждый ошибочный PNG, который будет генерироватьсяpngcrush: iCCP: known incorrect sRGB profile
Благодаря фантастической ответ от Гленн , я использовал ImageMagik „mogrify * .png“ функциональность «s. Однако у меня были изображения, спрятанные в подпапках, поэтому я использовал этот простой скрипт Python, чтобы применить его ко всем изображениям во всех подпапках и подумал, что это может помочь другим:
источник
mogrify **/*.png
.Существует более простой способ решить эту проблему с Mac OS и Homebrew:
Установите homebrew, если он еще не установлен
или сделать это с каждым файлом в текущем каталоге:
Он создаст фиксированную копию для каждого файла png в текущем каталоге и поместит его в подкаталог tmp. После этого, если все в порядке, вам просто нужно переопределить исходные файлы.
Другой совет - использовать приложения Keynote и Preview для создания значков. Я рисую их с помощью Keynote, размером около 120x120 пикселей, поверх слайда с белым фоном (возможность сделать редактируемые полигоны великолепной!). Перед экспортом в Preview я рисую прямоугольник вокруг значка (без заливки и тени, только контур, размером около 135x135) и копирую все в буфер обмена. После этого вам просто нужно открыть его с помощью инструмента «Просмотр», используя «Новый из буфера обмена», выбрать область вокруг значка размером 128x128 пикселей, скопировать, снова использовать «Новый из буфера обмена» и экспортировать его в PNG. Вам не нужно запускать инструмент pngfix.
источник
Попробовав пару предложений на этой странице, я решил использовать решение pngcrush. Вы можете использовать скрипт bash ниже для рекурсивного обнаружения и исправления плохих профилей png. Просто передайте ему полный путь к каталогу, в котором вы хотите искать файлы png.
Сценарий:
источник
pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8
но у моего pngcrush нет-warn
ни-reduce
флагов, так что это решение не работает.некоторая справочная информация по этому вопросу:
(источник: https://wiki.archlinux.org/index.php/Libpng_errors )
(источник: https://forum.qt.io/topic/58638/solved-libpng-warning-iccp-known-incorrect-srgb-profile-drive-me-nuts/16 )
источник
Используя программу просмотра изображений IrfanView в Windows, я просто сохранил изображение PNG, и это исправило проблему.
источник
Расширяя решение friederbluemle, загрузите pngcrush и затем используйте код, подобный этому, если вы запускаете его для нескольких файлов png
здесь все файлы png, связанные с проектами, находятся в 1 папке.
источник
Я запустил эти две команды в корне проекта и исправил его.
В основном перенаправьте вывод команды «find» в текстовый файл, чтобы использовать его в качестве списка файлов для обработки. Затем вы можете прочитать этот текстовый файл в «mogrify», используя флаг «@»:
Это позволит использовать «find», чтобы получить все * .png изображения, которые были выпущены ранее, чем за 1 день, и распечатать их в файл с именем «list.txt». Затем «mogrify» читает этот список, обрабатывает изображения и перезаписывает оригиналы версиями с измененным размером. Могут быть небольшие различия в поведении «find» от одной системы к другой, поэтому вам придется проверить страницу руководства для точного использования.
источник
Вот нелепый грубый ответ:
Я изменил скрипт gradlew. Вот моя новая команда exec в конце файла в
источник