Estou tentando carregar uma imagem PNG usando SDL, mas o programa não funciona e esse erro aparece no console
aviso de libpng: iCCP: perfil sRGB incorreto conhecido
Por que esse aviso aparece? O que devo fazer para resolver este problema?
Estou tentando carregar uma imagem PNG usando SDL, mas o programa não funciona e esse erro aparece no console
aviso de libpng: iCCP: perfil sRGB incorreto conhecido
Por que esse aviso aparece? O que devo fazer para resolver este problema?
Respostas:
A Libpng-1.6 é mais rigorosa quanto à verificação de perfis ICC do que nas versões anteriores. Você pode ignorar o aviso. Para se livrar dele, remova o pedaço do iCCP da imagem PNG.
Alguns aplicativos tratam avisos como erros; se você estiver usando esse aplicativo, precisará remover o pedaço. Você pode fazer isso com vários editores PNG, como o ImageMagick's
convert in.png out.png
Para remover o bloco inválido do iCCP de todos os arquivos PNG em uma pasta (diretório), você pode usar o mogrify
ImageMagick:
mogrify *.png
Isso requer que seu ImageMagick tenha sido construído com libpng16. Você pode verificá-lo facilmente executando:
convert -list format | grep PNG
Se você deseja descobrir quais arquivos precisam ser corrigidos, em vez de processá-los às cegas, é possível executar
pngcrush -n -q *.png
onde os -n
meios não reescrevem os arquivos e -q
suprimem a maior parte da saída, exceto os avisos. Desculpe, ainda não há opção no pngcrush para suprimir tudo, exceto os avisos.
As versões binárias do ImageMagick estão aqui
Para projetos do Android (Android Studio), navegue até a res
pasta.
Por exemplo:
C:\{your_project_folder}\app\src\main\res\drawable-hdpi\mogrify *.png
mogrify **/*.png
parece modificar todos os arquivos na árvore. Eu preferiria atualizar apenas a imagem com defeito.
find . -type f -name '*.png' -execute mogrify \{\} \;
para modificar recursivamente os .png
arquivos no diretório atual.
-ow
para substituir e corrigir o arquivo, além de reduzir o tamanho em cerca de 1/6! Só precisava obter o código fonte do programa para o meu mac, compilar, instalar manualmente e executá-lo. O GitHub Kjuly / pngcrush pode ter um binário pré-compilado, mas não tenho certeza. O Sourceforge parecia ter apenas o Windows exe disponível e o código-fonte. A resposta de friederbluemle parece fazer isso e muito mais.
Use pngcrush
para remover o perfil sRGB incorreto do arquivo png:
pngcrush -ow -rem allb -reduce file.png
-ow
substituirá o arquivo de entrada-rem allb
removerá todos os pedaços auxiliares, exceto tRNS e gAMA-reduce
reduz o tipo de cor sem perdas ou a profundidade de bitsNa saída do console, você deve ver Removed the sRGB chunk
e possivelmente mais mensagens sobre remoções de fragmentos. Você terminará com um arquivo PNG menor e otimizado. Como o comando substituirá o arquivo original, crie um backup ou use o controle de versão.
find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;
(Testado em GNU / Linux)
O perfil incorreto pode ser corrigido por:
Nota: Esta solução usa a biblioteca Qt .
Aqui está um exemplo mínimo que eu escrevi em C ++ para demonstrar como implementar a solução proposta:
QPixmap pixmap;
pixmap.load("badProfileImage.png");
QFile file("goodProfileImage.png");
file.open(QIODevice::WriteOnly);
pixmap.save(&file, "PNG");
O código fonte completo de um aplicativo GUI baseado neste exemplo está disponível no GitHub .
ATUALIZAÇÃO DE 05.12.2019: A resposta foi e ainda é válida, no entanto, houve um erro no aplicativo GUI que compartilhei no GitHub, fazendo com que a imagem de saída fique vazia. Acabei de corrigir e peço desculpas pelo inconveniente!
Você também pode consertar isso no photoshop ...
Para adicionar a ótima resposta de Glenn, aqui está o que eu fiz para descobrir quais arquivos estavam com defeito:
find . -name "*.png" -type f -print0 | xargs \
-0 pngcrush_1_8_8_w64.exe -n -q > pngError.txt 2>&1
Eu usei o find e xargs porque o pngcrush não conseguiu lidar com muitos argumentos (retornados por **/*.png
). O -print0
e -0
é necessário para manipular nomes de arquivos contendo espaços.
Em seguida, procure na saída para estas linhas: 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
E para cada um deles, execute o mogrify nele para corrigi-los.
mogrify ./Installer/Images/installer_background.png
Isso evita que uma confirmação altere todos os arquivos png no repositório quando apenas alguns foram realmente modificados. Além disso, tem a vantagem de mostrar exatamente quais arquivos estão com defeito.
Testei isso no Windows com um console Cygwin e um shell zsh. Mais uma vez obrigado a Glenn, que colocou a maioria dos itens acima, estou apenas adicionando uma resposta, pois geralmente é mais fácil encontrar do que comentários :)
find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;
Todo PNG incorreto irá gerar #pngcrush: iCCP: known incorrect sRGB profile
Graças à resposta fantástica de Glenn , usei a funcionalidade "mogrify * .png" do ImageMagik . No entanto, eu tinha imagens enterradas em subpastas, então usei esse script Python simples para aplicar isso a todas as imagens em todas as subpastas e pensei que isso poderia ajudar outras pessoas:
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)
mogrify **/*.png
.
Existe uma maneira mais fácil de corrigir esse problema com o Mac OS e o Homebrew:
Instale o homebrew se ainda não estiver instalado
$brew install libpng
$pngfix --strip=color --out=file2.png file.png
ou para fazê-lo com todos os arquivos no diretório atual:
mkdir tmp; for f in ./*.png; do pngfix --strip=color --out=tmp/"$f" "$f"; done
Ele criará uma cópia fixa para cada arquivo png no diretório atual e a colocará no subdiretório tmp. Depois disso, se tudo estiver OK, você precisará substituir os arquivos originais.
Outra dica é usar os aplicativos Keynote e Preview para criar os ícones. Eu os desenho usando o Keynote, no tamanho de cerca de 120x120 pixels, sobre um slide com fundo branco (a opção de tornar os polígonos editáveis é ótima!). Antes de exportar para a Visualização, desenhei um retângulo ao redor do ícone (sem preenchimento ou sombra, apenas o contorno, com o tamanho de 135x135) e copio tudo para a área de transferência. Depois disso, você só precisa abri-lo com a ferramenta Visualizar usando "Novo da área de transferência", selecione uma área de 128x128 pixels ao redor do ícone, copie, use "Novo da área de transferência" novamente e exporte-o para PNG. Você não precisará executar a ferramenta pngfix.
Depois de tentar algumas sugestões nesta página, acabei usando a solução pngcrush. Você pode usar o script bash abaixo para detectar e corrigir recursivamente perfis png incorretos. Basta passar o caminho completo para o diretório que você deseja procurar por arquivos png.
fixpng "/path/to/png/folder"
O script:
#!/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
mas meu pngcrush não tem -warn
nem -reduce
sinalizadores, então esta solução não funciona.
algumas informações básicas sobre isso:
Algumas alterações na libpng versão 1.6 ou superior fazem com que ele emita um aviso ou até não funcione corretamente com o perfil sRGB HP / MS original, levando ao seguinte stderr: aviso libpng: iCCP: perfil sRGB incorreto conhecido O perfil antigo usa um ponto branco D50, onde D65 é padrão. Esse perfil não é incomum, sendo usado pelo Adobe Photoshop, embora não tenha sido incorporado às imagens por padrão.
(fonte: https://wiki.archlinux.org/index.php/Libpng_errors )
A detecção de erros em alguns pedaços foi aprimorada; em particular, o leitor de partes do iCCP agora faz uma validação bastante completa do formato básico. Alguns perfis incorretos que foram aceitos anteriormente agora são rejeitados, em particular o perfil sRGB da Microsoft / HP quebrado muito antigo. O requisito de especificação PNG de que apenas perfis em escala de cinza possam aparecer em imagens com o tipo de cor 0 ou 4 e que, mesmo que a imagem contenha apenas pixels em cinza, apenas perfis RGB possam aparecer em imagens com o tipo de cor 2, 3 ou 6, agora são aplicados. O bloco sRGB pode aparecer em imagens com qualquer tipo de cor.
Estendendo a solução friederbluemle, faça o download do pngcrush e use o código como este se estiver sendo executado em vários arquivos 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)
aqui todos os arquivos png relacionados a projetos estão em uma pasta.
Eu executei esses dois comandos na raiz do projeto e foi corrigido.
Redirecione basicamente a saída do comando "find" para um arquivo de texto para usar como sua lista de arquivos a serem processados. Então você pode ler esse arquivo de texto em "mogrify" usando o sinalizador "@":
find * .png -mtime -1> list.txt
mogrify -resize 50% @ list.txt
Isso usaria "find" para obter todas as imagens * .png com mais de 1 dia e imprimi-las em um arquivo chamado "list.txt". Em seguida, "mogrify" lê essa lista, processa as imagens e substitui os originais pelas versões redimensionadas. Pode haver pequenas diferenças no comportamento de "localizar" de um sistema para outro, portanto, você deverá verificar a página de manual quanto ao uso exato.