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

问题描述 投票:138回答:12

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

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

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

c++ warnings sdl rgb libpng
12个回答
147
投票

与先前版本相比,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

3
投票

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

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


-2
投票

这是一个荒谬的暴力回答:

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

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" **| grep -v "libpng warning:"**

65
投票

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

pngcrush -ow -rem allb -reduce file.png
  • -ow将覆盖输入文件
  • 除了tRNS和gAMA之外,-rem allb将删除所有辅助组块
  • -reduce可实现无损色彩或位深度缩减

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


18
投票

Solution

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

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

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

Example

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

QPixmap pixmap;
pixmap.load("badProfileImage.png");

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

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


10
投票

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

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

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,我只是添加一个答案,因为它通常比评论更容易找到:)


6
投票

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

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


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图像并更正了问题。

© www.soinside.com 2019 - 2024. All rights reserved.