libpng警告:iCCP:已知不正确的sRGB配置文件

244
我正在尝试使用SDL加载PNG图像,但程序无法正常工作,并且控制台中出现以下错误:

libpng警告:iCCP:已知不正确的sRGB配置文件

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

请参见 http://tex.stackexchange.com/questions/125612/warning-pdflatex-libpng-warning-iccp-known-incorrect-srgb-profile。 - Jesse W at Z - Given up on SE
而 https://groups.google.com/forum/#!msg/adt-dev/rjTQ_STR3OE/-UcNQRISTKsJ - Jesse W at Z - Given up on SE
16个回答

256

如果您使用的应用程序将警告视为错误,则需要删除该块。 您可以使用任何一种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

13
使用ImageMagick可以使用-strip命令。具体来说,我使用mogrify来处理文件夹中的所有图像。我的命令看起来像这样:mogrify -strip *.png - Maxito
31
使用 "-strip" 选项会删除所有的配置文件。如果省略 "-strip" 选项(_mogrify *.png_),则只会删除错误的配置文件。 - Glenn Randers-Pehrson
3
有没有办法找出是哪个文件触发了警告?运行mogrify **/*.png似乎会修改树中的所有文件。我更倾向于只更新一个有问题的图像。 - Uflex
3
使用命令 find . -type f -name '*.png' -exec mogrify \{\} \; 可以在当前目录下递归地修改所有 .png 文件。 - val is still with Monica
ImageMagick二进制文件让我的电脑死机了,可能是因为工作太努力了。过了一夜后,不得不强制重启。使用pngcrush应用程序检测问题,使用-ow覆盖并修复文件,并将大小减小了约1/6!只需获取该程序的源代码,为我的Mac编译,手动安装并运行即可。GitHub Kjuly/pngcrush可能有预编译的二进制文件,但不确定。Sourceforge似乎只提供Windows exe和源代码。friederbluemle的答案似乎可以做到这一点甚至更多。 - Pysis
显示剩余2条评论

88

使用pngcrush从PNG文件中删除不正确的sRGB配置文件:

pngcrush -ow -rem allb -reduce file.png
  • -ow 可以覆盖输入文件
  • -rem allb 会删除除tRNS和gAMA以外的所有附属块
  • -reduce 进行无损色彩类型或位深度减少

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


10
成功了!要从当前文件夹递归地执行此操作,请将其放入 .bat 文件中:For /R %%i in (*.png) do PNGCRUSH.EXE -ow -rem allb -reduce %%i - Andy Brice
16
以下是针对当前目录中所有 PNG 文件进行递归修复的*nix一行命令:find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;(已在GNU / Linux上测试)。 - friederbluemle
2
上面的代码行在Windows上的Git Bash中也可以正常工作,这是由Frieder编写的。 - iKlsR
1
Pngcrush在我的情况下没有删除这个块。但是ImageMagick的mogrify做到了。 - KeyC0de

30

解决方案

可以通过以下方式修复错误的配置文件:

  1. 使用QPixmap::load打开具有不正确配置文件的图像
  2. 使用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年5月12日更新:答案仍然有效,但是我在GitHub上分享的GUI应用程序有一个错误,导致输出图像为空。我已经修复了这个错误并为给您带来的不便道歉!


4
我很惊讶这个答案没有得到赞同。它不需要安装任何东西并且有效...还能有什么更好的呢 :) - Quantuple

25

你也可以在Photoshop中修复它...

  1. 打开你的 .png 文件。
  2. 选择 文件 -> 另存为 ,在弹出的对话框中取消勾选 "ICC配置文件:sRGB IEC61966-2.1"
  3. 取消勾选 "作为副本保存"。
  4. 毅然决然地保存并覆盖原始的 .png 文件。
  5. 继续你的生活,知道你已经从世界上移除了那一点邪恶。

我用 Photofiltre 7 完成了这个技巧。只需打开图像,然后将其另存为覆盖原始的 PNG 文件即可。效果很好,感谢您的提示。 - Sunchock
2
@Sunchock 很好。不知何故,这仍然是我四年后最受欢迎的答案...只是一个简单的“保存”。 - Spencer

11

在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提供了大部分信息,我只是添加了一个答案,因为通常比评论更容易找到 :)


5
在Debian系统中,为了找出我的软件中存在问题的文件,我使用了命令find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;。每个有错误的PNG文件都会生成pngcrush: iCCP: known incorrect sRGB profile的提示信息。 - Gabriel Devillers

10
感谢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)

2
这很好的跨平台性,尽管如果你在支持美妙的*NIX-y shell如Zsh或Bash的平台上,你可以使用“mogrify ** / * .png”。 - Kyle Strand
1
是的,说得好。我之所以使用Python,是因为我们在Windows和Linux上进行开发,并希望将此脚本提交到我们的代码库以备将来使用。 - Devan Williams

9

在尝试了本页上的几个建议之后,最终我使用了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"

3
这篇文章应该获得更多的点赞。所有其他的解决方案都会涉及到每一个文件,而如果你在版本控制系统中有很多图片,这将是特别糟糕的。感谢提供这个脚本! - kfunk
2
我有pngcrush 1.7.85,使用libpng 1.6.21和zlib 1.2.8,但我的pngcrush没有-warn-reduce标志,因此这个解决方案不起作用。 - pbhj
我已经测试了你的解决方案,但是我遇到了这个错误:find: ‘’: No such file or directory 0 errors fixed" 请详细指导如何处理图像文件夹。 - MH.AI.eAgLe

9

如果你使用的是 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和Preview应用程序创建图标。我使用Keynote绘制它们,在白色背景幻灯片上绘制大小约为120x120像素的图标(使多边形可编辑的选项非常好!)。在导出到Preview之前,我绘制了一个围绕图标的矩形(没有任何填充或阴影,只有轮廓,大小约为135x135),并将所有内容复制到剪贴板中。之后,您只需要使用“从剪贴板新建”打开Preview工具,选择围绕图标的128x128像素区域,复制,再次使用“从剪贴板新建”,并将其导出为PNG。您不需要运行pngfix工具。

1
我在标准的OS El Capitan安装中没有找到pngfix(或者可能是我没有搜索得够好),但我在我安装的MAMP中找到了它。完美地工作!谢谢!已点赞。 - guido
你说得对!我很久以前用“brew install libpng”安装了它。 - Adriel Jr
当我在10.13.2上运行时,收到了“n!ew ERR 08 read Undefined_error:_0 Undefined_error:0 not_a_PNG(too_short) car.png”的错误信息。 - Mitch
@Mitch 在升级到10.13.6后仍然正常运行。 - Adriel Jr

6

关于此事的一些背景信息:

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块允许出现在任何颜色类型的图像中。

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


4
使用Windows中的IrfanView图像查看器,我只需重新保存PNG图像即可纠正问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接