libpng peringatan: iCCP: diketahui profil sRGB salah

173

Saya mencoba memuat gambar PNG menggunakan SDL tetapi program ini tidak berfungsi dan kesalahan ini muncul di konsol

libpng peringatan: iCCP: diketahui profil sRGB salah

Mengapa peringatan ini muncul? Apa yang harus saya lakukan untuk menyelesaikan masalah ini?

rkarami
sumber
Lihat tex.stackexchange.com/questions/125612/...
Jesse W di Z - Diberikan pada SE

Jawaban:

180

Libpng-1.6 lebih ketat dalam memeriksa profil ICC daripada versi sebelumnya. Anda bisa mengabaikan peringatan itu. Untuk menghilangkannya, hapus potongan iCCP dari gambar PNG.

Beberapa aplikasi memperlakukan peringatan sebagai kesalahan; jika Anda menggunakan aplikasi seperti itu, Anda harus menghapus chunk. Anda dapat melakukannya dengan beragam editor PNG seperti ImageMagick's

convert in.png out.png

Untuk menghapus potongan iCCP yang tidak valid dari semua file PNG di folder (direktori), Anda dapat menggunakan mogrifydari ImageMagick:

mogrify *.png

Ini mengharuskan ImageMagick Anda dibuat dengan libpng16. Anda dapat dengan mudah memeriksanya dengan menjalankan:

convert -list format | grep PNG

Jika Anda ingin mencari tahu file mana yang perlu diperbaiki alih-alih memprosesnya secara membabi buta, Anda bisa menjalankannya

pngcrush -n -q *.png

di mana -ncara tidak menulis ulang file dan -qberarti menekan sebagian besar output kecuali untuk peringatan. Maaf, belum ada opsi di pngcrush untuk menekan semuanya kecuali peringatan.


Binary Releases dari ImageMagick ada di sini


Untuk Proyek Android (Android Studio) navigasikan ke resfolder.

Sebagai contoh:

C:\{your_project_folder}\app\src\main\res\drawable-hdpi\mogrify *.png
Glenn Randers-Pehrson
sumber
13
Dengan ImageMagick Anda dapat menggunakan perintah -strip . Secara khusus, saya menggunakan mogrify untuk mempengaruhi semua gambar dalam folder. Perintah saya terlihat seperti ini: mogrify -strip * .png
Maxito
24
Opsi -strip akan menghapus semua profil. Jika Anda menghilangkan opsi -strip ( mogrify * .png ), hanya profil yang salah yang akan dihapus.
Glenn Randers-Pehrson
2
Apakah ada cara untuk mengetahui file mana yang memicu peringatan? Menjalankan mogrify **/*.pngsepertinya memodifikasi semua file di pohon. Saya lebih suka memperbarui hanya satu gambar yang salah.
Uflex
1
Gunakan find . -type f -name '*.png' -execute mogrify \{\} \;untuk memodifikasi .pngfile secara rekursif dalam direktori saat ini.
val bilang Reinstate Monica
Seandainya binari ImageMagick membekukan komputer saya, mungkin karena bekerja terlalu keras, dan setelah pergi semalaman, harus memulai ulang dengan paksa. Menggunakan aplikasi pngcrush untuk mendeteksi masalah seperti yang disebutkan, -owuntuk menimpa dan memperbaiki file, dan juga mengurangi ukuran sekitar 1/6! Baru saja mendapatkan kode sumber program untuk mac saya, kompilasi, instal secara manual, dan jalankan. GitHub Kjuly / pngcrush mungkin memiliki biner yang telah dikompilasi, tetapi tidak yakin. Sourceforge sepertinya memiliki exe Windows yang tersedia dan kode sumbernya. Jawaban friederbluemle tampaknya melakukan ini dan lebih banyak lagi.
Pysis
73

Gunakan pngcrushuntuk menghapus profil sRGB yang salah dari file png:

pngcrush -ow -rem allb -reduce file.png
  • -ow akan menimpa file input
  • -rem allb akan menghapus semua potongan tambahan kecuali tRNS dan gAMA
  • -reduce tidak mengurangi jenis warna atau pengurangan kedalaman bit

Dalam output konsol Anda akan melihat Removed the sRGB chunk, dan mungkin lebih banyak pesan tentang penghapusan chunk. Anda akan mendapatkan file PNG yang lebih kecil dan lebih optimal. Karena perintah akan menimpa file asli, pastikan untuk membuat cadangan atau menggunakan kontrol versi.

friederbluemle
sumber
7
Itu berhasil! Lakukan secara berulang dari folder saat ini, letakkan ini di file .bat: Untuk / R %% i di (* .png) lakukan PNGCRUSH.EXE -ow -rem allb -reduce %% i
Andy Brice
13
Dan satu-liner untuk * nix untuk secara rekursif memperbaiki semua file png di direktori saat ini: find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;(Diuji pada GNU / Linux)
friederbluemle
2
Di atas garis oleh fryer bekerja di dalam git bash di windows juga.
iKlsR
Pngcrush tidak menghapus bagian ini dalam kasus saya. Tapi mogrify imagemagick melakukannya.
Nikos
25

Larutan

Profil yang salah dapat diperbaiki dengan:

  1. Membuka gambar dengan profil yang salah menggunakan QPixmap :: load
  2. Menyimpan gambar kembali ke disk (sudah dengan profil yang benar) menggunakan QPixmap :: save

Catatan: Solusi ini menggunakan Perpustakaan Qt .

Contoh

Berikut adalah contoh minimal yang saya tulis dalam C ++ untuk menunjukkan bagaimana mengimplementasikan solusi yang diusulkan:

QPixmap pixmap;
pixmap.load("badProfileImage.png");

QFile file("goodProfileImage.png");
file.open(QIODevice::WriteOnly);
pixmap.save(&file, "PNG");

Kode sumber lengkap aplikasi GUI berdasarkan contoh ini tersedia di GitHub .

PEMBARUAN DARI 05.12.2019: Jawabannya adalah dan masih valid, namun ada bug dalam aplikasi GUI yang saya bagikan di GitHub, menyebabkan gambar output menjadi kosong. Saya baru saja memperbaikinya dan meminta maaf atas ketidaknyamanan ini!

scopchanov
sumber
4
Saya terkejut bahwa jawaban ini tidak diangkat. Tidak perlu menginstal apa pun dan berfungsi ... apa lagi yang bisa orang minta :)
Quantuple
17

Anda juga dapat memperbaikinya di photoshop ...

  1. Buka file .png Anda.
  2. File -> Save As dan dalam dialog yang membuka hapus centang "Profil ICC: sRGB IEC61966-2.1"
  3. Hapus centang "Sebagai Salinan".
  4. Dengan berani menabung untuk .png asli Anda.
  5. Lanjutkan dengan hidup Anda mengetahui bahwa Anda telah menghapus sedikit saja kejahatan dari dunia.
Spencer
sumber
8

Untuk menambah jawaban Glenn yang luar biasa, inilah yang saya lakukan untuk menemukan file mana yang salah:

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

Saya menggunakan find dan xargs karena pngcrush tidak dapat menangani banyak argumen (yang dikembalikan oleh **/*.png). Itu -print0dan -0diperlukan untuk menangani nama file yang berisi spasi.

