libpng警告:iCCP:已知错误的sRGB配置文件

rka*_*ami 158 c++ rgb warnings sdl libpng

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

"libpng警告:iCCP:已知错误的sRGB配置文件"

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

Gle*_*son 160

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

有些应用程序将警告视为错误; 如果您使用这样的应用程序,则必须删除该块.您可以使用各种PNG编辑器(如ImageMagick)执行此操作mogrify.

要从文件夹(目录)中的所有PNG文件中删除无效的iCCP块,您可以使用ImageMagick -n,只要您的ImageMagick是使用libpng16构建的(运行-q以确保这一点).

如果你想找出哪些文件需要修复而不是盲目处理所有文件,你可以运行我res 的" mogrify"表示不重写文件," -n"表示除了警告之外抑制大部分输出.对不起,除了警告之外,pngcrush还没有任何选项来禁止所有内容.


ImageMagick的二进制版本就在这里


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

例如: -q

  • -strip选项将删除所有配置文件.如果省略-strip选项(_mogrify*.png_),则只会删除不正确的配置文件. (23认同)
  • 使用ImageMagick,您可以使用[-strip](http://www.imagemagick.org/script/command-line-options.php#strip)命令.具体来说,我使用[mogrify](http://www.imagemagick.org/Usage/basics/#mogrify)来影响文件夹中的所有图像.我的命令看起来像这样:_mogrify -strip*.png_ (13认同)
  • 有没有办法找出哪个文件触发了警告?运行`mogrify**/*.png`似乎修改了树中的所有文件.我宁愿只更新一个有缺陷的图像. (2认同)
  • 使用`查找。-type f -name '*.png' -execute mogrify \{\} \;` 递归修改当前目录下的 `.png` 文件。 (2认同)

fri*_*mle 64

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

pngcrush -ow -rem allb -reduce file.png
Run Code Online (Sandbox Code Playgroud)
  • -ow 将覆盖输入文件
  • -rem allb 将删除除tRNS和gAMA之外的所有辅助块
  • -reduce 是无损色彩还是比特深度减少

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

  • 并且*nix的一行代码以递归方式修复当前目录中的所有png文件:`find.-type f -iname'*.png'-exec pngcrush -ow -rem allb -reduce {} \;`(在GNU/Linux上测试过) (9认同)
  • 那很有效!从当前文件夹递归执行此操作将其放入.bat文件中:对于/ R %%我在(*.png)中执行PNGCRUSH.EXE -ow -rem allb -reduce %% i (4认同)
  • 弗里德(Frieder)上面的线也可以在Windows上的git bash中使用。 (2认同)

sco*_*nov 21

错误的配置文件可以修复:

  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");
Run Code Online (Sandbox Code Playgroud)

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

  • 我很惊讶这个答案没有得到提升.它不需要安装任何东西,它的工作......还有什么可以要求:) (4认同)

Spe*_*cer 12

你也可以在photoshop中解决这个问题......我有CC2015,但我确信这对所有版本都是一样的.

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

  • @Sunchock 不错。不知何故,四年后这仍然是我评价最高的答案......只是一个简单的“保存”。 (2认同)

Ufl*_*lex 7

为了增加Glenn的好答案,我在这里找到了哪些文件有问题:

find . -name "*.png" -type f -print0 | xargs \
       -0 pngcrush_1_8_8_w64.exe -n -q > pngError.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

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

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

./Installer/Images/installer_background.png:
在关键块中找到的数据总长度= 11286
pngcrush:iCCP:无法识别已编辑的已知sRGB配置文件

对于每一个,运行mogrify来修复它们.

./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
Run Code Online (Sandbox Code Playgroud)

这样做可以防止在只有少数实际被修改的情况下更改存储库中每个png文件的提交.此外,它还有一个优势,可以准确显示哪些文件有问题.

我在Windows上用Cygwin控制台和zsh shell 测试了这个.再次感谢Glenn上面提到的大部分内容,我只是添加一个答案,因为它通常比评论更容易找到:)

  • 在Debian上,为了查找软件中有问题的文件,我使用了`find。-name“ * .png” -exec sh -c'echo Testing {} && pngcrush -n -q {}'\;`每个错误的PNG都会生成`pngcrush:iCCP:已知不正确的sRGB配置文件` (2认同)

Dev*_*ams 6

多亏了梦幻般的答案,从格伦,我用ImageMagik的'mogrify*巴纽’功能.但是,我将图像隐藏在子文件夹中,因此我使用这个简单的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)
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的跨平台,但如果你在一个支持漂亮的*NIX-y shell的平台上,比如Zsh或Bash,你可以使用`mogrify**/*.png`. (2认同)

Geo*_*lis 6

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

libpng 版本 1.6+ 中的一些更改会导致它发出警告,甚至无法与原始 HP/MS sRGB 配置文件一起正常工作,从而导致以下 stderr:libpng warning: 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-in Correct-srgb-profile-drive-me-nuts/16 )


小智 5

在尝试了此页面上的一些建议后,我最终使用了 pngcrush 解决方案。您可以使用下面的 bash 脚本递归检测和修复错误的 png 配置文件。只需将完整路径传递给您要搜索 png 文件的目录即可。

fixpng "/path/to/png/folder"
Run Code Online (Sandbox Code Playgroud)

剧本:

#!/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"
Run Code Online (Sandbox Code Playgroud)

  • 这值得更多的赞成。所有其他解决方案都涉及*每个*文件,如果版本控制系统中有大量图像,这尤其糟糕。谢谢你的剧本! (2认同)
  • 我有“pngcrush 1.7.85,使用 libpng 1.6.21 和 zlib 1.2.8”,但我的 pngcrush 没有“-warn”或“-reduce”标志,因此该解决方案不起作用。 (2认同)

Adr*_* Jr 5

使用Mac OS和Homebrew可以更简单地解决此问题:

如果尚未安装自制软件,请安装

$brew install libpng
$pngfix --strip=color --out=file2.png file.png
Run Code Online (Sandbox Code Playgroud)

或对当前目录中的每个文件执行此操作:

mkdir tmp; for f in ./*.png; do pngfix --strip=color --out=tmp/"$f" "$f"; done
Run Code Online (Sandbox Code Playgroud)

它将为当前目录中的每个png文件创建一个固定副本,并将其放入tmp子目录中。之后,如果一切正常,则只需要覆盖原始文件即可。

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