为什么会出现这个警告?我该怎么做才能解决这个问题?libpng警告:iCCP:已知不正确的sRGB配置文件
为什么会出现这个警告?我该怎么做才能解决这个问题?libpng警告:iCCP:已知不正确的sRGB配置文件
如果您使用的应用程序将警告视为错误,则需要删除该块。 您可以使用任何一种PNG编辑器(例如ImageMagick)来执行此操作。
在Windows CMD提示符中,您需要cd
(更改目录)到要关注的图像所在的文件夹中,然后才能使用下面列出的命令。
Libpng-1.6比以前的版本更严格地检查ICC配置文件; 您可以忽略警告。 要消除它,请从PNG图像中删除iCCP块。
convert in.png out.png
使用ImageMagick中的mogrify
命令,可以从文件夹(目录)中的所有PNG文件中删除无效的iCCP chunk:
mogrify -strip *.png
mogrify *.png
这要求您的ImageMagick是使用libpng16构建的。您可以通过运行以下命令轻松检查:
这要求您的ImageMagick是使用libpng16构建的。您可以通过运行以下命令轻松检查:
convert -list format | grep PNG
如果你想找出哪些文件需要修复而不是盲目地处理所有文件,你可以运行
pngcrush -n -q *.png
-n
表示不重写文件,-q
表示抑制大部分输出,除了警告。很抱歉,在 pngcrush 中还没有选项可以抑制除警告之外的所有内容。
注意:您必须安装 pngcrush。
ImageMagick 的二进制发布版本在这里
对于 Android 项目(Android Studio),请进入 res
文件夹。
例如:
C:\{your_project_folder}\app\src\main\res\drawable-hdpi\mogrify *.png
mogrify **/*.png
似乎会修改树中的所有文件。我更倾向于只更新一个有问题的图像。 - Uflexfind . -type f -name '*.png' -exec mogrify \{\} \;
可以在当前目录下递归地修改所有 .png
文件。 - val is still with Monica-ow
覆盖并修复文件,并将大小减小了约1/6!只需获取该程序的源代码,为我的Mac编译,手动安装并运行即可。GitHub Kjuly/pngcrush可能有预编译的二进制文件,但不确定。Sourceforge似乎只提供Windows exe和源代码。friederbluemle的答案似乎可以做到这一点甚至更多。 - Pysis使用pngcrush
从PNG文件中删除不正确的sRGB配置文件:
pngcrush -ow -rem allb -reduce file.png
-ow
可以覆盖输入文件-rem allb
会删除除tRNS和gAMA以外的所有附属块-reduce
进行无损色彩类型或位深度减少在控制台输出中,您应该会看到 已删除sRGB块
,可能还有更多关于块删除的消息。最终您将得到一个更小、优化过的PNG文件。由于命令将覆盖原始文件,请确保创建备份或使用版本控制。
find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;
(已在GNU / Linux上测试)。 - friederbluemle可以通过以下方式修复错误的配置文件:
注意: 此解决方案使用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应用程序有一个错误,导致输出图像为空。我已经修复了这个错误并为给您带来的不便道歉!
你也可以在Photoshop中修复它...
在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进行了测试。再次感谢Glenn提供了大部分信息,我只是添加了一个答案,因为通常比评论更容易找到 :)
find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;
。每个有错误的PNG文件都会生成pngcrush: iCCP: known incorrect sRGB profile
的提示信息。 - Gabriel Devillersimport 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"
pngcrush 1.7.85,使用libpng 1.6.21和zlib 1.2.8
,但我的pngcrush没有-warn
或-reduce
标志,因此这个解决方案不起作用。 - pbhj如果你使用的是 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
关于此事的一些背景信息:
libpng版本1.6+中的一些更改会导致它发出警告,甚至无法正确地使用原始的HP/MS sRGB配置文件,从而导致以下stderr: libpng warning: iCCP: known incorrect sRGB profile。旧配置文件使用D50白点,而标准是D65。尽管默认情况下它不会嵌入图像中,但该配置文件并不罕见,被Adobe Photoshop等软件使用。
(来源:https://wiki.archlinux.org/index.php/Libpng_errors)
某些块中的错误检测已经得到改进;特别是iCCP块读取器现在对基本格式进行了相当完整的验证。一些之前被接受的不良配置文件现在被拒绝,特别是非常老的损坏的Microsoft/HP sRGB配置文件。PNG规范要求仅灰度配置文件可出现在颜色类型为0或4的图像中,并且即使图像仅包含灰度像素,颜色类型为2、3或6的图像中也只能出现RGB配置文件,这一点现在得到了执行。sRGB块允许出现在任何颜色类型的图像中。