cảnh báo libpng: iCCP: biết hồ sơ sRGB không chính xác


173

Tôi đang cố tải hình ảnh PNG bằng SDL nhưng chương trình không hoạt động và lỗi này xuất hiện trong bảng điều khiển

cảnh báo libpng: iCCP: biết hồ sơ sRGB không chính xác

Tại sao cảnh báo này xuất hiện? Tôi nên làm gì để giải quyết vấn đề này?



Câu trả lời:


180

Libpng-1.6 nghiêm ngặt hơn trong việc kiểm tra hồ sơ ICC so với các phiên bản trước. Bạn có thể bỏ qua cảnh báo. Để loại bỏ nó, hãy xóa đoạn iCCP khỏi hình ảnh PNG.

Một số ứng dụng coi cảnh báo là lỗi; nếu bạn đang sử dụng một ứng dụng như vậy, bạn phải loại bỏ đoạn này. Bạn có thể làm điều đó với bất kỳ trình chỉnh sửa PNG nào như ImageMagick's

convert in.png out.png

Để xóa đoạn iCCP không hợp lệ khỏi tất cả các tệp PNG trong một thư mục (thư mục), bạn có thể sử dụng mogrifytừ ImageMagick:

mogrify *.png

Điều này đòi hỏi ImageMagick của bạn được xây dựng với libpng16. Bạn có thể dễ dàng kiểm tra nó bằng cách chạy:

convert -list format | grep PNG

Nếu bạn muốn tìm ra những tập tin nào cần được sửa chữa thay vì xử lý một cách mù quáng tất cả chúng, bạn có thể chạy

pngcrush -n -q *.png

trong đó -nphương tiện không ghi lại các tệp và -qcó nghĩa là triệt tiêu hầu hết đầu ra ngoại trừ các cảnh báo. Xin lỗi, không có tùy chọn nào trong pngcrush để đàn áp mọi thứ trừ các cảnh báo.


Các bản phát hành nhị phân của ImageMagick đang ở đây


Đối với Dự án Android (Android Studio) điều hướng vào resthư mục.

Ví dụ:

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

13
Với ImageMagick, bạn có thể sử dụng lệnh -strip . Cụ thể, tôi đã sử dụng mogrify để ảnh hưởng đến tất cả các hình ảnh trong một thư mục. Lệnh của tôi trông như thế này: mogrify -strip * .png
Maxito

24
Tùy chọn -strip sẽ xóa tất cả các cấu hình. Nếu bạn bỏ qua tùy chọn -strip ( mogrify * .png ), chỉ các cấu hình không chính xác sẽ bị xóa.
Glenn Randers-Pehrson

