ฉันกำลังพยายามโหลดภาพ PNG โดยใช้ SDL แต่โปรแกรมไม่ทำงานและข้อผิดพลาดนี้ปรากฏขึ้นในคอนโซล
คำเตือน libpng: iCCP: รู้จักโปรไฟล์ sRGB ไม่ถูกต้อง
เหตุใดคำเตือนนี้จึงปรากฏขึ้น ฉันควรทำอย่างไรเพื่อแก้ไขปัญหานี้
ฉันกำลังพยายามโหลดภาพ PNG โดยใช้ SDL แต่โปรแกรมไม่ทำงานและข้อผิดพลาดนี้ปรากฏขึ้นในคอนโซล
คำเตือน libpng: iCCP: รู้จักโปรไฟล์ sRGB ไม่ถูกต้อง
เหตุใดคำเตือนนี้จึงปรากฏขึ้น ฉันควรทำอย่างไรเพื่อแก้ไขปัญหานี้
คำตอบ:
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
mogrify **/*.png
ดูเหมือนจะแก้ไขไฟล์ทั้งหมดในแผนผัง ฉันต้องการอัปเดตภาพที่ผิดพลาดเพียงภาพเดียว
find . -type f -name '*.png' -execute mogrify \{\} \;
เพื่อแก้ไข.png
ไฟล์ซ้ำ ๆในไดเรกทอรีปัจจุบัน
-ow
เพื่อเขียนทับและแก้ไขไฟล์และลดขนาดลงประมาณ 1 / 6th! เพิ่งได้รับซอร์สโค้ดของโปรแกรมสำหรับ mac ของฉันคอมไพล์ติดตั้งด้วยตนเองและรัน GitHub Kjuly / pngcrush อาจมีไบนารีที่คอมไพล์แล้ว แต่ไม่แน่ใจ Sourceforge ดูเหมือนจะมี Windows exe พร้อมใช้งานและซอร์สโค้ดเท่านั้น คำตอบของ Friederbluemle ดูเหมือนว่าจะทำเช่นนี้และอื่น ๆ
ใช้pngcrush
เพื่อลบโปรไฟล์ sRGB ที่ไม่ถูกต้องออกจากไฟล์ png:
pngcrush -ow -rem allb -reduce file.png
-ow
จะเขียนทับไฟล์อินพุต-rem allb
จะลบส่วนเสริมทั้งหมดยกเว้น tRNS และ gAMA-reduce
การสูญเสียสีประเภทหรือการลดความลึกบิตในเอาต์พุตคอนโซลคุณควรเห็นRemoved the sRGB chunk
และอาจมีข้อความเพิ่มเติมเกี่ยวกับการลบอัน คุณจะจบลงด้วยไฟล์ PNG ที่เล็กลงและปรับให้เหมาะสม เนื่องจากคำสั่งจะเขียนทับไฟล์ต้นฉบับตรวจสอบให้แน่ใจว่าได้สร้างการสำรองข้อมูลหรือใช้การควบคุมเวอร์ชัน
find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;
(ทดสอบบน GNU / Linux)
โปรไฟล์ที่ไม่ถูกต้องสามารถแก้ไขได้โดย:
หมายเหตุ:การแก้ปัญหานี้ใช้ห้องสมุด 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 ทำให้ภาพที่ส่งออกว่างเปล่า ฉันเพิ่งแก้ไขและขออภัยในความไม่สะดวก!
คุณสามารถแก้ไขได้ใน photoshop ...
เพื่อเพิ่มคำตอบที่ยอดเยี่ยมของ Glenn นี่คือสิ่งที่ฉันทำเพื่อค้นหาไฟล์ที่ผิด:
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 เพื่อแก้ไข
mogrify ./Installer/Images/installer_background.png
การทำเช่นนี้จะช่วยป้องกันไม่ให้คอมมิทเปลี่ยนแปลงทุกไฟล์ png เดี่ยวในที่เก็บเมื่อมีเพียงไม่กี่ไฟล์เท่านั้นที่ถูกแก้ไขจริง นอกจากนี้ยังมีข้อได้เปรียบในการแสดงไฟล์ที่ผิดพลาด
ฉันทดสอบสิ่งนี้บน Windows ด้วยคอนโซล Cygwinและ zsh shell ขอขอบคุณอีกครั้งที่Glennซึ่งเป็นคนที่กล่าวมาข้างต้นฉันแค่เพิ่มคำตอบเพราะปกติแล้วจะง่ายกว่าความคิดเห็น :)
find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;
PNG ที่ผิดพลาดทุกอย่างที่จะสร้างpngcrush: iCCP: known incorrect sRGB profile
ขอบคุณคำตอบที่ยอดเยี่ยมจากGlennฉันใช้ฟังก์ชั่น "mogrify * .png" ของImageMagik อย่างไรก็ตามฉันมีภาพฝังอยู่ในโฟลเดอร์ย่อยดังนั้นฉันจึงใช้สคริปต์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)
mogrify **/*.png
ได้
มีวิธีที่ง่ายกว่าในการแก้ไขปัญหานี้ด้วย Mac OS และ Homebrew:
ติดตั้ง 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) และคัดลอกทุกสิ่งไปยังคลิปบอร์ด หลังจากนั้นคุณเพียงแค่เปิดด้วยเครื่องมือดูตัวอย่างโดยใช้ "ใหม่จากคลิปบอร์ด" เลือกพื้นที่ 128x128 พิกเซลรอบ ๆ ไอคอนคัดลอกใช้ "ใหม่จากคลิปบอร์ด" อีกครั้งแล้วส่งออกเป็น PNG คุณไม่จำเป็นต้องเรียกใช้เครื่องมือ pngfix
หลังจากลองใช้คำแนะนำสองสามข้อในหน้านี้ฉันลงเอยด้วยการใช้โซลูชัน pngcrush คุณสามารถใช้สคริปต์ทุบตีด้านล่างเพื่อตรวจหาและแก้ไขโปรไฟล์ 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"
pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8
แต่ pngcrush ของฉันไม่มี-warn
หรือตั้ง-reduce
ค่าสถานะดังนั้นโซลูชันนี้ใช้งานไม่ได้
ข้อมูลพื้นฐานบางอย่างเกี่ยวกับสิ่งนี้:
การเปลี่ยนแปลงบางอย่างใน libpng เวอร์ชั่น 1.6+ ทำให้เกิดการเตือนหรือทำงานไม่ถูกต้องกับโปรไฟล์ HP / MS sRGB ดั้งเดิมซึ่งนำไปสู่ stderr ต่อไปนี้: คำเตือน libpng: iCCP: รู้จักโปรไฟล์ sRGB ไม่ถูกต้องโปรไฟล์เก่าใช้ D50 whitepoint ที่ D65 เป็นมาตรฐาน โปรไฟล์นี้ไม่ใช่เรื่องแปลกที่ Adobe Photoshop ใช้งานถึงแม้ว่าจะไม่ได้ฝังอยู่ในรูปภาพก็ตาม
(ที่มา: https://wiki.archlinux.org/index.php/Libpng_errors )
การตรวจจับข้อผิดพลาดในบางชิ้นได้รับการปรับปรุง โดยเฉพาะอย่างยิ่งผู้อ่านอัน iCCP ตอนนี้ทำการตรวจสอบรูปแบบพื้นฐานที่สมบูรณ์ โปรไฟล์ไม่ดีบางส่วนที่เคยยอมรับมาก่อนถูกปฏิเสธโดยเฉพาะโปรไฟล์ Microsoft / HP sRGB ที่เก่ามาก ข้อกำหนดข้อกำหนด PNG ที่มีเพียงโปรไฟล์ระดับสีเทาเท่านั้นที่อาจปรากฏในภาพที่มีประเภทสี 0 หรือ 4 และแม้ว่ารูปภาพจะมีพิกเซลสีเทาเท่านั้นโปรไฟล์ RGB เท่านั้นที่อาจปรากฏในภาพที่มีประเภทสี 2, 3 หรือ 6 เท่านั้น ก้อน sRGB ได้รับอนุญาตให้ปรากฏในภาพที่มีประเภทสีใด ๆ
การใช้โปรแกรมแสดงภาพ IrfanView ใน Windows ฉันเพียงแค่บันทึกภาพ PNG ใหม่และแก้ไขปัญหา
การขยายโซลูชัน 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 โฟลเดอร์
ฉันรันทั้งสองคำสั่งในรูทของโครงการและแก้ไข
เปลี่ยนเส้นทางเอาต์พุตของคำสั่ง "find" ไปยังไฟล์ข้อความโดยทั่วไปเพื่อใช้เป็นรายการไฟล์ที่คุณต้องการประมวลผล จากนั้นคุณสามารถอ่านไฟล์ข้อความนั้นเป็น "mogrify" โดยใช้แฟล็ก "@":
find * .png -mtime -1> list.txt
mogrify - resize 50% @ list.txt
ซึ่งจะใช้ "find" เพื่อรับภาพ * .png ทั้งหมดที่ใหม่กว่า 1 วันแล้วพิมพ์ลงในไฟล์ที่ชื่อว่า "list.txt" จากนั้น "mogrify" อ่านรายการประมวลผลภาพและเขียนทับต้นฉบับด้วยรุ่นที่ปรับขนาดแล้ว อาจมีความแตกต่างเล็กน้อยในพฤติกรรมของ "ค้นหา" จากระบบหนึ่งไปอีกระบบหนึ่งดังนั้นคุณจะต้องตรวจสอบหน้าคู่มือสำหรับการใช้งานที่แน่นอน
นี่คือคำตอบที่ดุร้ายกำลังดุร้าย:
ฉันแก้ไขสคริปต์ gradlew นี่คือคำสั่ง exec ใหม่ของฉันที่ท้ายไฟล์ใน
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**