【问题标题】:libpng warning: iCCP: known incorrect sRGB profilelibpng 警告:iCCP:已知不正确的 sRGB 配置文件
【发布时间】:2023-12-23 03:50:01
【问题描述】:

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

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

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

【问题讨论】:

标签: c++ warnings sdl rgb libpng


【解决方案1】:

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

pngcrush -ow -rem iCCP filename.png

【讨论】:

    【解决方案2】:

    感谢来自Glennfantastic answer,我使用了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)
    

    【讨论】:

    • 这是一个很好的跨平台,不过如果你的平台支持一个不错的 *NIX-y shell,比如 Zsh 或 Bash,你可以使用mogrify **/*.png
    • 是的,好点。我只使用 Python 是因为我们在 Windows 和 Linux 上进行开发,并希望将此脚本提交到我们的 repo 以供将来使用。
    【解决方案3】:

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

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

    【讨论】:

    • 我用 Photofiltre 7 做到了这一点。只需打开图像,然后在原始 png 上另存为新图像。工作正常,感谢提示
    • @Sunchock 不错。不知何故,这仍然是 4 年后我评价最高的答案......只是一个简单的“保存”。
    【解决方案4】:

    我在项目的根目录中运行了这两个命令并对其进行了修复。

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

    找到 *.png -mtime -1 > list.txt

    mogrify -resize 50% @list.txt

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

    【讨论】:

      【解决方案5】:

      解决方案

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

      1. 使用 QPixmap::load 打开配置文件不正确的图像
      2. 使用QPixmap::save 将图像保存回磁盘(已使用正确的配置文件)

      注意:此解决方案使用Qt Library

      示例

      这是我用 C++ 编写的一个最小示例,用于演示如何实施建议的解决方案:

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

      基于此示例的 GUI 应用程序的完整源代码可在 GitHub 获得。

      2019 年 12 月 5 日更新: 答案是并且仍然有效,但是我在 GitHub 上共享的 GUI 应用程序中存在错误,导致输出图像为空。我刚刚修复了它,对给您带来的不便深表歉意!

      【讨论】:

      • 我很惊讶这个答案没有得到支持。它不需要安装任何东西,它就可以工作......人们还能要求什么:)
      【解决方案6】:

      Libpng-1.6 在检查 ICC 配置文件方面比以前的版本更严格。您可以忽略警告。要摆脱它,请从 PNG 图像中删除 iCCP 块。

      某些应用程序将警告视为错误;如果您正在使用这样的应用程序,则必须删除该块。您可以使用各种 PNG 编辑器(例如 ImageMagick 的

      )中的任何一种来做到这一点
      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 中除了警告之外没有其他选项可以抑制所有内容。


      ImageMagick 的二进制版本是here


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

      例如:

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

      【讨论】:

      • 借助 ImageMagick,您可以使用 -strip 命令。具体来说,我使用mogrify 来影响文件夹中的所有图像。我的命令如下所示:mogrify -strip *.png
      • -strip 选项将删除所有配置文件。如果您省略 -strip 选项 (mogrify *.png),则只会删除不正确的配置文件。
      • 有没有办法找出触发警告的文件?运行mogrify **/*.png 似乎会修改树中的所有文件。我宁愿只更新一个有缺陷的图像。
      • 使用find . -type f -name '*.png' -execute mogrify \{\} \;递归修改当前目录下的.png文件。
      • 如果 ImageMagick 二进制文件冻结了我的计算机,可能是因为工作太辛苦,并且在离开一夜之后,不得不强制重启。如前所述,使用 pngcrush 应用程序检测问题,-ow 覆盖并修复文件,并将大小减少了约 1/6!只需要为我的 mac 获取程序的源代码,手动编译、安装并运行它。 GitHub Kjuly/pngcrush 可能有预编译的二进制文件,但不确定。 Sourceforge 似乎只有 Windows exe 和源代码可用。 Friederbluemle 的回答似乎可以做到这一点,甚至更多。
      【解决方案7】:

      为了补充 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 console 和 zsh shell 对此进行了测试。再次感谢Glenn 提供了上述大部分内容,我只是添加一个答案,因为它通常比 cmets 更容易找到:)

      【讨论】:

      • 在Debian上,为了找到我的软件中有问题的文件,我使用了find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;每个错误的PNG都会生成pngcrush: iCCP: known incorrect sRGB profile
      【解决方案8】:

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

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

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

      【讨论】:

      • 成功了!从当前文件夹递归执行,将其放入 .bat 文件中: For /R %%i in (*.png) do PNGCRUSH.EXE -ow -rem allb -reduce %%i
      • 和一个*nix 递归修复当前目录中所有png文件的单行:find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;(在 GNU/Linux 上测试)
      • Frieder 的上述代码也适用于 Windows 上的 git bash。
      • Pngcrush 在我的情况下不会删除这个块。但是 imagemagick 的 mogrify 做到了。
      【解决方案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 像素(使多边形可编辑的选项很棒!)。在导出到预览之前,我在图标周围画了一个矩形(没有任何填充或阴影,只有轮廓,大小约为 135x135)并将所有内容复制到剪贴板。之后,您只需使用“从剪贴板新建”使用预览工具打开它,在图标周围选择一个 128x128 像素的区域,复制,再次使用“从剪贴板新建”,然后将其导出为 PNG。您无需运行 pngfix 工具。

      【讨论】:

      • 我没有在标准 OS El Capitan 安装中找到 pngfix(或者我可能搜索得不够好),但我在我拥有的 MAMP 安装中找到了它。工作完美!谢谢!赞成
      • 你是对的!我很久以前用“brew install libpng”安装了它。
      • 在 10.13.2 上运行时,我得到了“新的 ERR 08 读取 Undefined_error:_0 Undefined_error:_0 not_a_PNG_(too_short) car.png”。
      • @Mitch 在升级到 10.13.6 后仍然可以正常运行。
      • 很好,对我有用,谢谢分享
      【解决方案10】:

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

      【讨论】:

        【解决方案11】:

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

        我修改了 gradlew 脚本。这是我在

        文件末尾的新 exec 命令
        exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**
        

        【讨论】:

          【解决方案12】:

          一些背景信息:

          libpng 1.6+ 版中的一些更改会导致它发出警告或 甚至无法与原始 HP/MS sRGB 配置文件一起正常工作,导致 到以下标准错误:libpng 警告:iCCP:已知不正确的 sRGB 配置文件 旧配置文件使用 D50 白点,其中 D65 是标准配置。 这个配置文件并不少见,被 Adob​​e Photoshop 使用,虽然 默认情况下它没有嵌入到图像中。

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

          改进了某些块中的错误检测;特别是 iCCP 块阅读器现在对基本格式进行了相当完整的验证。 以前接受的一些不良配置文件现在被拒绝,在 特别是非常旧的损坏的 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

          【讨论】:

            【解决方案13】:

            在尝试了此页面上的一些建议后,我最终使用了 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, uses libpng 1.6.21 and zlib 1.2.8 但我的 pngcrush 没有 -warn 也没有 -reduce 标志,所以这个解决方案不起作用。
            • 我已经测试了你的解决方案,但我收到了这个错误:find:'': No such file or directory 0 errors fixed" 请准确指导如何处理图像文件夹。
            【解决方案14】:

            在 Windows 中使用 IrfanView 图像查看器,我只是重新保存了 PNG 图像并纠正了问题。

            【讨论】: