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?
Jawaban:
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
Untuk menghapus potongan iCCP yang tidak valid dari semua file PNG di folder (direktori), Anda dapat menggunakan
mogrify
dari ImageMagick:Ini mengharuskan ImageMagick Anda dibuat dengan libpng16. Anda dapat dengan mudah memeriksanya dengan menjalankan:
Jika Anda ingin mencari tahu file mana yang perlu diperbaiki alih-alih memprosesnya secara membabi buta, Anda bisa menjalankannya
di mana
-n
cara tidak menulis ulang file dan-q
berarti 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
res
folder.Sebagai contoh:
sumber
mogrify **/*.png
sepertinya memodifikasi semua file di pohon. Saya lebih suka memperbarui hanya satu gambar yang salah.find . -type f -name '*.png' -execute mogrify \{\} \;
untuk memodifikasi.png
file secara rekursif dalam direktori saat ini.-ow
untuk 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.Gunakan
pngcrush
untuk menghapus profil sRGB yang salah dari 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 bitDalam 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.sumber
find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;
(Diuji pada GNU / Linux)Larutan
Profil yang salah dapat diperbaiki dengan:
Catatan: Solusi ini menggunakan Perpustakaan Qt .
Contoh
Berikut adalah contoh minimal yang saya tulis dalam C ++ untuk menunjukkan bagaimana mengimplementasikan solusi yang diusulkan:
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!
sumber
Anda juga dapat memperbaikinya di photoshop ...
sumber
Untuk menambah jawaban Glenn yang luar biasa, inilah yang saya lakukan untuk menemukan file mana yang salah:
Saya menggunakan find dan xargs karena pngcrush tidak dapat menangani banyak argumen (yang dikembalikan oleh
**/*.png
). Itu-print0
dan-0
diperlukan untuk menangani nama file yang berisi spasi.Kemudian cari dalam output untuk baris-baris:
iCCP: Not recognizing known sRGB profile that has been edited
.Dan untuk masing-masing itu, jalankan mogrify di atasnya untuk memperbaikinya.
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 :)
sumber
find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;
Setiap PNG yang salah akan menghasilkanpngcrush: iCCP: known incorrect sRGB profile
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:
sumber
mogrify **/*.png
.Ada cara yang lebih mudah untuk memperbaiki masalah ini dengan Mac OS dan Homebrew:
Instal homebrew jika belum diinstal
atau melakukannya dengan setiap file di direktori saat ini:
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.
sumber
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.
Naskah:
sumber
pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8
tetapi pngcrush saya tidak memiliki-warn
atau-reduce
bendera sehingga solusi ini tidak berfungsi.beberapa info latar belakang tentang ini:
(sumber: https://wiki.archlinux.org/index.php/Libpng_errors )
(sumber: https://forum.qt.io/topic/58638/solved-libpng-warning-iccp-known-incorrect-srgb-profile-drive-me-nuts/16 )
sumber
Dengan menggunakan penampil gambar IrfanView di Windows, saya cukup meresep gambar PNG dan itu memperbaiki masalahnya.
sumber
Memperluas solusi friederbluemle, unduh pngcrush dan kemudian gunakan kode seperti ini jika Anda menjalankannya pada banyak file png
di sini semua file png yang terkait dengan proyek berada dalam 1 folder.
sumber
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 "@":
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.
sumber
Inilah jawaban yang sangat kasar:
Saya memodifikasi skrip gradlew. Berikut adalah perintah exec baru saya di akhir file di
sumber