libpng попередження: iCCP: відомий неправильний профіль sRGB


173

Я намагаюся завантажити зображення PNG за допомогою SDL, але програма не працює, і ця помилка з’являється в консолі

libpng попередження: iCCP: відомий неправильний профіль sRGB

Чому з’являється це попередження? Що мені робити, щоб вирішити цю проблему?



Відповіді:


180

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

Деякі програми трактують попередження як помилки; якщо ви використовуєте таку програму, вам доведеться видалити шматок. Це можна зробити за допомогою будь-якого з різних редакторів PNG, таких як ImageMagick

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

13
З ImageMagick ви можете використовувати команду -strip . Зокрема, я використав mogrify для впливу на всі зображення в папці. Моя команда виглядала так: mogrify -strip * .png
Maxito

24
Параметр-Strip видалить усі профілі. Якщо опустити опцію -strip ( mogrify * .png ), буде видалено лише неправильні профілі.
Гленн Рендерс-Персон

2
Чи є спосіб дізнатися, який файл викликає попередження? Здійснення, mogrify **/*.pngздається, модифікує всі файли в дереві. Я вважаю за краще оновити лише одне несправне зображення.
Uflex

1
Використовуйте find . -type f -name '*.png' -execute mogrify \{\} \;для рекурсивної модифікації .pngфайлів у поточному каталозі.
Валь каже: Відновіть Моніку

Якби бінарні файли ImageMagick замерзли в моєму комп’ютері, можливо, надто важко працюючи, і, покинувши ніч, довелося насильно перезапустити. Використовував додаток pngcrush для виявлення зазначеної проблеми, -owдля перезапису та виправлення файлу, а також зменшив розмір приблизно на 1/6! Просто потрібно було отримати вихідний код програми для мого Mac, скласти, встановити вручну та запустити його. У GitHub Kjuly / pngcrush може бути попередньо складений двійковий файл, але не впевнений. Sourceforge тільки, здавалося, має доступ до Windows exe та вихідний код. Відповідь фрідерблуемле, здається, робить це і багато іншого.
Pysis

73

Використовуйте pngcrushдля видалення неправильного профілю sRGB з файлу png:

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

У висновку консолі ви повинні побачити Removed the sRGB chunk, і, можливо, більше повідомлень про видалення фрагментів. Ви отримаєте менший, оптимізований файл PNG. Оскільки команда замінить оригінальний файл, переконайтеся, що створити резервну копію або використовувати контроль версій.


7
Це спрацювало! Зробіть це рекурсивно з поточної папки, помістіть це у файл .bat: Для / R %% i в (* .png) зробіть PNGCRUSH.EXE -ow -rem allb -reduce %% i
Енді Бріс

13
І однорозмір для * nix для рекурсивного виправлення всіх png-файлів у поточному каталозі: find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;(Тестовано на GNU / Linux)
friederbluemle

2
Нагорі лінія Frieder також працює всередині git bash на windows.
iKlsR

Pngcrush не видаляє цю частину в моєму випадку. Але маґіфік Imagemagick зробив це.
Нікос

25

Рішення

Неправильний профіль можна виправити:

  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");

Повний вихідний код програми GUI на основі цього прикладу доступний на GitHub .

ОНОВЛЕННЯ ВІД 05.12.2019: Відповідь була і залишається дійсною, проте в програмі GUI, яким я поділився на GitHub, сталася помилка, внаслідок чого вихідне зображення порожнє. Я щойно це виправив і вибачте за незручності!


4
Я здивований, що ця відповідь не була озвучена. Для цього не потрібно нічого встановлювати, і це працює ... чого ще можна було б попросити :)
Четвертик

17

Ви також можете просто виправити це у фотошопі ...

  1. Відкрийте .png файл.
  2. Файл -> Зберегти як і в діалоговому вікні, що відкриється, зніміть прапорець "ICC Profile: sRGB IEC61966-2.1"
  3. Зніміть прапорець "Як копія".
  4. Сміливо економте над оригіналом .png.
  5. Продовжуйте своє життя, знаючи, що ви усунули саме те трохи зла.

8

Щоб додати чудову відповідь Гленна, ось що я зробив, щоб знайти, які файли були несправними:

find . -name "*.png" -type f -print0 | xargs \
       -0 pngcrush_1_8_8_w64.exe -n -q > pngError.txt 2>&1

Я використовував знахідку та 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 ./Installer/Images/installer_background.png

Це не дозволяє змінити кожен файл PNG у сховищі, коли фактично було змінено лише декілька. Плюс це має перевагу в тому, щоб точно показати, які файли були несправними.

Я перевірив це на Windows за допомогою консолі Cygwin та оболонки zsh. Ще раз дякую Гленну, який виклав більшу частину вище сказаного, я просто додаю відповідь, оскільки це зазвичай легше знайти, ніж коментарі :)


3
У Debian, щоб знайти файли, які були проблематичними в моєму програмному забезпеченні, я використовував find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;Кожен помилковий генерований PNGpngcrush: iCCP: known incorrect sRGB profile
Габріель Девіллерс

7

Завдяки фантастичній відповідь від Гленн , я використовував ImageMagik "mogrify * .png" функціональність «s. Однак у мене були закопані зображення в підпапках, тому я використовував цей простий скрипт 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)

2
Це добре крос-платформа, хоча якщо ви знаходитесь на платформі, яка підтримує приємний * NIX-y оболонку, наприклад Zsh або Bash, ви можете просто використовувати mogrify **/*.png.
Кайл Странд

