我试图使用SDL加载PNG图像,但程序不工作,这个错误出现在控制台中
libpng警告:iCCP:已知错误的sRGB配置文件
为什么会出现这个警告?我该怎么解决这个问题呢?
我试图使用SDL加载PNG图像,但程序不工作,这个错误出现在控制台中
libpng警告:iCCP:已知错误的sRGB配置文件
为什么会出现这个警告?我该怎么解决这个问题呢?
当前回答
为了补充Glenn的精彩回答,以下是我找到错误文件的方法:
find . -name "*.png" -type f -print0 | xargs \
-0 pngcrush_1_8_8_w64.exe -n -q > pngError.txt 2>&1
我使用find和xargs,因为pngcrush不能处理大量的参数(由**/*.png返回)。-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文件,而实际上只修改了几个。另外,它的优点是可以准确地显示出哪些文件有错误。
我在Windows上用Cygwin控制台和zsh shell进行了测试。再次感谢格伦,他提供了上面的大部分内容,我只是添加了一个答案,因为它通常比评论更容易找到:)
其他回答
解决方案
不正确的配置文件可以通过以下方法修复:
使用QPixmap::load打开带有错误配置文件的图像 使用QPixmap::save将图像保存回磁盘(已经具有正确的配置文件)
注意:此解决方案使用Qt库。
例子
下面是我用c++写的一个最小示例,以演示如何实现建议的解决方案:
QPixmap pixmap;
pixmap.load("badProfileImage.png");
QFile file("goodProfileImage.png");
file.open(QIODevice::WriteOnly);
pixmap.save(&file, "PNG");
基于此示例的GUI应用程序的完整源代码可在GitHub上获得。
2019年12月5日更新:答案过去是有效的,现在仍然有效,但是我在GitHub上分享的GUI应用程序中有一个错误,导致输出图像为空。我刚修好,给您带来的不便深表歉意!
感谢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)
在Windows中使用IrfanView图像查看器,我简单地重新保存了PNG图像,这纠正了问题。
当我训练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
PHP开发者使用imagecreatefromng函数时遇到的问题
您可以尝试使用@取消警告
$img = @imagecreatefrompng($file);