libpng 警告:iCCP:已知不正确的 sRGB 配置文件
libpng warning: iCCP: known incorrect sRGB profile
我正在尝试使用 SDL 加载 PNG 图像,但程序不起作用,并且此错误出现在控制台中
libpng 警告:iCCP:已知不正确的 sRGB 配置文件
为什么会出现此警告?我应该怎么做才能解决这个问题?
某些应用程序将警告视为错误;如果您使用的是此类应用程序,则必须删除该块。 您可以使用任何类型的PNG编辑器(如ImageMagick)来做到这一点。
在Windows CMD提示符下,您需要cd
(更改目录)到包含要关注的图像的文件夹中,然后才能使用下面列出的命令。
Libpng-1.6 在检查 ICC 配置文件方面比以前的版本更严格;您可以忽略该警告。 要摆脱它,请从 PNG 图像中删除 iCCP 块。
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 中还没有选项可以抑制除警告之外的所有内容。
注意:您必须安装 pngcrush。
<小时 />ImageMagick 的二进制版本在这里
<小时 />对于 Android 项目 (Android Studio),请导航到res
文件夹。
例如:
C:{your_project_folder}appsrcmainresdrawable-hdpimogrify *.png
使用 pngcrush
从 png 文件中删除不正确的 sRGB 配置文件:
pngcrush -ow -rem allb -reduce file.png
-
-ow
将覆盖输入文件 -
-rem allb
将删除除 tRNS 和 gAMA 之外的所有辅助块 -
-reduce
无损颜色类型或位深度缩减
在控制台输出中,您应该会看到Removed the sRGB chunk
,以及可能更多有关块删除的消息。您最终会得到一个更小、优化的 PNG 文件。由于该命令将覆盖原始文件,因此请确保创建备份或使用版本控制。
解决方案
不正确的配置文件可以通过以下方式修复:
- 使用 QPixmap::load 打开具有不正确配置文件的图像
- 使用 QPixmap::save 将映像保存回磁盘(已具有正确的配置文件)
注意:此解决方案使用 Qt 库。
例
以下是我在C++中编写的一个最小示例,用于演示如何实现建议的解决方案:
QPixmap pixmap;
pixmap.load("badProfileImage.png");
QFile file("goodProfileImage.png");
file.open(QIODevice::WriteOnly);
pixmap.save(&file, "PNG");
GitHub 上提供了基于此示例的 GUI 应用程序的完整源代码。
从05.12.2019更新:答案过去和现在仍然有效,但是我在GitHub上共享的GUI应用程序中存在一个错误,导致输出图像为空。我刚刚修复了它,并为给您带来的不便道歉!
您也可以在 photoshop 中解决此问题...
- 打开.png文件。
- 文件 ->另存为,然后在打开的对话框中取消选中"ICC 配置文件:sRGB IEC61966-2.1"
- 取消选中"作为副本"。
- 勇敢地保存你原来的.png。
- 继续你的生活,知道你已经从世界上消除了那一点邪恶。
为了补充 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: 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 文件,而实际上只有少数文件被修改。此外,它还具有准确显示哪些文件有问题的优势。
我在Windows上用Cygwin控制台和zsh shell测试了这个。再次感谢 Glenn 提出了上述大部分内容,我只是添加一个答案,因为它通常比评论更容易找到 :)
感谢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"
更简单的方法可以在Mac OS和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 和 预览 应用程序来创建图标。我使用 Keynote 在白色背景的幻灯片上绘制它们,大小约为 120x120 像素(使多边形可编辑的选项很棒!在导出到预览之前,我在图标周围绘制一个矩形(没有任何填充或阴影,只有轮廓,大小约为 135x135),并将所有内容复制到剪贴板。之后,您只需要使用"从剪贴板新建"的预览工具打开它,在图标周围选择一个 128x128 像素的区域,复制,再次使用"从剪贴板新建",然后将其导出为 PNG。您无需运行 pngfix 工具。
一些背景信息:
libpng 版本 1.6+ 中的某些更改会导致它发出警告或 甚至无法与原始的 HP/MS sRGB 配置文件正常工作,导致 到以下标准:libpng警告:iCCP:已知不正确的sRGB 配置文件 旧配置文件使用 D50 白点,其中 D65 是标准配置。 此配置文件并不少见,由Adobe Photoshop使用,尽管 默认情况下,它未嵌入到图像中。
(来源:https://wiki.archlinux.org/index.php/Libpng_errors)
某些区块中的错误检测有所改进;特别是iCCP Chunk Reader现在对基本格式进行了非常完整的验证。 以前接受的一些不良配置文件现在被拒绝,在 特别是非常旧的损坏的Microsoft/HP sRGB配置文件。PNG 规范 要求只有灰度配置文件可以出现在具有以下特征的图像中 颜色类型 0 或 4,即使图像仅包含灰色 像素,只有 RGB 配置文件可能出现在颜色类型 2、3、 或 6,现在强制执行。允许 sRGB 块出现在图像中 任何颜色类型。
(来源:https://forum.qt.io/topic/58638/solved-libpng-warning-iccp-known-incorrect-srgb-profile-drive-me-nuts/16)
在Windows中使用IrfanView图像查看器,我只是重新保存了PNG图像,并纠正了问题。
提议的答案将pngcrush
与-rem allb
选项一起使用,文档说这就像"电锯手术"。 该选项删除了许多块。为了防止出现"iCCP:已知不正确的 sRGB 配置文件"警告,删除iCCP
块就足够了,如下所示:
pngcrush -ow -rem iCCP filename.png
扩展 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文件夹中。
当我训练 yolo 时,每个纪元都会出现警告libpng warning: iCCP: known incorrect sRGB profile
。然后我使用 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
我在项目的根目录中运行了这两个命令并修复了它。
基本上将"find"命令的输出重定向到文本文件,以用作要处理的文件列表。然后,您可以使用"@"标志将该文本文件读入"mogrify":
查找 *.png -mtime -1>列表.txt
莫格里夫 - 调整大小 50% @list.txt
这将使用"查找"来获取所有更新于 1 天的 *.png 图像,并将它们打印到名为"list.txt"的文件中。然后"mogrify"读取该列表,处理图像,并用调整大小的版本覆盖原始版本。从一个系统到另一个系统的"查找"行为可能存在细微差异,因此您必须检查手册页以了解确切的用法。
适用于对函数有此问题imagecreatefrompng
PHP 开发人员
您可以尝试使用 @
来禁止显示警告
$img = @imagecreatefrompng($file);
这是一个荒谬的蛮力答案:
我修改了 gradlew 脚本。这是我在文件末尾的新 exec 命令
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**
- 使用2个键的cpp-stl::优先级队列排序不正确
- 正弦级数方程计算不正确
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 密码登录程序将永远循环并显示不正确的结果
- 在C++中返回不正确的楼层函数值
- 形状对象的旋转和缩放不正确C++
- C++ 读取文件读取文件不正确
- 关于类的 Python 文档 - 对C++的引用不正确
- 特征 LLT 模块给出不正确的结果?
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 如果语句逻辑不正确
- 来自逆 vp 矩阵和相机位置的光线方向不正确
- 不正确的操作数类型 MSVC
- 数组填充了不正确的值
- 我是否不正确地集中了这些字符数组?
- 为什么除非我使用 cout,否则我的值不正确?
- 计算幂级数的数学结果不正确
- 为什么 sizeof 在 C++ 中给出不正确的字节数?
- atoi() 在应用于大型命令行参数时会产生不正确的值
- libpng 警告:iCCP:已知不正确的 sRGB 配置文件