<질문>
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:"**
'개발 > C++' 카테고리의 다른 글
Qt Creator 프로젝트에 외부 라이브러리 추가 (0) | 2020.09.24 |
---|---|
C ++ 템플릿 Turing-complete? (0) | 2020.09.24 |
삽입 순서를 추적하는 std :: map? (0) | 2020.09.24 |
C ++ 맵 액세스가 한정자를 버림 (const) (0) | 2020.09.24 |