libpng uyarısı: iCCP: bilinen yanlış sRGB profili


173

SDL kullanarak bir PNG görüntüsü yüklemeye çalışıyorum ama program çalışmıyor ve bu hata konsolda görünüyor

libpng uyarısı: iCCP: bilinen yanlış sRGB profili

Bu uyarı neden görünüyor? Bu sorunu çözmek için ne yapmalıyım?



Yanıtlar:


180

Libpng-1.6, ICC profillerini kontrol etme konusunda önceki sürümlerden daha katıdır. Uyarıyı yok sayabilirsiniz. Bundan kurtulmak için iCCP yığınını PNG görüntüsünden kaldırın.

Bazı uygulamalar uyarıları hata olarak kabul eder; böyle bir uygulama kullanıyorsanız, yığın kaldırmak gerekir. Bunu ImageMagick gibi çeşitli PNG editörlerinden herhangi biriyle yapabilirsiniz.

convert in.png out.png

Geçersiz iCCP yığınını bir klasördeki (dizindeki) tüm PNG dosyalarından kaldırmak için mogrifyImageMagick'ten kullanabilirsiniz :

mogrify *.png

Bu, ImageMagick'inizin libpng16 ile oluşturulmasını gerektirir. Çalıştırarak kolayca kontrol edebilirsiniz:

convert -list format | grep PNG

Tümünü körü körüne işlemek yerine hangi dosyaların düzeltilmesi gerektiğini bulmak isterseniz,

pngcrush -n -q *.png

burada -naraçlar dosyaları yeniden yazmaz ve -qaraçlar uyarılar dışında çıktının çoğunu bastırır. Maalesef, pngcrush'ta uyarılar dışında her şeyi bastırmak için henüz bir seçenek yok.


ImageMagick'in İkili Sürümleri burada


Android Projeleri (Android Studio) için resklasöre gidin .

Örneğin:

C:\{your_project_folder}\app\src\main\res\drawable-hdpi\mogrify *.png

13
ImageMagick ile -strip komutunu kullanabilirsiniz . Özellikle, bir klasördeki tüm görüntüleri etkilemek için mogrify kullandım . Komutum şöyle
Maxito

24
-Strip seçeneği tüm profilleri kaldırır. -Strip seçeneğini ( mogrify * .png ) atlarsanız , yalnızca yanlış profiller silinir.
Glenn Randers-Pehrson

2
Hangi dosyanın uyarıyı tetiklediğini bulmanın bir yolu var mı? Running mogrify **/*.png, ağaçtaki tüm dosyaları değiştiriyor gibi görünüyor. Yalnızca bir hatalı görüntüyü güncellemeyi tercih ederim.
Uflex

1
Geçerli dizindeki dosyaları find . -type f -name '*.png' -execute mogrify \{\} \;özyinelemeli olarak değiştirmek için kullanın .png.
val diyor Reinstate Monica

ImageMagick ikili dosyaları bilgisayarımı dondurmuş olsaydı, belki çok fazla çalışmaktan ve bir gece ayrıldıktan sonra zorla yeniden başlatmak zorunda kaldı. Sorunu tespit etmek, -owdosyanın üzerine yazmak ve düzeltmek için pngcrush uygulamasını kullandı ve ayrıca boyutu yaklaşık 1/6 oranında azalttı! Sadece mac için programın kaynak kodunu almak, derlemek, manuel olarak yüklemek ve çalıştırmak zorunda kaldı. GitHub Kjuly / pngcrush önceden derlenmiş bir ikili dosyaya sahip olabilir, ancak emin değilsiniz. Sourceforge sadece Windows exe ve kaynak kodu var gibiydi. friederbluemle'ın cevabı bunu ve daha fazlasını yapıyor gibi görünüyor.
19'da Piz

73

pngcrushPNG dosyasından yanlış sRGB profilini kaldırmak için kullanın :

pngcrush -ow -rem allb -reduce file.png
  • -ow giriş dosyasının üzerine yazacak
  • -rem allb tRNS ve gAMA hariç tüm yardımcı parçaları kaldıracak
  • -reduce kayıpsız renk türü veya bit derinliği azaltma yapar

Konsol çıktısında Removed the sRGB chunk, yığın kaldırmaları hakkında ve muhtemelen daha fazla ileti görmelisiniz . Daha küçük, optimize edilmiş bir PNG dosyası elde edersiniz. Komut orijinal dosyanın üzerine yazacağından, bir yedek oluşturduğunuzdan veya sürüm kontrolünü kullandığınızdan emin olun.


7
İşe yaradı! Geçerli klasörden özyinelemeli olarak bunu bir .bat dosyasına koyun: (* .png) / R %% i için PNGCRUSH.EXE -ow -rem allb -reduce %% i
Andy Brice

13
Ve * nix için mevcut dizindeki tüm png dosyalarını özyinelemeli olarak düzeltmek için bir astar: find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;(GNU / Linux üzerinde test edilmiştir)
friederbluemle

2
Frieder tarafından satırın üstünde git bash içinde pencere üzerinde de çalışır.
iKlsR

Pngcrush benim durumumda bu parçayı kaldırmaz. Ama imagemagick'in mogrifisi bunu yaptı.
Nikos

25

Çözüm

Yanlış profil şu şekilde düzeltilebilir:

  1. QPixmap :: load kullanarak görüntüyü yanlış profille açma
  2. Görüntüyü QPixmap :: save kullanarak diske (zaten doğru profille) geri kaydetme

Not: Bu çözümde Qt Library kullanılır .

Misal

İşte önerilen çözümün nasıl uygulanacağını göstermek için C ++ yazdım minimal bir örnek:

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

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

Bu örneğe dayalı bir GUI uygulamasının kaynak kodunun tamamı GitHub'da bulunur .

05.12.2019 DAN GÜNCELLEME: cevap oldu ve hala geçerlidir, ancak çıkış görüntü boş olmasına neden ben GitHub üzerinde paylaştığı GUI uygulamasında bir hata oluştu. Sadece düzelttim ve rahatsızlıktan dolayı özür dilerim!


4
Bu cevabın iptal edilmesine şaşırdım. Hiçbir şey yüklemeyi gerektirmez ve işe yarıyor ... bir daha ne isteyebilir :)
Quantuple

17

Bunu photoshop'ta da düzeltebilirsiniz ...

  1. .Png dosyanızı açın.
  2. Dosya -> Farklı Kaydet ve açılan iletişim kutusunda "ICC Profili: sRGB IEC61966-2.1" seçeneğinin işaretini kaldırın
  3. "Kopya Olarak" seçeneğinin işaretini kaldırın.
  4. Orijinal .png'nizi cesurca kaydedin.
  5. Dünyadan o küçük kötülüğü çıkardığınızı bilerek hayatınıza devam edin.

8

Glenn'in harika cevabına eklemek için, hangi dosyaların hatalı olduğunu bulmak için yaptım:

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

Bulma ve xargs kullandım çünkü pngcrush (tarafından döndürülen **/*.png) birçok argümanı işleyemedi . -print0Ve -0boşluk içeren tanıtıcı dosya adları için gereklidir.

