Подтвердить что ты не робот

Предупреждение libpng: iCCP: известный неправильный профиль sRGB

Я пытаюсь загрузить изображение PNG с помощью SDL, но программа не работает, и эта ошибка появляется в консоли

Предупреждение libpng: iCCP: известен неправильный профиль sRGB

Почему появляется это предупреждение? Что я должен сделать, чтобы решить эту проблему?

4b9b3361

Ответ 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

Решение

Неправильный профиль может быть исправлен с помощью:

  1. Открытие изображения с неправильным профилем с помощью QPixmap :: load
  2. Сохранение изображения обратно на диск (уже с правильным профилем) с помощью 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:"**