개발/C++

libpng 경고 : iCCP : 알려진 잘못된 sRGB 프로필

MinorMan 2020. 9. 24. 00:34
반응형

<질문>

SDL을 사용하여 PNG 이미지를로드하려고하는데 프로그램이 작동하지 않고이 오류가 콘솔에 나타납니다.

libpng 경고 : iCCP : 알려진 잘못된 sRGB 프로필

이 경고가 나타나는 이유는 무엇입니까? 이 문제를 해결하려면 어떻게해야합니까?


<답변1>

Libpng-1.6은 이전 버전보다 ICC 프로파일 검사에 대해 더 엄격합니다. 경고를 무시할 수 있습니다. 이를 제거하려면 PNG 이미지에서 iCCP 청크를 제거하십시오.

일부 응용 프로그램은 경고를 오류로 처리합니다. 그러한 응용 프로그램을 사용하는 경우 청크를 제거해야합니다. ImageMagick과 같은 다양한 PNG 편집기를 사용하여이를 수행 할 수 있습니다.

convert in.png out.png

폴더 (디렉토리)의 모든 PNG 파일에서 잘못된 iCCP 청크를 제거하려면 ImageMagick에서 mogrify를 사용할 수 있습니다.

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

<답변2>

pngcrush를 사용하여 png 파일에서 잘못된 sRGB 프로필을 제거합니다.

pngcrush -ow -rem allb -reduce file.png
  • -ow는 입력 파일을 덮어 씁니다.
  • -rem allb는 tRNS 및 gAMA를 제외한 모든 보조 청크를 제거합니다.
  • -reduce는 무손실 색상 유형 또는 비트 심도 감소를 수행합니다.

콘솔 출력에서 Removed the sRGB chunk 및 가능하면 청크 제거에 대한 추가 메시지가 표시되어야합니다. 더 작고 최적화 된 PNG 파일이 생성됩니다. 명령이 원본 파일을 덮어 쓰므로 백업을 생성하거나 버전 제어를 사용해야합니다.


<답변3>

잘못된 프로필은 다음과 같은 방법으로 수정할 수 있습니다.

참고 :이 솔루션은 Qt 라이브러리를 사용합니다.

다음은 제안 된 솔루션을 구현하는 방법을 보여주기 위해 C ++로 작성한 최소한의 예제입니다.

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

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

이 예제를 기반으로 한 GUI 애플리케이션의 전체 소스 코드는 GitHub에서 사용할 수 있습니다.

2019 년 5 월 12 일 업데이트 : 대답은 여전히 유효하지만 GitHub에서 공유 한 GUI 애플리케이션에 버그가있어 출력 이미지가 비어 있습니다. 방금 수정했으며 불편을 끼쳐 드려 죄송합니다!


<답변4>

포토샵에서이 문제를 해결할 수도 있습니다.


<답변5>

Glenn의 훌륭한 답변에 추가하기 위해 결함이있는 파일을 찾기 위해 수행 한 작업은 다음과 같습니다.

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

pngcrush는 ** / *. png에 의해 반환 된 많은 인수를 처리 할 수 없기 때문에 find 및 xargs를 사용했습니다. -print0 및 -0은 공백이 포함 된 파일 이름을 처리하는 데 필요합니다.

그런 다음 출력에서 다음 줄을 검색합니다. iCCP : 편집 된 알려진 sRGB 프로필을 인식하지 못합니다.

./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 파일을 커밋으로 변경하는 것을 방지 할 수 있습니다. 또한 결함이있는 파일을 정확하게 표시 할 수있는 장점이 있습니다.

Cygwin 콘솔과 zsh 셸을 사용하여 Windows에서 이것을 테스트했습니다. 위의 대부분을 입력 한 Glenn에게 다시 한 번 감사 드리며, 일반적으로 댓글보다 찾기 쉽기 때문에 답변을 추가하고 있습니다. :)


<답변6>

