我试图使用SDL加载PNG图像,但程序不工作,这个错误出现在控制台中
libpng警告:iCCP:已知错误的sRGB配置文件
为什么会出现这个警告?我该怎么解决这个问题呢?
我试图使用SDL加载PNG图像,但程序不工作,这个错误出现在控制台中
libpng警告:iCCP:已知错误的sRGB配置文件
为什么会出现这个警告?我该怎么解决这个问题呢?
当前回答
一些建议的答案使用pngcrush和-rem allb选项,文档说这就像“用电锯做手术”。该选项删除了许多块。为了防止“iCCP:已知错误的sRGB配置文件”警告,删除iCCP块就足够了,如下所示:
pngcrush -ow -rem iCCP filename.png
其他回答
使用pngcrush从png文件中删除不正确的sRGB配置文件:
pngcrush -ow -rem allb -reduce file.png
-ow将覆盖输入文件 -rem allb将删除除tRNS和gAMA之外的所有辅助块 -reduce用于无损颜色类型或位深度缩减
在控制台输出中,您应该看到Removed the sRGB块,可能还有更多关于块移除的消息。你将得到一个更小的、优化过的PNG文件。由于该命令将覆盖原始文件,请确保创建备份或使用版本控制。
感谢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)
在尝试了本页上的几个建议后,我最终使用了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"
一些背景信息:
libpng 1.6+版本中的一些更改导致它发出警告或 甚至不能与原始HP/MS sRGB配置文件正确工作,领先 到以下stderr: libpng警告:iCCP:已知错误的sRGB 旧的配置文件使用D50白点,其中D65是标准的。 这个配置文件并不少见,虽然Adobe Photoshop正在使用 默认情况下,它没有嵌入到图像中。
(来源:https://wiki.archlinux.org/index.php/Libpng_errors)
Error detection in some chunks has improved; in particular the iCCP chunk reader now does pretty complete validation of the basic format. Some bad profiles that were previously accepted are now rejected, in particular the very old broken Microsoft/HP sRGB profile. The PNG spec requirement that only grayscale profiles may appear in images with color type 0 or 4 and that even if the image only contains gray pixels, only RGB profiles may appear in images with color type 2, 3, or 6, is now enforced. The sRGB chunk is allowed to appear in images with any color type.
(来源:https://forum.qt.io/topic/58638/solved-libpng-warning-iccp-known-incorrect-srgb-profile-drive-me-nuts/16)
当我训练yolo时,warninglibpng警告:iCCP:已知不正确的sRGB配置文件发生每个纪元。然后我使用bash找到png,然后使用python3和opencv(cv2)重写png文件。因此,警告只在重写时出现。步骤如下:
步骤1。创建一个python文件:
# rewrite.py
import cv2, sys, os
fpath = sys.argv[1]
if os.path.exists(fpath):
cv2.imwrite(fpath, cv2.imread(fpath))
步骤2。在bash中运行:
# cd your image dir
# then find and rewrite png file
find . -iname "*.png" | xargs python3 rewrite.py