Kemudian cari dalam output untuk baris-baris: 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

Dan untuk masing-masing itu, jalankan mogrify di atasnya untuk memperbaikinya.

mogrify ./Installer/Images/installer_background.png

Melakukan hal ini mencegah komit mengubah setiap file png tunggal dalam repositori ketika hanya beberapa yang benar-benar telah dimodifikasi. Plus itu memiliki keuntungan untuk menunjukkan file mana yang rusak.

Saya menguji ini pada Windows dengan konsol Cygwin dan shell zsh. Terima kasih sekali lagi kepada Glenn yang menaruh sebagian besar di atas, saya hanya menambahkan jawaban karena biasanya lebih mudah ditemukan daripada komentar :)

Uflex
sumber
3
Di Debian, untuk menemukan file yang bermasalah dalam perangkat lunak saya, saya menggunakan find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;Setiap PNG yang salah akan menghasilkanpngcrush: iCCP: known incorrect sRGB profile
Gabriel Devillers
7

Berkat jawaban fantastis dari Glenn , saya menggunakan fungsionalitas "mogrify * .png" dari ImageMagik . Namun, saya memiliki gambar yang terkubur dalam sub-folder, jadi saya menggunakan skrip Python sederhana ini untuk menerapkan ini ke semua gambar di semua sub-folder dan berpikir itu mungkin membantu orang lain:

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)
Devan Williams
sumber
2
Ini adalah cross-platform yang baik, meskipun jika Anda menggunakan platform yang mendukung shell * NIX-y yang bagus seperti Zsh atau Bash, Anda bisa menggunakannya mogrify **/*.png.
Kyle Strand
1
Ya, poin bagus. Saya hanya menggunakan Python karena kami mengembangkan pada Windows dan Linux dan ingin mengkomit skrip ini ke repo kami untuk digunakan di masa depan.
Devan Williams
5

Ada cara yang lebih mudah untuk memperbaiki masalah ini dengan Mac OS dan Homebrew:

Instal homebrew jika belum diinstal

$brew install libpng
$pngfix --strip=color --out=file2.png file.png

atau melakukannya dengan setiap file di direktori saat ini:

mkdir tmp; for f in ./*.png; do pngfix --strip=color --out=tmp/"$f" "$f"; done

Ini akan membuat salinan tetap untuk setiap file png di direktori saat ini dan meletakkannya di subdirektori tmp. Setelah itu, jika semuanya OK, Anda hanya perlu mengganti file asli.

Kiat lain adalah dengan menggunakan aplikasi Keynote dan Preview untuk membuat ikon. Saya menggambar mereka menggunakan Keynote, dalam ukuran sekitar 120x120 piksel, di atas slide dengan latar belakang putih (opsi untuk membuat poligon dapat diedit sangat bagus!). Sebelum mengekspor ke Pratinjau, saya menggambar persegi panjang di sekitar ikon (tanpa isi atau bayangan, hanya garis besar, dengan ukuran sekitar 135x135) dan menyalin semuanya ke clipboard. Setelah itu, Anda hanya perlu membukanya dengan alat Pratinjau menggunakan "Baru dari Clipboard", pilih area 128x128 piksel di sekitar ikon, salin, gunakan "Baru dari Clipboard" lagi, dan ekspor ke PNG. Anda tidak perlu menjalankan alat pngfix.

Adriel Jr
sumber
1
Saya tidak menemukan pngfix di instalasi OS El Capitan standar (atau mungkin saya tidak mencari dengan cukup baik), tetapi saya menemukannya di instalasi MAMP yang saya miliki. Bekerja dengan sempurna! Terima kasih! Terpilih
guido
Kamu benar! Saya menginstalnya dengan "brew install libpng" sejak lama.
Adriel Jr
Saya mendapat "n! Ew ERR 08 baca Undefined_error: _0 Undefined_error: _0 not_a_PNG_ (too_short) car.png" saat menjalankan ini pada 10.13.2.
Mitch
@Mitch Masih berjalan ok setelah memutakhirkan ke 10.13.6.
Adriel Jr
4

Setelah mencoba beberapa saran di halaman ini saya akhirnya menggunakan solusi pngcrush. Anda dapat menggunakan skrip bash di bawah ini untuk secara rekursi mendeteksi dan memperbaiki profil png yang buruk. Cukup berikan path lengkap ke direktori yang ingin Anda cari file png.

fixpng "/path/to/png/folder"

Naskah:

#!/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"
bubur
sumber
2
Ini layak mendapatkan lebih banyak suara positif. Semua solusi lain menyentuh setiap file, yang sangat buruk jika Anda memiliki banyak gambar dalam sistem kontrol versi. Terima kasih untuk skripnya!
kfunk
Saya punya pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8tetapi pngcrush saya tidak memiliki -warnatau -reducebendera sehingga solusi ini tidak berfungsi.
pbhj
4

beberapa info latar belakang tentang ini:

Beberapa perubahan dalam libpng versi 1.6+ menyebabkannya mengeluarkan peringatan atau bahkan tidak berfungsi dengan benar dengan profil HP / MS sRGB asli, mengarah ke stderr berikut: peringatan libpng: iCCP: dikenal salah sRGB profil Profil lama menggunakan D50 whitepoint, di mana D65 adalah standar. Profil ini tidak biasa digunakan oleh Adobe Photoshop, meskipun tidak tertanam ke dalam gambar secara default.

(sumber: https://wiki.archlinux.org/index.php/Libpng_errors )

Deteksi kesalahan di beberapa bongkahan telah meningkat; khususnya pembaca chunk iCCP sekarang tidak cukup validasi format dasar. Beberapa profil buruk yang sebelumnya diterima sekarang ditolak, khususnya profil Microsoft / HP sRGB yang sudah sangat lama rusak. Persyaratan spesifikasi PNG yang hanya profil skala abu-abu yang dapat muncul dalam gambar dengan tipe warna 0 atau 4 dan bahkan jika gambar hanya mengandung piksel abu-abu, hanya profil RGB yang dapat muncul dalam gambar dengan tipe warna 2, 3, atau 6, sekarang diberlakukan. Potongan sRGB diizinkan untuk muncul dalam gambar dengan jenis warna apa pun.

(sumber: https://forum.qt.io/topic/58638/solved-libpng-warning-iccp-known-incorrect-srgb-profile-drive-me-nuts/16 )

George Birbilis
sumber
3

Dengan menggunakan penampil gambar IrfanView di Windows, saya cukup meresep gambar PNG dan itu memperbaiki masalahnya.

Neil Roy
sumber
1

Memperluas solusi friederbluemle, unduh pngcrush dan kemudian gunakan kode seperti ini jika Anda menjalankannya pada banyak file 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)

di sini semua file png yang terkait dengan proyek berada dalam 1 folder.

sahasrara62
sumber
0

Saya menjalankan kedua perintah itu di root proyek dan diperbaiki.

Pada dasarnya mengarahkan output dari perintah "find" ke file teks untuk digunakan sebagai daftar file Anda untuk diproses. Kemudian Anda dapat membaca file teks itu menjadi "mogrify" menggunakan bendera "@":

temukan * .png -mtime -1> list.txt

mogrify -ukuran 50% @ list.txt

Itu akan menggunakan "find" untuk mendapatkan semua gambar * .png yang lebih baru dari 1 hari dan mencetaknya ke file bernama "list.txt". Kemudian "mogrify" membaca daftar itu, memproses gambar, dan menimpa aslinya dengan versi yang diubah ukurannya. Mungkin ada sedikit perbedaan dalam perilaku "temukan" dari satu sistem ke sistem lainnya, jadi Anda harus memeriksa halaman manual untuk penggunaan yang tepat.

yadayada
sumber
-2

Inilah jawaban yang sangat kasar:

Saya memodifikasi skrip gradlew. Berikut adalah perintah exec baru saya di akhir file di

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**
Milk Run
sumber