คำเตือน libpng: iCCP: รู้จักโปรไฟล์ sRGB ไม่ถูกต้อง


173

ฉันกำลังพยายามโหลดภาพ PNG โดยใช้ SDL แต่โปรแกรมไม่ทำงานและข้อผิดพลาดนี้ปรากฏขึ้นในคอนโซล

คำเตือน libpng: iCCP: รู้จักโปรไฟล์ sRGB ไม่ถูกต้อง

เหตุใดคำเตือนนี้จึงปรากฏขึ้น ฉันควรทำอย่างไรเพื่อแก้ไขปัญหานี้



คำตอบ:


180

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

13
ด้วย ImageMagick คุณสามารถใช้คำสั่ง-strip โดยเฉพาะฉันใช้mogrifyส่งผลกระทบต่อรูปภาพทั้งหมดในโฟลเดอร์ คำสั่งของฉันมีลักษณะเช่นนี้: mogrify -strip * .png
Maxito

24
ตัวเลือก -strip จะลบโปรไฟล์ทั้งหมด หากคุณไม่ใช้ตัวเลือก -strip ( mogrify * .png ) จะลบเฉพาะโปรไฟล์ที่ไม่ถูกต้อง
Glenn Randers-Pehrson

2
มีวิธีในการค้นหาไฟล์ที่เรียกใช้คำเตือนหรือไม่? การรันmogrify **/*.pngดูเหมือนจะแก้ไขไฟล์ทั้งหมดในแผนผัง ฉันต้องการอัปเดตภาพที่ผิดพลาดเพียงภาพเดียว
Uflex

1
ใช้find . -type f -name '*.png' -execute mogrify \{\} \;เพื่อแก้ไข.pngไฟล์ซ้ำ ๆในไดเรกทอรีปัจจุบัน
วาลพูดว่า Reinstate Monica

หาก ImageMagick ไบนารีหยุดทำงานคอมพิวเตอร์ของฉันอาจทำงานหนักเกินไปและหลังจากออกจากข้ามคืนต้องเริ่มต้นใหม่อย่างแข็งขัน ใช้แอปพลิเคชัน pngcrush เพื่อตรวจสอบปัญหาดังกล่าว-owเพื่อเขียนทับและแก้ไขไฟล์และลดขนาดลงประมาณ 1 / 6th! เพิ่งได้รับซอร์สโค้ดของโปรแกรมสำหรับ mac ของฉันคอมไพล์ติดตั้งด้วยตนเองและรัน GitHub Kjuly / pngcrush อาจมีไบนารีที่คอมไพล์แล้ว แต่ไม่แน่ใจ Sourceforge ดูเหมือนจะมี Windows exe พร้อมใช้งานและซอร์สโค้ดเท่านั้น คำตอบของ Friederbluemle ดูเหมือนว่าจะทำเช่นนี้และอื่น ๆ
Pysis

73

ใช้pngcrushเพื่อลบโปรไฟล์ sRGB ที่ไม่ถูกต้องออกจากไฟล์ png:

pngcrush -ow -rem allb -reduce file.png
  • -ow จะเขียนทับไฟล์อินพุต
  • -rem allb จะลบส่วนเสริมทั้งหมดยกเว้น tRNS และ gAMA
  • -reduce การสูญเสียสีประเภทหรือการลดความลึกบิต

ในเอาต์พุตคอนโซลคุณควรเห็นRemoved the sRGB chunkและอาจมีข้อความเพิ่มเติมเกี่ยวกับการลบอัน คุณจะจบลงด้วยไฟล์ PNG ที่เล็กลงและปรับให้เหมาะสม เนื่องจากคำสั่งจะเขียนทับไฟล์ต้นฉบับตรวจสอบให้แน่ใจว่าได้สร้างการสำรองข้อมูลหรือใช้การควบคุมเวอร์ชัน


7
นั่นได้ผล! ทำซ้ำจากโฟลเดอร์ปัจจุบันใส่ไว้ในไฟล์. bat: สำหรับ / R %% i ใน (* .png) ทำ PNGCRUSH.EXE - ต่ำ -rem allb -reduce %% i
Andy Brice

13
และหนึ่งซับสำหรับ * nix เพื่อแก้ไขไฟล์ png ซ้ำ ๆ ในไดเรกทอรีปัจจุบัน: find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;(ทดสอบบน GNU / Linux)
Friederbluemle

2
บรรทัดข้างต้นโดย Frieder ทำงานในทุบตีคอมไพล์บน windows เช่นกัน
iKlsR

Pngcrush ไม่ลบอันนี้ในกรณีของฉัน แต่เจ้าเล่ห์ของ imagemagick ก็ทำเช่นนั้น
Nikos

25

สารละลาย

โปรไฟล์ที่ไม่ถูกต้องสามารถแก้ไขได้โดย:

  1. การเปิดรูปภาพด้วยโพรไฟล์ที่ไม่ถูกต้องโดยใช้QPixmap :: load
  2. การบันทึกอิมเมจกลับไปที่ดิสก์ (พร้อมโพรไฟล์ที่ถูกต้องแล้ว) โดยใช้QPixmap :: save

หมายเหตุ:การแก้ปัญหานี้ใช้ห้องสมุด 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 ทำให้ภาพที่ส่งออกว่างเปล่า ฉันเพิ่งแก้ไขและขออภัยในความไม่สะดวก!


4
ฉันประหลาดใจที่คำตอบนี้ไม่ได้รับการโหวต ไม่จำเป็นต้องติดตั้งอะไรและใช้งานได้ ... สิ่งใดที่เราสามารถขอได้อีก :)
Quantuple

17

คุณสามารถแก้ไขได้ใน photoshop ...

  1. เปิดไฟล์. png ของคุณ
  2. ไฟล์ -> บันทึกเป็นและในกล่องโต้ตอบที่เปิดขึ้นไม่เลือก "โปรไฟล์ ICC: sRGB IEC61966-2.1"
  3. ยกเลิกการทำเครื่องหมาย "เป็นสำเนา"
  4. ประหยัดอย่างกล้าหาญมากกว่า. png ดั้งเดิมของคุณ
  5. ก้าวต่อไปกับชีวิตของคุณโดยรู้ว่าคุณได้กำจัดความชั่วร้ายเพียงเล็กน้อยจากโลกนี้

8

เพื่อเพิ่มคำตอบที่ยอดเยี่ยมของ 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ซึ่งเป็นคนที่กล่าวมาข้างต้นฉันแค่เพิ่มคำตอบเพราะปกติแล้วจะง่ายกว่าความคิดเห็น :)


3
ใน Debian เพื่อค้นหาไฟล์ที่มีปัญหาในซอฟต์แวร์ของฉันฉันใช้find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;PNG ที่ผิดพลาดทุกอย่างที่จะสร้างpngcrush: iCCP: known incorrect sRGB profile
Gabriel Devillers

7

ขอบคุณคำตอบที่ยอดเยี่ยมจาก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)

2
นี่เป็น cross-platform อย่างดีแม้ว่าคุณจะอยู่บนแพลตฟอร์มที่รองรับเชลล์ * NIX-y ที่ดีเช่น Zsh หรือ Bash คุณสามารถใช้งานmogrify **/*.pngได้
Kyle Strand

