libpng警告:iCCP:已知错误的sRGBconfiguration文件

我正在尝试使用SDL加载PNG文件,但该程序不起作用,并且在控制台中出现此错误

“libpng警告:iCCP:已知不正确的sRGBconfiguration文件”

为什么会出现此警告? 我该怎么办才能解决这个问题?

Libpng-1.6比以前的版本更严格地检查ICCconfiguration文件。 您可以忽略警告。 为了摆脱它,从PNG图像中删除iCCP块。

某些应用程序将警告视为错误; 如果你正在使用这样的应用程序,你必须删除块。 您可以使用各种PNG编辑器,如ImageMagick的convert in.png out.png

要从文件夹(目录)中的所有PNG文件中删除无效的iCCP块,可以使用ImageMagick的mogrify *.png ,前提是ImageMagick是使用libpng16构build的(运行convert -list format | grep PNG以确保)。

如果你想找出哪些文件需要修复,而不是盲目地处理所有的文件,你可以运行我的pngcrush -n -q *.png ,其中“ -n ”表示不重写文件,“ -q “表示压缩除警告之外的大部分输出。 对不起,在pngcrush中,除了警告之外,没有别的办法可以压制一切。


ImageMagick的二进制版本在这里


对于Android项目(Android Studio)导航到res文件夹。

例如: C:\AndroidProjects\{your_project_folder}\app\src\main\res\drawable-hdpi\mogrify *.png

使用pngcrush从png文件pngcrush删除不正确的sRGBconfiguration文件:

 pngcrush -ow -rem allb -reduce file.png 
  • -ow将覆盖input文件
  • -rem allb将删除除tRNS和gAMA之外的所有辅助块
  • – 减less无损颜色types或位深度减less

在控制台输出中,您应该看到已Removed the sRGB chunk. ,可能还有更多关于块删除的消息。 你将最终得到一个更小的,优化的PNG文件。 由于该命令将覆盖原始文件,请确保创build备份或使用版本控制。

使用Qt和C ++的程序员的另一个简单的select是用Qt Widgets或控制台应用程序的forms编写自己的小工具来修复configuration文件:

 QPixmap pixmap; pixmap.load("badProfileImage.png"); QFile file("goodProfileImage.png"); file.open(QIODevice::WriteOnly); pixmap.save(&file, "PNG"); 

感谢Glenn的精彩回答 ,我使用了ImageMagik的“mogrify * .png”function。 但是,我将图像埋在子文件夹中,所以我使用这个简单的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) 

在这个页面上尝试了几个build议后,我最终使用了pngcrush解决scheme。 您可以使用下面的bash脚本recursion检测和修复坏的PNGconfiguration文件。 只需将它传递到您想要searchpng文件的目录的完整path即可。

 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的这个问题:

 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文件创build一个固定副本,并将其放在tmp子目录中。 之后,如果一切正常,您只需要覆盖原始文件。

另一个技巧是使用Keynote和预览应用程序来创build图标。 我使用Keynote,大小约为120×120像素,在白色背景的幻灯片上绘制它们(使多边形可编辑的选项非常棒!)。 在导出到预览之前,我在图标周围绘制了一个矩形(没有任何填充或阴影,只是轮廓,大小约为135×135),并将所有内容复制到剪贴板。 之后,您只需要使用预览工具使用“从剪贴板新build”打开它,在图标周围select一个128×128像素的区域,复制,再次使用“从剪贴板新build”,并将其导出到PNG。 您将不需要运行pngfix工具。

为了增加Glenn的伟大的答案,这是我做了什么来find哪些文件错误:

 find . -name "*.png" -type f -print0 | xargs -0 pngcrush_1_8_8_w64.exe -n -q > pngError.txt 2>&1 

我使用了find和xargs,因为pngcrush无法处理大量的参数( **/*.png 。png返回)。 -print0-0需要处理包含空格的文件名。

然后在输出中search这些行: iCCP: Not recognizing known sRGB profile that has been edited

./Installer/Images/installer_background.png:
在关键块中find的数据总长度= 11286
pngcrush:iCCP:不识别已编辑的已知sRGBconfiguration文件

对于每个人,运行mogrify来解决它们。

 mogrify ./Installer/Images/installer_background.png 

这样做可以防止有一个提交更改存储库中的每个PNG文件,当只有less数人已经被修改。 另外还有显示哪些文件有问题的优势。

我用Cygwin控制台和zsh shell在Windows上testing了这个。 再次感谢格伦谁把上面的大部分,我只是添加一个答案,因为它通常更容易find比评论:)

一些背景资料:

libpng版本1.6+中的某些更改会导致它发出警告,甚至无法正确使用原始HP / MS sRGBconfiguration文件,从而导致以下stderr:libpng警告:iCCP:已知不正确的sRGBconfiguration文件旧configuration文件使用D50白点, D65是标准的。 这个configuration文件并不less见,被Adobe Photoshop使用,虽然它默认没有embedded到图像中。

(来源: https : //wiki.archlinux.org/index.php/Libpng_errors )

在一些块中的错误检测已经改进; 特别是iCCP块读取器现在对基本格式进行了相当完整的validation。 以前接受的一些错误configuration文件现在被拒绝,特别是旧的微软/ HP sRGBconfiguration文件。 PNG规范要求只有灰度configuration文件可能出现在颜色types为0或4的图像中,并且即使图像只包含灰色像素,也只有RGBconfiguration文件可能出现在颜色types为2,3或6的图像中。 sRGB块允许出现在任何颜色types的图像中。

(来源: https : //forum.qt.io/topic/58638/solved-libpng-warning-iccp-known-incorrect-srgb-profile-drive-me-nuts/16 )

这是一个荒谬的蛮力答案:

我修改了gradlew脚本。 这里是我的新exec命令在文件末尾

 exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**