2
Có cách nào để tìm ra tập tin nào đang kích hoạt cảnh báo không? Chạy mogrify **/*.pngdường như sửa đổi tất cả các tập tin trong cây. Tôi chỉ muốn cập nhật một hình ảnh bị lỗi.
Uflex

1
Sử dụng find . -type f -name '*.png' -execute mogrify \{\} \;để sửa đổi đệ quy .pngcác tập tin trong thư mục hiện tại.
val nói Phục hồi lại

Các tệp nhị phân ImageMagick đã đóng băng máy tính của tôi, có thể do làm việc quá sức và sau khi để qua đêm, phải khởi động lại mạnh mẽ. Đã sử dụng ứng dụng pngcrush để phát hiện sự cố như đã đề cập, -owghi đè và sửa tệp và cũng giảm kích thước khoảng 1/6! Chỉ cần lấy mã nguồn của chương trình cho máy mac của tôi, biên dịch, cài đặt thủ công và chạy nó. GitHub Kjuly / pngcrush có thể có một nhị phân được biên dịch sẵn, nhưng không chắc chắn. Sourceforge dường như chỉ có sẵn exe của Windows và mã nguồn. Câu trả lời của Friederbluemle dường như làm điều này và hơn thế nữa.
Pysis

73

Sử dụng pngcrushđể xóa hồ sơ sRGB không chính xác khỏi tệp png:

pngcrush -ow -rem allb -reduce file.png
  • -ow sẽ ghi đè lên tập tin đầu vào
  • -rem allb sẽ loại bỏ tất cả các phần phụ trợ trừ tRNS và gAMA
  • -reduce không loại màu không mất hoặc giảm độ sâu bit

Trong đầu ra giao diện điều khiển, bạn sẽ thấy Removed the sRGB chunkvà có thể có nhiều thông báo hơn về việc loại bỏ khối. Bạn sẽ kết thúc với một tệp PNG nhỏ hơn, được tối ưu hóa. Vì lệnh sẽ ghi đè lên tệp gốc, hãy đảm bảo tạo bản sao lưu hoặc sử dụng kiểm soát phiên bản.


7
Điều đó đã làm việc! Thực hiện đệ quy từ thư mục hiện tại, đặt tệp này vào tệp .bat: Dành cho / R %% i trong (* .png) làm PNGCRUSH.EXE -ow -rem allb -reduce %% i
Andy Brice

13
Và một lớp lót cho * nix để sửa chữa đệ quy tất cả các tệp png trong thư mục hiện tại: find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;(Đã thử nghiệm trên GNU / Linux)
Friederbluemle 16/2/2016

2
Trên dòng bởi Frieder cũng hoạt động bên trong git bash trên windows.
iKlsR

Pngcrush không loại bỏ đoạn này trong trường hợp của tôi. Nhưng mogrify của fantemagick đã làm điều đó.
Nikos

25

Giải pháp

Hồ sơ không chính xác có thể được sửa bởi:

  1. Mở hình ảnh với cấu hình không chính xác bằng QPixmap :: load
  2. Lưu hình ảnh trở lại đĩa (đã có cấu hình chính xác) bằng QPixmap :: save

Lưu ý: Giải pháp này sử dụng Thư viện Qt .

Thí dụ

Dưới đây là một ví dụ tối thiểu tôi đã viết bằng C ++ để trình bày cách triển khai giải pháp đề xuất:

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

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

Mã nguồn hoàn chỉnh của ứng dụng GUI dựa trên ví dụ này có sẵn trên GitHub .

CẬP NHẬT TỪ NGÀY 05.12.2019: Câu trả lời đã và vẫn còn hiệu lực, tuy nhiên có một lỗi trong ứng dụng GUI tôi đã chia sẻ trên GitHub, khiến hình ảnh đầu ra bị trống. Tôi vừa sửa nó và xin lỗi vì sự bất tiện này!


4
Tôi ngạc nhiên khi câu trả lời này không được đánh giá cao. Nó không yêu cầu cài đặt bất cứ thứ gì và nó hoạt động ... những gì người ta có thể yêu cầu nhiều hơn :)
Quantuple 17/2/2017

17

Bạn cũng có thể sửa lỗi này trong photoshop ...

  1. Mở tệp .png của bạn.
  2. Tệp -> Lưu dưới dạng và trong hộp thoại mở ra bỏ chọn "Hồ sơ ICC: sRGB IEC61966-2.1"
  3. Bỏ chọn "Là bản sao".
  4. Can đảm lưu lại .png ban đầu của bạn.
  5. Tiếp tục với cuộc sống của bạn khi biết rằng bạn đã loại bỏ một chút tà ác khỏi thế giới.

8

Để thêm vào câu trả lời tuyệt vời của Glenn, đây là những gì tôi đã làm để tìm tệp nào bị lỗi:

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

Tôi đã sử dụng find và xargs vì pngcrush không thể xử lý nhiều đối số (được trả về bởi **/*.png). Các -print0-0được yêu cầu để xử lý tên tập tin chứa khoảng trắng.

Sau đó tìm kiếm trong đầu ra cho các dòng này : 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

Và đối với mỗi người trong số họ, hãy chạy mogrify trên nó để sửa chúng.

mogrify ./Installer/Images/installer_background.png

Làm điều này ngăn chặn việc cam kết thay đổi mọi tệp png duy nhất trong kho lưu trữ khi chỉ một số ít thực sự được sửa đổi. Thêm vào đó, nó có lợi thế để hiển thị chính xác các tập tin bị lỗi.