Glenn의 환상적인 답변 덕분에 ImageMagik의 "mogrify * .png"기능을 사용했습니다. 그러나 하위 폴더에 이미지가 묻혀 있었기 때문에이 간단한 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)

<답변7>

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 응용 프로그램을 사용하여 아이콘을 만드는 것입니다. 흰색 배경의 슬라이드 위에 약 120x120 픽셀 크기의 Keynote를 사용하여 그립니다 (다각형을 편집 가능하게 만드는 옵션이 좋습니다!). 미리보기로 내보내기 전에 아이콘 주위에 사각형을 그리고 (채우기 나 그림자없이, 외곽선 만, 약 135x135 크기) 모든 것을 클립 보드에 복사합니다. 그런 다음 "클립 보드에서 새로 만들기"를 사용하여 미리보기 도구로 열고 아이콘 주위에 128x128 픽셀 영역을 선택하고 복사 한 다음 "클립 보드에서 새로 만들기"를 다시 사용하고 PNG로 내 보내면됩니다. pngfix 도구를 실행할 필요가 없습니다.


<답변8>

이 페이지에서 몇 가지 제안을 시도한 후 pngcrush 솔루션을 사용하게되었습니다. 아래 bash 스크립트를 사용하여 잘못된 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"

<답변9>

이에 대한 배경 정보 :

libpng 버전 1.6+의 일부 변경 사항으로 인해 경고가 발생하거나 원래 HP / MS sRGB 프로필에서 제대로 작동하지 않아 다음과 같은 stderr이 발생합니다. libpng 경고 : iCCP : 알려진 잘못된 sRGB 프로필 이전 프로필은 D50 화이트 포인트를 사용합니다. 여기서 D65는 표준입니다. 이 프로필은 기본적으로 이미지에 포함되지 않았지만 Adobe Photoshop에서 사용되는 드문 일이 아닙니다.

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

일부 청크에서 오류 감지가 향상되었습니다. 특히 iCCP 청크 리더는 이제 기본 형식에 대한 완전한 검증을 수행합니다. 이전에 승인 된 일부 잘못된 프로필, 특히 매우 오래된 손상된 Microsoft / HP sRGB 프로필은 이제 거부됩니다. 그레이 스케일 프로필 만 색상 유형 0 또는 4의 이미지에 나타날 수 있으며 이미지에 회색 픽셀 만 포함되어 있더라도 RGB 프로필 만 색상 유형 2, 3 또는 6의 이미지에 나타날 수 있다는 PNG 사양 요구 사항이 적용됩니다. sRGB 청크는 모든 색상 유형의 이미지에 표시 할 수 있습니다.

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


<답변10>

Windows에서 IrfanView 이미지 뷰어를 사용하여 PNG 이미지를 다시 저장하고 문제를 해결했습니다.


<답변11>

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 개의 폴더에 있습니다.


<답변12>

이 두 명령을 프로젝트의 루트에서 실행했고 수정했습니다.

기본적으로 "find"명령의 출력을 텍스트 파일로 리디렉션하여 처리 할 파일 목록으로 사용합니다. 그런 다음 "@"플래그를 사용하여 해당 텍스트 파일을 "mogrify"로 읽을 수 있습니다.

find * .png -mtime -1> list.txt mogrify -resize 50 % @ list.txt

"find"를 사용하여 1 일 이전의 모든 * .png 이미지를 가져와 "list.txt"라는 파일로 인쇄합니다. 그런 다음 "mogrify"는 해당 목록을 읽고 이미지를 처리하고 크기가 조정 된 버전으로 원본을 덮어 씁니다. 한 시스템에서 다른 시스템으로 "찾기"동작에 약간의 차이가있을 수 있으므로 정확한 사용법은 매뉴얼 페이지를 확인해야합니다.


<답변13>

엄청나게 무차별 대입 대답은 다음과 같습니다.

gradlew 스크립트를 수정했습니다. 다음은 파일 끝에있는 새 exec 명령입니다.

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**
반응형