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


173

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

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

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



답변:


180

Libpng-1.6은 이전 버전보다 ICC 프로파일을 확인하는 데 더 엄격합니다. 경고를 무시해도됩니다. 이를 제거하려면 PNG 이미지에서 iCCP 청크를 제거하십시오.

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

convert in.png out.png

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

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.
val은

ImageMagick 바이너리가 내 컴퓨터를 멈췄을 수도 있습니다. 너무 열심히 일하지 않아 밤새 떠난 후 강제로 다시 시작해야했습니다. 언급 한대로 문제를 감지하고 -ow파일을 덮어 쓰고 수정하며 크기를 약 1/6으로 줄이려면 pngcrush 응용 프로그램을 사용했습니다 ! 내 Mac의 프로그램 소스 코드를 가져 와서 컴파일하고 수동으로 설치 한 다음 실행해야했습니다. GitHub Kjuly / pngcrush에는 사전 컴파일 된 바이너리가있을 수 있지만 확실하지는 않습니다. Sourceforge는 Windows exe와 소스 코드 만 사용할 수있는 것 같습니다. friederbluemle의 답변이 더 많은 것으로 보입니다.
Pysis

73

pngcrushpng 파일에서 잘못된 sRGB 프로파일을 제거하는 데 사용하십시오 .

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

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


7
작동했습니다! 현재 폴더에서 재귀 적으로 이것을 .bat 파일에 넣으십시오. (* .png)에서 / R %% i의 경우 PNGCRUSH.EXE -ow -rem allb -reduce %% i
Andy Brice

13
그리고 반복적으로 현재 디렉토리에있는 모든 PNG 파일을 수정하려면 * nix에서 스크립트에 대한 한 줄 : find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;(GNU / 리눅스에서 테스트)
friederbluemle

2
볶음으로 위의 줄은 창에서 git bash 내부에서도 작동합니다.
iKlsR

Pngcrush는 내 경우 에이 청크를 제거하지 않습니다. 그러나 imagemagick의 mogrify가 그랬습니다.
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에서 사용 가능합니다 .

UPDATE FROM 05.12.2019 : 대답은 유효하고 여전히 유효하지만 GitHub에서 공유 한 GUI 응용 프로그램에 버그가있어 출력 이미지가 비어 있습니다. 방금 수정하여 불편을 드려 죄송합니다.


4
이 답변이 찬성되지 않은 것에 놀랐습니다. 그것은 아무것도 설치하지 않아도 작동합니다 ... 더 많은 것을 요청할 수있는 것들 :)
Quantuple

17

당신은 또한 포토샵에서 이것을 고칠 수 있습니다 ...

  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

pngcrush가 많은 인수를 처리 할 수 ​​없기 때문에 find와 xargs를 사용했습니다 (에 의해 반환 된 **/*.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 파일을 변경하지 못하게됩니다. 또한 결함이있는 파일을 정확하게 표시하는 이점이 있습니다.

Cygwin 콘솔 과 zsh 셸을 사용하여 Windows에서 이것을 테스트했습니다 . 위의 대부분을 넣은 Glenn 에게 다시 감사드립니다. 평소 의견보다 찾기가 더 쉽기 때문에 대답을 추가하고 있습니다. :)


3
데비안에서 소프트웨어에 문제가있는 파일을 찾기 위해 find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;모든 잘못된 PNG가 생성합니다pngcrush: iCCP: known incorrect sRGB profile
Gabriel Devillers

7

받는 사람 덕분에 환상적인 대답 에서 글렌은 , 내가 사용하는 이미지 매직 의 "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)

2
Zsh 나 Bash와 같은 멋진 * NIX-y 쉘을 지원하는 플랫폼을 사용하는 경우에는을 사용하면 mogrify **/*.png됩니다.
Kyle Strand

1
그래, 좋은 지적이야 우리는 Windows와 Linux에서 개발하고 나중에 사용할 수 있도록이 스크립트를 리포지토리에 커밋하려고했기 때문에 Python 만 사용했습니다.
Devan Williams 2016

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


1
표준 OS El Capitan 설치에서 pngfix를 찾지 못했거나 충분히 검색하지 못했지만 MAMP 설치에서 찾았습니다. 완벽하게 일했습니다! 감사! 공감
guido

당신이 맞아요! 오래 전에 "brew install libpng"로 설치했습니다.
Adriel Jr

10.13.2에서 이것을 실행할 때 "n! ew ERR 08 read Undefined_error : _0 Undefined_error : _0 not_a_PNG_ (too_short) car.png"를 얻었습니다.
Mitch

@Mitch는 10.13.6으로 업그레이드 한 후에도 여전히 정상적으로 실행됩니다.
Adriel Jr

4

이 페이지에서 몇 가지 제안을 시도한 후 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"

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 화이트 포인트를 사용합니다. D65가 표준입니다. 이 프로필은 기본적으로 이미지에 포함되지 않았지만 Adobe Photoshop에서 사용되는 드문 일이 아닙니다.

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

일부 청크의 오류 감지 기능이 향상되었습니다. 특히, iCCP 청크 리더는 이제 기본 형식에 대한 완전한 검증을 수행합니다. 이전에 승인 된 일부 불량 프로파일, 특히 아주 오래된 Microsoft / HP sRGB 프로파일이 거부되었습니다. 색상 유형이 0 또는 4 인 이미지에는 회색조 프로파일 만 나타날 수 있고 이미지에 회색 픽셀 만 포함 된 경우에도 2, 3 또는 6 색의 이미지에는 RGB 프로파일 만 나타날 수있는 PNG 사양 요구 사항이 적용됩니다. sRGB 청크는 모든 색상 유형의 이미지에 나타날 수 있습니다.

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


3

Windows에서 IrfanView 이미지 뷰어를 사용하여 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"로 읽을 수 있습니다.

* .png -mtime -1> list.txt 찾기

mogrify -resize 50 % @ list.txt

"find"를 사용하여 1 일보다 새로운 모든 * .png 이미지를 가져 와서 "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.