SDL을 사용하여 PNG 이미지를로드하려고하는데 프로그램이 작동하지 않고이 오류가 콘솔에 나타납니다.
libpng 경고 : iCCP : 알려진 잘못된 sRGB 프로파일
이 경고가 나타나는 이유는 무엇입니까? 이 문제를 해결하려면 어떻게해야합니까?
SDL을 사용하여 PNG 이미지를로드하려고하는데 프로그램이 작동하지 않고이 오류가 콘솔에 나타납니다.
libpng 경고 : iCCP : 알려진 잘못된 sRGB 프로파일
이 경고가 나타나는 이유는 무엇입니까? 이 문제를 해결하려면 어떻게해야합니까?
답변:
Libpng-1.6은 이전 버전보다 ICC 프로파일을 확인하는 데 더 엄격합니다. 경고를 무시해도됩니다. 이를 제거하려면 PNG 이미지에서 iCCP 청크를 제거하십시오.
일부 응용 프로그램은 경고를 오류로 취급합니다. 이러한 응용 프로그램을 사용하는 경우 청크를 제거해야합니다. ImageMagick과 같은 다양한 PNG 편집기로이를 수행 할 수 있습니다.
convert in.png out.png
폴더 (디렉토리)의 모든 PNG 파일에서 잘못된 iCCP 청크를 제거하려면 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/6으로 줄이려면 pngcrush 응용 프로그램을 사용했습니다 ! 내 Mac의 프로그램 소스 코드를 가져 와서 컴파일하고 수동으로 설치 한 다음 실행해야했습니다. GitHub Kjuly / pngcrush에는 사전 컴파일 된 바이너리가있을 수 있지만 확실하지는 않습니다. Sourceforge는 Windows exe와 소스 코드 만 사용할 수있는 것 같습니다. friederbluemle의 답변이 더 많은 것으로 보입니다.
pngcrush
png 파일에서 잘못된 sRGB 프로파일을 제거하는 데 사용하십시오 .
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 / 리눅스에서 테스트)
잘못된 프로필은 다음과 같이 수정 될 수 있습니다.
참고 : 이 솔루션은 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 응용 프로그램에 버그가있어 출력 이미지가 비어 있습니다. 방금 수정하여 불편을 드려 죄송합니다.
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 에게 다시 감사드립니다. 평소 의견보다 찾기가 더 쉽기 때문에 대답을 추가하고 있습니다. :)
find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;
모든 잘못된 PNG가 생성합니다pngcrush: iCCP: known incorrect sRGB profile
받는 사람 덕분에 환상적인 대답 에서 글렌은 , 내가 사용하는 이미지 매직 의 "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)
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 응용 프로그램을 사용하여 아이콘을 만드는 것입니다. 나는 약 120x120 픽셀 크기의 Keynote를 사용하여 흰색 배경의 슬라이드 위에 그립니다 (다각형을 편집 가능하게 만드는 옵션은 훌륭합니다!). 미리보기로 내보내기 전에 아이콘 주위에 사각형을 그립니다 (채우기 또는 그림자 없음, 윤곽선, 약 135x135 크기). 모든 것을 클립 보드에 복사합니다. 그런 다음 "클립 보드에서 새로 만들기"를 사용하여 미리보기 도구로 이미지를 열고 아이콘 주위에서 128x128 픽셀 영역을 선택한 다음 복사하고 "클립 보드에서 새로 만들기"를 다시 사용하여 PNG로 내 보내면됩니다. pngfix 도구를 실행할 필요가 없습니다.
이 페이지에서 몇 가지 제안을 시도한 후 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"
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 화이트 포인트를 사용합니다. D65가 표준입니다. 이 프로필은 기본적으로 이미지에 포함되지 않았지만 Adobe Photoshop에서 사용되는 드문 일이 아닙니다.
(출처 : https://wiki.archlinux.org/index.php/Libpng_errors )
일부 청크의 오류 감지 기능이 향상되었습니다. 특히, iCCP 청크 리더는 이제 기본 형식에 대한 완전한 검증을 수행합니다. 이전에 승인 된 일부 불량 프로파일, 특히 아주 오래된 Microsoft / HP sRGB 프로파일이 거부되었습니다. 색상 유형이 0 또는 4 인 이미지에는 회색조 프로파일 만 나타날 수 있고 이미지에 회색 픽셀 만 포함 된 경우에도 2, 3 또는 6 색의 이미지에는 RGB 프로파일 만 나타날 수있는 PNG 사양 요구 사항이 적용됩니다. sRGB 청크는 모든 색상 유형의 이미지에 나타날 수 있습니다.
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"로 읽을 수 있습니다.
* .png -mtime -1> list.txt 찾기
mogrify -resize 50 % @ list.txt
"find"를 사용하여 1 일보다 새로운 모든 * .png 이미지를 가져 와서 "list.txt"라는 파일로 인쇄합니다. 그런 다음 "mogrify"는 해당 목록을 읽고 이미지를 처리하고 크기가 조정 된 버전으로 원본을 덮어 씁니다. 한 시스템에서 다른 시스템으로 "찾기"동작에 약간의 차이가있을 수 있으므로 정확한 사용법은 매뉴얼 페이지를 확인해야합니다.