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 variety of PNG editors, like ImageMagick.
With Windows CMD prompt, you will need to cd
(change directory) into the folder with the images you want to focus on before you can use the commands listed below.
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.
convert in.png out.png
To remove the invalid iCCP chunk from all of the PNG files in a folder (directory), you can use mogrify
from ImageMagick:
mogrify *.png
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
pngcrush -n -q *.png
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.
Note: You must have pngcrush installed.
Binary Releases of ImageMagick are here
For Android Projects (Android Studio) navigate into res
folder.
For example:
C:{your_project_folder}appsrcmainresdrawable-hdpimogrify *.png
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
- Pick a username
- Email Address
- Password
By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.
Already on GitHub?
Sign in
to your account
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{your_project_folder}appsrcmainresdrawable-hdpimogrify *.png
Используйте pngcrush
чтобы удалить неправильный профиль sRGB из файла png:
pngcrush -ow -rem allb -reduce file.png
ow
будет перезаписывать входной файлrem allb
удалит все вспомогательные куски, кроме tRNS и gAMAreduce
сохраняет цвет и глубину
На выходе консоли вы должны увидеть 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-файлов.
fixpng "/path/to/png/folder"
скрипт:
#!/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, хотя он по
умолчанию не был встроен в изображения.
(источник: https://wiki.archlinux.org/index.php/Libpng_errors)
Обнаружение ошибок было улучшено в некоторых элементах.в частности, читатель
iCCP элемента теперь делает довольно полную проверку базового
формата.Некоторые неудачные профили, которые были ранее приняты,
теперь отклонены, в частности, очень старый сломанный профиль
Microsoft / HP 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)
When including .png converted with Photoshop CS6 to gray-scale I get a warning
«warning: pdflatex> libpng warning: iCCP: known incorrect sRGB profile
«.
To be precise, I get 36 of these warnings.
What is the problem with these .png?
asked Jul 26, 2013 at 20:22
Benjamin MassowBenjamin Massow
9272 gold badges9 silver badges19 bronze badges
The newest libpng update (1.6.2 I believe?) has stricter rules about iCCP and will print this warning every time it finds a png that is broken. This warning can be ignored. Fixes would include:
- Downgrade to a older version of libpng
- Install imagemagick and convert all .png files with convert -strip (script below)
- Maybe even just disable this warning?
In the end this is a problem that should be fixed by the maintainer of the code.
Script that would change all .png files in the current directory:
for f in $(find . -type f -name "*.png")
do
echo "Processing $f ..."
convert $f -strip $f
done
answered Jul 28, 2013 at 9:56
5
To strip all .png files with ImageMagick, you can simply run the following command
find . -type f -name "*.png" -exec convert {} -strip {} ;
answered Mar 28, 2014 at 0:25
4
Saving the image with a lower bit depth will probably eliminate the problem altogether; since you have no real color variance and no alpha, 8-bit should look the same.
The reason is that with grayscale, you only really have 256 shades of gray with no RGB variance, and of course, no alpha.
answered Jul 29, 2013 at 4:10
1
I found a workaround that may help.
I downloaded the ImageOptim software: https://imageoptim.com/ (Free)
and went to the folder Xamarin/Android.Support.v7.AppCompat/21.0.3/embedded and drag the images into the imageoptim and it deleted the metadata.
And that fixed.
karlkoeller
123k16 gold badges259 silver badges435 bronze badges
answered Aug 21, 2015 at 6:51
YkshYksh
1214 bronze badges
1
I am a Graphic Designer (not a coder so please excuss my ignorance) who was asked to save the image from Photoshop without sRGB profile to avoid this warning message by one of my colleagues.
The simplest solution I found is to: ‘Save for Web’ from Photoshop giving you far more options when saving a PNG than simply ‘Save As’ — within the addtional options you can simply untick the box for embeding the PNG with sRGB profile. Hope this is of some help to someone, it worked for us.
answered Oct 12, 2016 at 17:27
LanceLance
211 bronze badge
You must log in to answer this question.
Not the answer you’re looking for? Browse other questions tagged
.
Not the answer you’re looking for? Browse other questions tagged
.
Вопрос:
Я пытаюсь загрузить изображение PNG с помощью SDL, но программа не работает, и эта ошибка появляется в консоли
Предупреждение libpng: iCCP: известен неправильный профиль sRGB
Почему появляется это предупреждение? Что я должен сделать, чтобы решить эту проблему?
Лучший ответ:
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}appsrcmainresdrawable-hdpimogrify *.png
Ответ №1
Используйте pngcrush
для удаления неправильного профиля sRGB из файла png:
pngcrush -ow -rem allb -reduce file.png
-
-ow
перезапишет входной файл -
-rem allb
удалит все вспомогательные фрагменты, кроме tRNS и gAMA -
-reduce
выполняет уменьшение цвета без потерь или глубины цвета
В выводе консоли вы должны увидеть Removed the sRGB chunk
и, возможно, больше сообщений об удалении чанка. В итоге вы получите меньший, оптимизированный файл PNG. Поскольку команда перезапишет исходный файл, обязательно создайте резервную копию или используйте контроль версий.
Ответ №2
Решение
Неправильный профиль может быть исправлен с помощью:
- Открытие изображения с неправильным профилем с помощью 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.
Ответ №3
Вы также можете исправить это в фотошопе… У меня есть CC2015, но я уверен, что это то же самое для всех версий.
- Откройте файл .png.
- Файл → Сохранить как и в диалоговом окне, который открывается снимите флажок “ICC-профиль: sRGB IEC61966-2.1”
- Снимите флажок “Как копировать”.
- Смело сохраняйте свой оригинальный .png.
- Двигайтесь своей жизнью, зная, что вы удалили из этого всего лишь немного зла.
Ответ №4
Чтобы добавить Гленну отличный ответ, вот что я сделал, чтобы найти, какие файлы были неисправны:
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. Еще раз спасибо Гленну, который поставил большую часть вышеупомянутого, я просто добавляю ответ, поскольку его обычно легче найти, чем комментарии 🙂
Ответ №5
Благодаря фантастическому ответу Гленна, я использовал функциональность 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)
Ответ №6
Существует более простой способ решить эту проблему с 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, размером около 120×120 пикселей, поверх слайда с белым фоном (возможность сделать редактируемые полигоны великолепной!). Перед экспортом в Preview я рисую прямоугольник вокруг значка (без заливки или тени, только контур, размером около 135×135) и копирую все в буфер обмена. После этого вам просто нужно открыть его с помощью инструмента “Просмотр”, используя “Новый из буфера обмена”, выделить область размером 128×128 пикселей вокруг значка, скопировать, снова использовать “Новый из буфера обмена” и экспортировать его в PNG. Вам не нужно запускать инструмент pngfix.
Ответ №7
некоторая справочная информация об этом:
Некоторые изменения в версии 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)
Ответ №8
Попробовав пару предложений на этой странице, я закончил использование решения 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"
Ответ №9
Используя программу просмотра изображений IrfanView в Windows, я просто сохранил изображение PNG, и это исправило проблему.
Ответ №10
Расширяя решение 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 папке.
Ответ №11
Вот смехотворный ответ грубой силы:
Я изменил gradlew script. Вот моя новая команда exec в конце файла в
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**