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

C++ libpng警告:iCCP:已知错误的sRGB配置文件,c++,warnings,sdl,rgb,libpng,C++,Warnings,Sdl,Rgb,Libpng,我正在尝试使用SDL加载PNG图像,但该程序无法工作,此错误出现在控制台中 libpng警告:iCCP:已知错误的sRGB配置文件 为什么会出现此警告?如何解决此问题?Libpng-1.6在检查ICC配置文件方面比以前的版本更严格。你可以忽略这个警告。要删除它,请从PNG图像中删除iCCP块 一些应用程序将警告视为错误;如果您正在使用这样一个应用程序,那么您必须删除区块。您可以使用任何一种PNG编辑器(如ImageMagick)来实现这一点 convert in.png out.png 要从文

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

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


为什么会出现此警告?如何解决此问题?

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

一些应用程序将警告视为错误;如果您正在使用这样一个应用程序,那么您必须删除区块。您可以使用任何一种PNG编辑器(如ImageMagick)来实现这一点

convert in.png out.png
要从文件夹(目录)中的所有PNG文件中删除无效的iCCP块,可以使用ImageMagick中的
mogrify

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

convert-list格式| grep PNG
如果您想找出哪些文件需要修复,而不是盲目地处理所有文件,您可以运行

pngcrush-n-q*.png
其中,
-n
表示不重写文件,
-q
表示抑制除警告以外的大部分输出。抱歉,pngcrush中还没有任何选项来抑制除警告之外的所有内容


ImageMagick的二进制版本是


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

例如:

C:\{your\u project\u folder}\app\src\main\res\drawable hdpi\mogrify*.png

Libpng-1.6比以前的版本更严格地检查ICC配置文件。你可以忽略这个警告。要删除它,请从PNG图像中删除iCCP块

一些应用程序将警告视为错误;如果您正在使用这样一个应用程序,那么您必须删除区块。您可以使用任何一种PNG编辑器(如ImageMagick)来实现这一点

convert in.png out.png
要从文件夹(目录)中的所有PNG文件中删除无效的iCCP块,可以使用ImageMagick中的
mogrify

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

convert-list格式| grep PNG
如果您想找出哪些文件需要修复,而不是盲目地处理所有文件,您可以运行

pngcrush-n-q*.png
其中,
-n
表示不重写文件,
-q
表示抑制除警告以外的大部分输出。抱歉,pngcrush中还没有任何选项来抑制除警告之外的所有内容


ImageMagick的二进制版本是


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

例如:

C:\{your\u project\u folder}\app\src\main\res\drawable hdpi\mogrify*.png
用于从png文件中删除不正确的sRGB配置文件:

pngcrush-ow-rem allb-reduce file.png
  • -ow
    将覆盖输入文件
  • -rem allb
    将删除除TRN和gAMA之外的所有辅助块
  • -reduce
    进行无损颜色类型或位深度减少
在控制台输出中,您应该看到
删除了sRGB块
,可能还有更多关于块删除的消息。您将得到一个更小、优化的PNG文件。由于该命令将覆盖原始文件,请确保创建备份或使用版本控制。

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

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

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

以下是一个可笑的暴力回答:

我修改了gradlew脚本。下面是我的新exec命令,位于

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

下面是一个可笑的强力回答:

我修改了gradlew脚本。下面是我的新exec命令,位于

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

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

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

多亏了from,我使用了的“mogrify*.PNG”功能。但是,我将图像隐藏在子文件夹中,因此我使用此简单脚本将其应用于所有子文件夹中的所有图像,并认为它可能会帮助其他人:

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)
多亏了from,我使用了的“mogrify*.png”功能。但是,我将图像隐藏在子文件夹中,因此我使用此简单脚本将其应用于所有子文件夹中的所有图像,并认为它可能会帮助其他人:

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)

为了补充Glenn的好答案,我做了以下工作来查找哪些文件有问题:

find-名称“*.png”-类型f-print0 | xargs\
-0 pngcrush_1_8_8_w64.exe-n-q>pngError.txt 2>&1
我使用find和xargs是因为pngcrush无法处理大量参数(由
***.png
返回)。处理包含空格的文件名需要
-print0
-0

然后在输出中搜索以下行:
iCCP:无法识别已编辑的已知sRGB配置文件

./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文件。加上它有
#!/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"
$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
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)
pngcrush -ow -rem iCCP filename.png