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


172

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

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

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



Answers:


179

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

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

convert in.png out.png

要从文件夹(目录)中所有PNG文件中删除无效的iCCP块,可以mogrify在ImageMagick中使用:

mogrify *.png

这要求您的ImageMagick是使用libpng16构建的。您可以通过运行以下命令轻松检查它:

convert -list format | grep PNG

如果您想找出哪些文件需要修复而不是盲目地处理所有文件,则可以运行

pngcrush -n -q *.png

其中-n均值表示不重写文件,并且-q均值表示禁止显示除警告之外的大多数输出​​。抱歉,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

24
-strip选项将删除所有配置文件。如果省略-strip选项(mogrify * .png),则仅会删除不正确的配置文件。
Glenn Randers-Pehrson,2014年

2
有没有办法找出哪个文件触发了警告?运行mogrify **/*.png似乎会修改树中的所有文件。我宁愿只更新一个故障图像。
Uflex

1
使用find . -type f -name '*.png' -execute mogrify \{\} \;递归修改.png在当前目录下的文件。
瓦尔说恢复莫妮卡

如果ImageMagick二进制文件冻结了我的计算机,可能是由于工作太辛苦,并且在一夜之间离开后,必须强制重新启动。使用pngcrush应用程序检测到如上所述的问题,-ow覆盖并修复文件,并且将大小减小了大约1/6!只需获得Mac的程序源代码,进行编译,手动安装并运行它。GitHub Kjuly / pngcrush可能具有预编译的二进制文件,但不确定。Sourceforge似乎只有Windows exe可用和源代码。Friederbluemle的答案似乎不仅仅可以做到这一点。
Pysis

72

用于pngcrush从png文件中删除错误的sRGB配置文件:

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

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


7
可行!从当前文件夹中递归地将其放入.bat文件中:对于(* .png)中的/ R %% i,请执行PNGCRUSH.EXE -ow -rem allb -reduce %% i
Andy Brice

13
* nix可以一线递归地修复当前目录中的所有png文件:(find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;在GNU / Linux上测试)
friederbluemle

2
弗里德(Frieder)上面的线也可以在Windows上的git bash中使用。
iKlsR

在我的情况下,Pngcrush不会删除此块。但是imagemagick的抱怨做到了。
Nikos

25

错误的配置文件可以通过以下方式解决:

  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上获得

从05.12.2019更新:答案是并且仍然有效,但是我在GitHub上共享的GUI应用程序中存在一个错误,导致输出图像为空。我已解决问题,对于给您带来的不便深表歉意!


4
我很惊讶这个答案没有得到支持。它不需要安装任何东西,它可以工作...一个人还能要求:)
Quantuple

17

您也可以在Photoshop中解决此问题...

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

8

为了增加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 ./Installer/Images/installer_background.png

这样做可以防止在实际上只修改少数几个提交的情况下,使提交更改存储库中的每个png文件。此外,它还具有准确显示哪些文件出错的优点。

我在Windows上使用Cygwin控制台和zsh shell 对此进行了测试。再次感谢格伦(Glenn)讲了大部分上述内容,我只是添加一个答案,因为通常比注释更容易找到:)


3
在Debian上,要查找我的软件中有问题的文件,我使用了find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;每个都会生成错误的PNGpngcrush: iCCP: known incorrect sRGB profile
Gabriel Devillers 18-10-25

7

多亏了梦幻般的答案,从格伦,我用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)

2
这是一个很好的跨平台平台,但是如果您使用的平台支持Zsh或Bash这样的* NIX-y外壳,则可以使用mogrify **/*.png
凯尔·斯特兰德

1
是的,很好。我之所以只使用Python,是因为我们在Windows和Linux上进行开发,并且希望将此脚本提交给我们的仓库以供将来使用。
Devan Williams

5

使用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工具。


1
我在标准的El Capitan操作系统安装中没有找到pngfix(或者搜索不够好),但是在我拥有的MAMP安装中找到了。工作完美!谢谢!Upvoted
圭多

你是对的!我很久以前用“ brew install libpng”安装了它。
小德里安(Adriel Jr)

当在10.13.2上运行此命令时,我收到“ n!ew ERR 08读为Undefined_error:_0 Undefined_error:_0 not_a_PNG_(too_short)car.png”。
米奇

升级到10.13.6后,@ Mitch仍然可以正常运行。
Adriel Jr

4

在尝试了此页面上的一些建议之后,我最终使用了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"

2
这值得更多的投票。所有其他解决方案都涉及到每个文件,如果您在版本控制系统中有很多映像,这尤其糟糕。感谢您的脚本!
kfunk

我有,pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8但是我的pngcrush没有,也-warn没有-reduce标志,所以此解决方案不起作用。
pbhj

4

一些背景信息:

libpng 1.6+版中的某些更改导致它发出警告,甚至无法与原始HP / MS sRGB配置文件一起正常工作,从而导致以下stderr:libpng警告:iCCP:已知不正确的sRGB配置文件旧的配置文件使用D50白点, D65是标准位置。尽管默认情况下未将此配置文件嵌入图像中,但该配置文件并不少见,由Adobe 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


3

在Windows中使用IrfanView图像查看器,我只是重新保存了PNG图像,从而解决了该问题。


1

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


0

我在项目的根目录及其固定版本中运行了这两个命令。

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

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

mogrify -resize 50%@ list.txt

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


-2

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

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

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.