Tôi đã thử nghiệm điều này trên Windows với bảng điều khiển Cygwin và vỏ zsh. Một lần nữa xin cảm ơn Glenn , người đã đưa ra hầu hết những điều trên, tôi chỉ thêm một câu trả lời vì nó thường dễ tìm hơn bình luận :)


3
Trên Debian, để tìm các tệp có vấn đề trong phần mềm của tôi, tôi đã sử dụng find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;Mọi PNG bị lỗi sẽ tạo rapngcrush: iCCP: known incorrect sRGB profile
Gabriel Devillers

7

Nhờ câu trả lời tuyệt vời từ Glenn , tôi đã sử dụng chức năng "mogrify * .png" của ImageMagik . Tuy nhiên, tôi đã có hình ảnh được chôn trong các thư mục con, vì vậy tôi đã sử dụng tập lệnh Python đơn giản này để áp dụng điều này cho tất cả các hình ảnh trong tất cả các thư mục phụ và nghĩ rằng nó có thể giúp người khác:

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
Đây là nền tảng chéo độc đáo, mặc dù nếu bạn đang ở trên một nền tảng hỗ trợ lớp vỏ * NIX-y đẹp như Zsh hoặc Bash, bạn chỉ có thể sử dụng mogrify **/*.png.
Kyle Strand

1
Vâng, điểm tốt. Tôi chỉ sử dụng Python vì chúng tôi phát triển trên Windows và Linux và muốn cam kết tập lệnh này với repo của chúng tôi để sử dụng trong tương lai.
Devan Williams

5

Có một cách dễ dàng hơn để khắc phục sự cố này với Mac OS và Homebrew:

Cài đặt homebrew nếu nó chưa được cài đặt

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

hoặc để làm điều đó với mọi tệp trong thư mục hiện tại:

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

Nó sẽ tạo một bản sao cố định cho mỗi tệp png trong thư mục hiện tại và đặt nó trong thư mục con tmp. Sau đó, nếu mọi thứ đều ổn, bạn chỉ cần ghi đè lên các tệp gốc.

Một mẹo khác là sử dụng các ứng dụng Keynote và Preview để tạo các biểu tượng. Tôi vẽ chúng bằng Keynote, với kích thước khoảng 120x120 pixel, trên một slide có nền trắng (tùy chọn để tạo đa giác có thể chỉnh sửa là tuyệt vời!). Trước khi xuất sang Xem trước, tôi vẽ một hình chữ nhật xung quanh biểu tượng (không có bất kỳ hình tô hoặc bóng nào, chỉ là đường viền, với kích thước khoảng 135x135) và sao chép mọi thứ vào bảng tạm. Sau đó, bạn chỉ cần mở nó bằng công cụ Xem trước bằng cách sử dụng "Mới từ Clipboard", chọn vùng 128x128 pixel xung quanh biểu tượng, sao chép, sử dụng lại "Mới từ Clipboard" và xuất nó sang PNG. Bạn sẽ không cần chạy công cụ pngfix.


1
Tôi đã không tìm thấy pngfix trong bản cài đặt OS El Capitan tiêu chuẩn (hoặc có lẽ tôi đã không tìm kiếm đủ tốt), nhưng tôi đã tìm thấy nó trong bản cài đặt MAMP mà tôi có. Làm việc hoàn hảo! Cảm ơn! Nâng cấp
guido

Bạn đúng rồi! Tôi đã cài đặt nó với "brew install libpng" từ lâu.
Adriel Jr

Tôi đã nhận được "n! Ew ERR 08 đọc Undinite_error: _0 Undinite_error: _0 not_a_PNG_ (too_short) car.png" khi chạy cái này vào 10.13.2.
Mitch

@Mitch Vẫn chạy ổn sau khi nâng cấp lên 10.13.6.
Adriel Jr

4

Sau khi thử một vài gợi ý trên trang này, tôi đã kết thúc bằng cách sử dụng giải pháp pngcrush. Bạn có thể sử dụng tập lệnh bash bên dưới để phát hiện đệ quy và sửa các cấu hình png xấu. Chỉ cần truyền cho nó đường dẫn đầy đủ đến thư mục bạn muốn tìm kiếm tệp png.

fixpng "/path/to/png/folder"

Kịch bản:

#!/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
Điều này xứng đáng được nâng cao hơn. Tất cả các giải pháp khác chạm vào mọi tệp, điều này đặc biệt tệ nếu bạn có nhiều hình ảnh trong hệ thống kiểm soát phiên bản. Cảm ơn kịch bản!
kfunk

Tôi có pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8nhưng pngcrush của tôi không có -warncũng không -reducecờ vì vậy giải pháp này không hoạt động.
pbhj

4

Một số thông tin cơ bản về điều này:

Một số thay đổi trong phiên bản libpng 1.6+ khiến nó đưa ra cảnh báo hoặc thậm chí không hoạt động chính xác với cấu hình sRGB HP / MS ban đầu, dẫn đến cảnh báo stderr: libpng sau: iCCP: hồ sơ sRGB không chính xác Cấu hình cũ sử dụng bảng trắng D50, trong đó D65 là tiêu chuẩn. Cấu hình này không phải là hiếm, đang được Adobe Photoshop sử dụng, mặc dù nó không được nhúng vào hình ảnh theo mặc định.

(nguồn: https://wiki.archlinux.org/index.php/Libpng_errors )

Phát hiện lỗi trong một số khối đã được cải thiện; đặc biệt là trình đọc đoạn mã iCCP hiện xác thực khá đầy đủ định dạng cơ bản. Một số cấu hình xấu đã được chấp nhận trước đây hiện bị từ chối, đặc biệt là cấu hình sRGB Microsoft / HP đã bị hỏng rất cũ. Yêu cầu thông số kỹ thuật PNG chỉ các cấu hình thang độ xám có thể xuất hiện trong các hình ảnh có loại màu 0 hoặc 4 và ngay cả khi hình ảnh chỉ chứa các pixel màu xám, chỉ các cấu hình RGB có thể xuất hiện trong các hình ảnh có loại màu 2, 3 hoặc 6, hiện được thi hành. Đoạn sRGB được phép xuất hiện trong ảnh với bất kỳ loại màu nào.

(nguồn: https://forum.qt.io/topic/58638/solve-libpng-warning-iccp- Unknown-inc chính-sgb-profile-drive-me-nuts / 16 )


3

Sử dụng trình xem ảnh IrfanView trong Windows, tôi chỉ cần lưu lại hình ảnh PNG và điều đó đã khắc phục vấn đề.


1

Mở rộng giải pháp Friederbluemle, tải xuống pngcrush và sau đó sử dụng mã như thế này nếu bạn đang chạy nó trên nhiều tệp 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)

ở đây tất cả các tệp png liên quan đến các dự án đều nằm trong 1 thư mục.


0

Tôi đã chạy hai lệnh đó trong thư mục gốc của dự án và nó đã được sửa.

Về cơ bản chuyển hướng đầu ra của lệnh "find" sang tệp văn bản để sử dụng làm danh sách các tệp của bạn để xử lý. Sau đó, bạn có thể đọc tệp văn bản đó thành "mogrify" bằng cách sử dụng cờ "@":

tìm * .png -mtime -1> list.txt

mogrify -resize 50% @ list.txt

Điều đó sẽ sử dụng "find" để có được tất cả các hình ảnh * .png mới hơn 1 ngày và in chúng thành một tệp có tên "list.txt". Sau đó, "mogrify" đọc danh sách đó, xử lý hình ảnh và ghi đè lên bản gốc bằng các phiên bản đã thay đổi kích thước. Có thể có sự khác biệt nhỏ trong hành vi "tìm" từ hệ thống này sang hệ thống khác, vì vậy bạn sẽ phải kiểm tra trang man để biết cách sử dụng chính xác.


-2

Đây là một câu trả lời vũ phu nực cười:

Tôi đã sửa đổi tập lệnh gradlew. Đây là lệnh exec mới của tôi ở cuối tập tin trong

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.