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?
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:
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 mogrify
ImageMagick'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 -n
araçlar dosyaları yeniden yazmaz ve -q
araç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 res
klasöre gidin .
Örneğin:
C:\{your_project_folder}\app\src\main\res\drawable-hdpi\mogrify *.png
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.
find . -type f -name '*.png' -execute mogrify \{\} \;
özyinelemeli olarak değiştirmek için kullanın .png
.
-ow
dosyanı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.
pngcrush
PNG 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 yaparKonsol çı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.
find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;
(GNU / Linux üzerinde test edilmiştir)
Yanlış profil şu şekilde düzeltilebilir:
Not: Bu çözümde Qt Library kullanılır .
İş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!
Bunu photoshop'ta da düzeltebilirsiniz ...
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 . -print0
Ve -0
boş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 :)
find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;
Her hatalı pngcrush: iCCP: known incorrect sRGB profile
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)
mogrify **/*.png
.
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.
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"
pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8
ama benim pngcrush yok -warn
ne de -reduce
bu çözüm işe yaramaz böylece bayraklar.
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.
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.
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.
İş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:"**