1
ใช่เป็นจุดที่ดี ฉันใช้ Python เพียงเพราะเราพัฒนาบน Windows และ Linux และต้องการยอมรับสคริปต์นี้กับ repo ของเราเพื่อใช้ในอนาคต
Devan Williams

5

มีวิธีที่ง่ายกว่าในการแก้ไขปัญหานี้ด้วย 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


1
ฉันไม่พบ pngfix ในการติดตั้ง OS El Capitan มาตรฐาน (หรือบางทีฉันค้นหาไม่ดีพอ) แต่ฉันพบในการติดตั้ง MAMP ที่ฉันมี ทำงานอย่างสมบูรณ์แบบ! ขอบคุณ! อัปเดตแล้ว
guido

คุณพูดถูก! ฉันติดตั้งมันด้วย "brew install libpng" เมื่อนานมาแล้ว
Adriel Jr

ฉันได้ "n! ew ERR 08 อ่าน Undefined_error: _0 Undefined_error: _0 not_a_PNG_ (too_short) car.png" เมื่อใช้งานใน 10.13.2
มิทช์

@Mitch ยังคงทำงานได้หลังจากอัปเกรดเป็น 10.13.6
Adriel Jr

4

หลังจากลองใช้คำแนะนำสองสามข้อในหน้านี้ฉันลงเอยด้วยการใช้โซลูชัน 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"

2
สิ่งนี้สมควรได้รับการโหวตมากขึ้น โซลูชันอื่น ๆ ทั้งหมดแตะทุกไฟล์ซึ่งไม่ดีโดยเฉพาะหากคุณมีรูปภาพจำนวนมากในระบบควบคุมเวอร์ชัน ขอบคุณสำหรับสคริปต์!
kfunk

ฉันมีpngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8แต่ pngcrush ของฉันไม่มี-warnหรือตั้ง-reduceค่าสถานะดังนั้นโซลูชันนี้ใช้งานไม่ได้
pbhj

4

ข้อมูลพื้นฐานบางอย่างเกี่ยวกับสิ่งนี้:

การเปลี่ยนแปลงบางอย่างใน 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 ได้รับอนุญาตให้ปรากฏในภาพที่มีประเภทสีใด ๆ

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


3

การใช้โปรแกรมแสดงภาพ IrfanView ใน Windows ฉันเพียงแค่บันทึกภาพ PNG ใหม่และแก้ไขปัญหา


1

การขยายโซลูชัน 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 โฟลเดอร์


0

ฉันรันทั้งสองคำสั่งในรูทของโครงการและแก้ไข

เปลี่ยนเส้นทางเอาต์พุตของคำสั่ง "find" ไปยังไฟล์ข้อความโดยทั่วไปเพื่อใช้เป็นรายการไฟล์ที่คุณต้องการประมวลผล จากนั้นคุณสามารถอ่านไฟล์ข้อความนั้นเป็น "mogrify" โดยใช้แฟล็ก "@":

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

mogrify - resize 50% @ list.txt

ซึ่งจะใช้ "find" เพื่อรับภาพ * .png ทั้งหมดที่ใหม่กว่า 1 วันแล้วพิมพ์ลงในไฟล์ที่ชื่อว่า "list.txt" จากนั้น "mogrify" อ่านรายการประมวลผลภาพและเขียนทับต้นฉบับด้วยรุ่นที่ปรับขนาดแล้ว อาจมีความแตกต่างเล็กน้อยในพฤติกรรมของ "ค้นหา" จากระบบหนึ่งไปอีกระบบหนึ่งดังนั้นคุณจะต้องตรวจสอบหน้าคู่มือสำหรับการใช้งานที่แน่นอน


-2

นี่คือคำตอบที่ดุร้ายกำลังดุร้าย:

ฉันแก้ไขสคริปต์ gradlew นี่คือคำสั่ง exec ใหม่ของฉันที่ท้ายไฟล์ใน

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.