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

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

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

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

96
задан 30 марта '14 в 17:20
источник поделиться
9 ответов

Libpng-1.6 более жестко проверяет профили ICC, чем предыдущие. Вы можете игнорировать предупреждение. Чтобы избавиться от него, удалите кусок iCCP из изображения PNG.

Некоторые приложения рассматривают предупреждения как ошибки; если вы используете такое приложение, вам нужно удалить кусок. Вы можете сделать это с помощью любого из различных редакторов PNG, таких как ImageMagick convert in.png out.png.

Чтобы удалить недопустимый кусок iCCP из всех файлов PNG в папке (каталоге), вы можете использовать ImageMagick 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}\app\src\main\res\drawable-hdpi\mogrify *.png

93
ответ дан 30 марта '14 в 21:19
источник

Используйте pngcrush, чтобы удалить неправильный профиль sRGB из файла png:

pngcrush -ow -rem allb -reduce file.png
  • -ow перезапишет входной файл
  • -rem allb удалит все вспомогательные фрагменты, кроме tRNS и gAMA
  • -reduce выполняется без потерь цвета или уменьшения глубины резкости.

На выходе консоли вы увидите Removed the sRGB chunk. и, возможно, больше сообщений об удалении фрагментов. В конечном итоге вы получите меньший оптимизированный файл png. Когда команда перезапишет исходный файл, обязательно создайте резервную копию или используйте контроль версий.

46
ответ дан 30 марта '15 в 5:42
источник

Чтобы добавить к Glenn отличный ответ, вот что я сделал, чтобы найти файлы, которые были неисправны:

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.

./монтажника/Images/installer_background.png:
Общая длина данных, найденных в критических кусках = 11286
pngcrush: iCCP: не распознает известный профиль sRGB, который был отредактирован

И для каждого из них запустите mogrify, чтобы исправить их.

mogrify ./Installer/Images/installer_background.png

Это предотвращает возможность фиксации каждого файла png в репозитории, когда только некоторые из них действительно были изменены. Кроме того, у него есть преимущество, чтобы точно показать, какие файлы были неисправны.

Я тестировал это на Windows с помощью консоли Cygwin и оболочки zsh. Еще раз спасибо Glenn, который добавил большинство из вышеперечисленного, я просто добавляю ответ, как обычно легче найти, чем комментарии:)

2
ответ дан 13 окт. '16 в 18:30
источник

Благодаря фантастическому ответу от Glenn я использовал ImageMagik "mogrify *.png" . Однако у меня были изображения, зарытые в подпапках, поэтому я использовал этот простой Python script, чтобы применить его ко всем изображениям во всех подпапки и подумал, что это может помочь другим:

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)
2
ответ дан 11 апр. '16 в 20:01
источник

Есть более простой способ исправить эту проблему с 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

Он создаст фиксированную копию для каждого png файла в текущем каталоге и поместит его в подкаталог tmp. После этого, если все в порядке, вам просто нужно переопределить исходные файлы.

Еще один совет - использовать приложения Keynote и Preview для создания значков. Я рисую их, используя Keynote, размером около 120x120 пикселей, над слайдом с белым фоном (опция для редактирования многоугольников - это замечательно!). Перед экспортом в Preview я рисую прямоугольник вокруг значка (без заливки или тени, только контур размером около 135x135) и скопируйте все в буфер обмена. После этого вам просто нужно открыть его с помощью инструмента "Просмотр" с помощью "Создать из буфера обмена", выбрать область размером 128x128 пикселей вокруг значка, скопировать, снова использовать "Создать из буфера обмена" и экспортировать его в PNG. Вам не нужно будет запускать инструмент pngfix.

1
ответ дан 22 февр. '17 в 18:59
источник

Вы также можете исправить это в фотошопе... У меня есть CC2015, но я уверен, что это то же самое для всех версий.

  • Откройте файл .png.
  • Файл → Сохранить как и в диалоговом окне, который открывается снимите флажок "ICC-профиль: sRGB IEC61966-2.1"
  • Снимите флажок "Как копировать".
  • Смело сохраняйте свой оригинальный .png.
  • Двигайтесь своей жизнью, зная, что вы удалили из этого всего лишь немного зла.
1
ответ дан 26 нояб. '17 в 6:32
источник

некоторая справочная информация об этом:

Некоторые изменения в версии 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)

1
ответ дан 14 апр. '17 в 19:40
источник

Попробовав пару предложений на этой странице, я закончил использование решения 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"
1
ответ дан 17 февр. '17 в 20:06
источник

Вот смехотворный ответ грубой силы:

Я изменил gradlew script. Вот моя новая команда exec в конце файла в

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**
-2
ответ дан 28 апр. '15 в 16:14
источник

Другие вопросы по меткам или Задайте вопрос