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

libpng warning: iCCP: known incorrect sRGB profile

提问人:Omid Karami 提问时间:3/30/2014 最后编辑:glhrOmid Karami 更新时间:1/30/2023 访问量:398545

问:

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

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

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

C++ 警告 SDL RGB LIBPNG

评论

0赞 Jesse W at Z - Given up on SE 2/6/2015
查看 tex.stackexchange.com/questions/125612/...
0赞 Jesse W at Z - Given up on SE 2/6/2015
groups.google.com/forum/#!msg/adt-dev/rjTQ_STR3OE/-UcNQRISTKsJ

答:

258赞 Glenn Randers-Pehrson 3/31/2014 #1

某些应用程序将警告视为错误;如果您正在使用此类应用程序,则必须删除该块。您可以使用任何种类的 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

其中 means 不会重写文件,并且 means 会抑制除警告之外的大部分输出。抱歉,pngcrush 中还没有选项可以禁止显示除警告之外的所有内容。-n-q

注意:您必须安装 pngcrush


ImageMagick的二进制版本在这里


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

例如:

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

评论

13赞 Maxito 11/26/2014
使用 ImageMagick,您可以使用 -strip 命令。具体来说,我使用 mogrify 来影响文件夹中的所有图像。我的命令看起来像这样:mogrify -strip *.png
31赞 Glenn Randers-Pehrson 11/26/2014
-strip 选项将删除所有配置文件。如果省略 -strip 选项(mogrify *.png),则只会删除不正确的配置文件。
3赞 Uflex 10/8/2016
有没有办法找出哪个文件触发了警告?运行似乎修改了树中的所有文件。我宁愿只更新一个有故障的图像。mogrify **/*.png
3赞 val - disappointed in SE 6/24/2018
用于递归修改当前目录中的文件。find . -type f -name '*.png' -execute mogrify \{\} \;.png
0赞 Pysis 4/23/2019
让 ImageMagick 二进制文件冻结了我的计算机,也许是因为工作太辛苦,并且在一夜之间离开后,不得不强行重新启动。使用pngcrush应用程序来检测上述问题,覆盖和修复文件,并将大小减小了约1/6!只需要为我的 mac 获取程序的源代码,手动编译、安装并运行它。GitHub Kjuly/pngcrush 可能有一个预编译的二进制文件,但不确定。Sourceforge 似乎只有可用的 Windows exe 和源代码。FriederBluemle 的回答似乎做到了这一点,甚至更多。-ow
88赞 friederbluemle 3/30/2015 #2

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

pngcrush -ow -rem allb -reduce file.png
  • -ow将覆盖输入文件
  • -rem allb将删除除 tRNS 和 gAMA 之外的所有辅助块
  • -reduce执行无损颜色类型或位深度减少

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

评论

10赞 Andy Brice 2/10/2016
这奏效了!从当前文件夹递归地执行此操作,将其放入 .bat 文件中:对于 /R %%i in (*.png) do PNGCRUSH.EXE -ow -rem allb -reduce %%i
16赞 friederbluemle 2/16/2016
还有一行 *nix 递归修复当前目录中的所有 png 文件:(在 GNU/Linux 上测试)find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;
2赞 iKlsR 3/9/2017
Frieder 的上面一行也适用于 Windows 上的 git bash 中。
1赞 KeyC0de 11/29/2019
就我而言,Pngcrush 不会删除此块。但 imagemagick 的 mogrify 做到了。
-1赞 Milk Run 4/28/2015 #3

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

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

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**
4赞 Neil Roy 12/6/2015 #4

在 Windows 中使用 IrfanView 图像查看器,我只需重新保存 PNG 图像即可解决问题。

10赞 Devan Williams 4/12/2016 #5

感谢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赞 Kyle Strand 6/18/2016
这是一个很好的跨平台,但如果你在一个支持一个很好的 *NIX-y shell(如 Zsh 或 Bash)的平台上,你可以只使用 .mogrify **/*.png
1赞 Devan Williams 6/19/2016
是的,好点子。我只使用 Python,因为我们在 Windows 和 Linux 上开发,并希望将此脚本提交到我们的存储库中以备将来使用。
11赞 Uflex 10/13/2016 #6

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

评论

5赞 Gabriel Devillers 10/25/2018
在 Debian 上,为了查找我的软件中有问题的文件,我使用了每个错误的 PNG 都会生成find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;pngcrush: iCCP: known incorrect sRGB profile
30赞 scopchanov 11/2/2016 #7

溶液

不正确的配置文件可以通过以下方式修复:

  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");

GitHub 上提供了基于此示例的 GUI 应用程序的完整源代码。

从05.12.2019更新:答案过去和现在仍然有效,但是我在 GitHub 上共享的 GUI 应用程序中存在一个错误,导致输出图像为空。我刚刚修好了它,给您带来的不便深表歉意!

评论