1
Так, хороший момент. Я використовував Python лише тому, що ми розробляємо в Windows та Linux і хотів зафіксувати цей сценарій для нашої репо для подальшого використання.
Деван Вільямс

5

Існує простіший спосіб вирішити цю проблему за допомогою Mac OS та 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 пікселів, на слайді з білим тлом (можливість зробити полігони для редагування чудово!). Перед експортом до попереднього перегляду я малюю прямокутник навколо піктограми (без заливки чи тіні, лише контур, розміром приблизно 135x135) і копіюю все у буфер обміну. Після цього вам просто потрібно відкрити його за допомогою інструмента попереднього перегляду за допомогою "Нового з буфера обміну", вибрати область піктограми 128х128 пікселів навколо піктограми, скопіювати, знову використовувати "Нове з буфера обміну" та експортувати його в PNG. Вам не потрібно буде запускати інструмент pngfix.


1
Я не знайшов pngfix у стандартній установці OS El Capitan (або, можливо, я не здійснив достатній пошук), але знайшов його у встановленій програмі MAMP. Працювали чудово! Дякую! Upvoted
Гвідо

Ти правий! Я встановив його за допомогою "brew install libpng" давно.
Адріель-молодший

Я отримав "n! Ew ERR 08 read Undefined_error: _0 Undefined_error: _0 not_a_PNG_ (too_short) car.png" при запуску цього 10.13.2.
Мітч

@Mitch як і раніше працює нормально після оновлення до 10.13.6.
Адріель-молодший

4

Спробувавши пару пропозицій на цій сторінці, я застосував рішення 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"

2
Це заслуговує більшої кількості результатів. Усі інші рішення стосуються кожного файлу, що особливо погано, якщо у вас є багато зображень у системі управління версіями. Дякую за сценарій!
kfunk

У мене є, pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8але в моєму pngcrush немає -warnні -reduceпрапорів, тому це рішення не працює.
pbhj

4

деяка довідкова інформація про це:

Деякі зміни у версії libpng версії 1.6 або новішої викликають попередження або навіть неправильну роботу з оригінальним sRGB-профілем HP / MS, що призводить до наступного stderr: попередження libpng: iCCP: відомий неправильний профіль sRGB Старий профіль використовує білу точку D50, де D65 є стандартним. Цей профіль не є рідкістю, його використовує Adobe Photoshop, хоча він не був вставлений у зображення за замовчуванням.

(джерело: https://wiki.archlinux.org/index.php/Libpng_errors )

Поліпшення виявлення помилок у деяких фрагментах; зокрема, читач фрагментів iCCP тепер робить досить повну перевірку базового формату. Деякі погані профілі, які раніше були прийняті, тепер відхиляються, зокрема дуже старий зламаний профіль Microsoft / HP sRGB. Виконання вимог специфікації PNG, що на зображеннях кольорів типу 0 або 4 можуть відображатися лише профілі сірого масштабу, і навіть якщо зображення містить лише сірі пікселі, у зображеннях кольорового типу 2, 3 або 6 можуть бути відображені лише RGB-профілі. Шматок sRGB дозволяється відображати на зображеннях будь-якого кольору.

(джерело: https://forum.qt.io/topic/58638/solved-libpng-warning-iccp- unknown-incorrect-srgb-profile-drive-me-nuts/16 )


3

Використовуючи переглядач зображень IrfanView в Windows, я просто відновив зображення PNG, і це виправило проблему.


1

Розширюючи рішення 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 папці.


0

Я запустив ці дві команди в корені проекту та його виправлено.

В основному переспрямовуйте вихід команди "find" на текстовий файл, який буде використовуватися як ваш список файлів для обробки. Потім ви можете прочитати цей текстовий файл у "mogrify", використовуючи прапор "@":

знайти * .png -mtime -1> list.txt

зменшити розмір 50% @ list.txt

Це використовує "find", щоб отримати всі * .png зображення новішими за 1 день та надрукувати їх у файл під назвою "list.txt". Потім "mogrify" читає цей список, обробляє зображення та перезаписує оригінали зі зміненими версіями. Можуть бути незначні відмінності в поведінці "знайти" від однієї системи до іншої, тому вам доведеться перевірити довідкову сторінку на точне використання.


-2

Ось смішна груба відповідь:

Я змінив сценарій gradlew. Ось моя нова команда exec в кінці файлу в

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.