Sonra bu hatlar için çıktıda arama: 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

Ve her biri için, onları düzeltmek için üzerinde mogrify çalıştırın.

mogrify ./Installer/Images/installer_background.png

Bunu yapmak, yalnızca birkaç tanesi gerçekten değiştirildiğinde, depodaki her bir png dosyasını değiştirme taahhüdüne sahip olmayı önler. Ayrıca tam olarak hangi dosyaların hatalı olduğunu gösterme avantajına sahiptir.

Bunu Windows'ta bir Cygwin konsolu ve bir zsh kabuğu ile test ettim . Yukarıdakilerin çoğunu koyan Glenn'e tekrar teşekkürler , sadece bir cevap ekliyorum çünkü bulmak genellikle yorumlardan daha kolay :)


3
Debian'da, yazılımımda sorunlu olan dosyaları bulmak için, find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;Her hatalı pngcrush: iCCP: known incorrect sRGB profile
PNG'nin

7

Sayesinde fantastik cevap den Glenn , kullandığım ImageMagik 'ın 'mogrify * .png' işlevselliği. Ancak, alt klasörlere gömülü görüntüler vardı, bu yüzden bu basit Python betiğini tüm alt klasörlerdeki tüm görüntülere uygulamak için kullandım ve başkalarına yardımcı olabileceğini düşündüm:

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
Bu güzel bir çapraz platformdur, ancak Zsh veya Bash gibi güzel bir * NIX-y kabuğunu destekleyen bir platformdaysanız, kullanabilirsiniz mogrify **/*.png.
Kyle Strand

1
Evet, iyi bir noktaya değindin. Sadece Python'u kullandım çünkü Windows ve Linux üzerinde geliştirdik ve bu betiği ileride kullanmak üzere depomuza vermek istedik.
Devan Williams

5

Mac OS ve Homebrew ile bu sorunu çözmenin daha kolay bir yolu var:

Henüz kurulmadıysa homebrew'u takın

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

veya geçerli dizindeki her dosyayla yapmak için:

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

Geçerli dizindeki her png dosyası için sabit bir kopya oluşturur ve tmp alt dizinine yerleştirir. Bundan sonra, her şey yolundaysa, sadece orijinal dosyaları geçersiz kılmanız gerekir.

Başka bir ipucu, simgeleri oluşturmak için Keynote ve Preview uygulamalarını kullanmaktır. Keynote'u yaklaşık 120x120 piksel boyutunda beyaz bir arka plana sahip bir slayt üzerine çiziyorum (çokgenleri düzenlenebilir yapma seçeneği harika!). Önizleme'ye dışa aktarmadan önce, simgenin etrafına bir dikdörtgen çizerim (dolgu veya gölge olmadan, yalnızca anahat, yaklaşık 135x135 boyutunda) ve her şeyi panoya kopyalarım. Bundan sonra, "Panodan Yeni" kullanarak Önizleme aracıyla açmanız, simgenin etrafında 128x128 piksel bir alan seçmeniz, kopyalamanız, tekrar "Panodan Yeni" yi kullanmanız ve PNG'ye dışa aktarmanız gerekir. Pngfix aracını çalıştırmanız gerekmez.


1
Standart OS El Capitan kurulumunda pngfix'i bulamadım (veya belki de yeterince iyi aramadım), ancak sahip olduğum MAMP kurulumunda buldum. Mükemmel çalıştı! Teşekkürler! Seçildi
guido

Haklısın! Uzun zaman önce "brew install libpng" ile kurdum.
Adriel Jr

Bunu 10.13.2'de çalıştırırken "n! Ew ERR 08 Undefined_error: _0 Undefined_error: _0 not_a_PNG_ (too_short) car.png" okudum.
Mitch

@Mitch 10.13.6'ya yükselttikten sonra hala çalışıyor.
Adriel Jr

4

Bu sayfadaki birkaç öneriyi denedikten sonra pngcrush çözümünü kullandım. Kötü png profillerini tekrar tekrar tespit etmek ve düzeltmek için aşağıdaki bash betiğini kullanabilirsiniz. Png dosyalarını aramak istediğiniz dizinin tam yolunu iletmeniz yeterlidir.

fixpng "/path/to/png/folder"

Senaryo:

#!/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
Bu daha fazla oyu hak ediyor. Diğer tüm çözümler her dosyaya dokunur , bu da sürüm kontrol sisteminde çok sayıda görüntünüz varsa özellikle kötüdür. Senaryo için teşekkürler!
kfunk

Ben pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8ama benim pngcrush yok -warnne de -reducebu çözüm işe yaramaz böylece bayraklar.
pbhj

4

bu konuda bazı arka plan bilgileri:

Libpng sürüm 1.6+'daki bazı değişiklikler, orijinal HP / MS sRGB profiliyle uyarı vermesine veya düzgün çalışmamasına neden olarak, aşağıdaki stderr: libpng uyarısına neden olur: iCCP: bilinen yanlış sRGB profili Eski profil bir D50 beyaz nokta kullanır, burada D65 standarttır. Varsayılan olarak görüntülere gömülmemiş olmasına rağmen, Adobe Photoshop tarafından kullanılan bu profil nadir değildir.

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

Bazı parçalarda hata tespiti iyileşmiştir; özellikle iCCP yığın okuyucusu şimdi temel formatın doğrulanmasını tamamlamaktadır. Daha önce kabul edilen bazı kötü profiller artık reddedildi, özellikle de çok eski kırık Microsoft / HP sRGB profili. Renk türü 0 veya 4 olan görüntülerde yalnızca gri tonlama profillerinin görünebileceği ve görüntü yalnızca gri pikseller içeriyor olsa bile, renk türü 2, 3 veya 6 olan görüntülerde yalnızca RGB profillerinin görünebileceği PNG özellik gereksinimi uygulanmaktadır. SRGB yığınının herhangi bir renk türüne sahip görüntülerde görünmesine izin verilir.

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


3

Windows'ta IrfanView resim görüntüleyiciyi kullanarak PNG görüntüsünü yeniden kaydettim ve bu da sorunu düzeltti.


1

Friederbluemle çözümünü genişletmek, pngcrush'ı indirin ve daha sonra birden fazla png dosyasında çalıştırıyorsanız böyle kodu kullanın.

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)

Burada projelerle ilgili tüm png dosyası 1 klasörde.


0

Bu iki komutu projenin kökünde çalıştırdım ve düzeltildi.

Temel olarak "find" komutunun çıktısını işlenecek dosya listeniz olarak kullanmak üzere bir metin dosyasına yönlendirin. Daha sonra "@" bayrağını kullanarak bu metin dosyasını "mogrify" olarak okuyabilirsiniz:

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

mogrify -boyut% 50 @ list.txt

Bu, 1 günden daha yeni olan tüm * .png görüntülerini almak ve "list.txt" adlı bir dosyaya yazdırmak için "find" kullanır. Sonra "mogrify" bu listeyi okur, görüntüleri işler ve orijinalleri yeniden boyutlandırılan sürümlerin üzerine yazar. Bir sistemden diğerine "bulma" davranışında küçük farklılıklar olabilir, bu nedenle kullanım sayfasını tam kullanım için kontrol etmeniz gerekir.


-2

İşte gülünç derecede kaba bir kuvvet cevabı:

Gradlew betiğini değiştirdim. İşte benim yeni exec komutu dosyanın sonundaki

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.