4赞 Quantuple 2/17/2017
我很惊讶这个答案没有得到赞成。它不需要安装任何东西,而且可以工作......还有什么可以要求:)
9赞 slurry 2/18/2017 #8

在尝试了此页面上的一些建议后,我最终使用了 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 7/14/2017
这值得更多的赞成。所有其他解决方案都会触及每个文件,如果版本控制系统中有很多图像,则尤其糟糕。谢谢你的剧本!
2赞 pbhj 8/13/2018
我有,但我的 pngcrush 没有也没有标志,所以这个解决方案不起作用。pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8-warn-reduce
0赞 MH.AI.eAgLe 5/18/2021
我已经测试了您的解决方案,但我收到此错误:find: '': No such file or directory 0 errors fixed“ 请准确指导如何寻址图像文件夹。
9赞 Adriel Jr 2/22/2017 #9

有一种更简单的方法可以解决 Mac OS 和 Homebrew 的此问题:

如果尚未安装 homebrew,请安装 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 像素(使多边形可编辑的选项很棒!在导出到预览之前,我在图标周围绘制一个矩形(没有任何填充或阴影,只有轮廓,大小约为 135x135),然后将所有内容复制到剪贴板。之后,您只需使用“从剪贴板新建”的预览工具打开它,在图标周围选择一个 128x128 像素的区域,复制,再次使用“从剪贴板新建”,然后将其导出为 PNG。您无需运行 pngfix 工具。

评论

1赞 guido 5/23/2017
我在标准 OS El Capitan 安装中没有找到 pngfix(或者我搜索得不够好),但我在我拥有的 MAMP 安装中找到了它。工作完美!谢谢!投了赞成票
0赞 Adriel Jr 5/24/2017
你是对的!很久以前,我用“brew install libpng”安装了它。
0赞 Mitch 1/20/2018
在 10.13.2 上运行它时,我得到了“n!ew ERR 08 read Undefined_error:_0 Undefined_error:_0 not_a_PNG_(too_short) car.png”。
0赞 Adriel Jr 8/9/2018
@Mitch升级到 10.13.6 后仍运行正常。
6赞 George Birbilis 4/15/2017 #10

有关这方面的一些背景信息:

libpng 版本 1.6+ 中的某些更改会导致它发出警告或 甚至无法与原始HP/MS sRGB配置文件正常工作,领先 添加到以下 stderr: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)

25赞 Spencer 11/26/2017 #11

您也可以在 Photoshop 中修复此问题......

  1. 打开 .png 文件。
  2. 文件 -> 另存为,然后在打开的对话框中取消选中“ICC Profile: sRGB IEC61966-2.1”
  3. 取消选中“作为副本”。
  4. 勇敢地保存原始.png。
  5. 继续你的生活,知道你已经从世界上消除了那一点点邪恶。

评论

0赞 Sunchock 8/2/2021
我用 Photofiltre 7 做到了。只需打开图像,然后在原始 png 上另存为新图像即可。工作正常,感谢您的提示
2赞 Spencer 8/3/2021
@Sunchock不错。不知何故,4 年后,这仍然是我评价最高的答案......只是一个简单的“保存”。
2赞 sahasrara62 3/19/2019 #12

扩展 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个文件夹中。

评论

1赞 Charles Duffy 4/4/2022
您不需要同时使用原始字符串和加倍反斜杠 - 只需要一个或另一个。
0赞 yadayada 12/19/2019 #13

我在项目的根目录下运行了这两个命令,并修复了它。

基本上,将“find”命令的输出重定向到一个文本文件,以用作要处理的文件列表。然后,您可以使用“@”标志将该文本文件读入“mogrify”:

在列表中找到 *.png -mtime -1 >.txt

Mogrify -调整 50% @list.txt

这将使用“查找”来获取所有更新于 1 天的 *.png 图像,并将它们打印到名为“list.txt”的文件中。然后,“mogrify”读取该列表,处理图像,并用调整大小的版本覆盖原始版本。从一个系统到另一个系统的“find”行为可能存在细微差异,因此您必须检查手册页以了解确切的用法。

3赞 Ross Bencina 4/21/2021 #14

一些建议的答案与该选项一起使用,文档称这就像“用电锯进行手术”。该选项会删除许多块。为了防止“iCCP:已知不正确的sRGB配置文件”警告,删除块就足够了,如下所示:pngcrush-rem allbiCCP

pngcrush -ow -rem iCCP filename.png
1赞 Kinght 金 12/21/2022 #15

当我训练 yolo 时,每个 epoch 都会出现警告。然后我使用 bash 查找 png,然后使用 python3 和 opencv(cv2) 重写 png 文件。因此,警告只是在重写时发生。步骤如下:libpng warning: iCCP: known incorrect sRGB profile

步骤 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
1赞 Abobker Elaghel 12/28/2022 #16

对于PHP开发人员来说,在功能上有这个问题imagecreatefrompng

您可以尝试使用以下命令禁止显示警告@

$img = @imagecreatefrompng($file);