aviso de libpng: iCCP: perfil sRGB incorreto conhecido

173

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?

rkarami
fonte

Respostas:

180

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 mogrifyImageMagick:

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 -nmeios não reescrevem os arquivos e -qsuprimem 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 respasta.

Por exemplo:

C:\{your_project_folder}\app\src\main\res\drawable-hdpi\mogrify *.png
Glenn Randers-Pehrson
fonte
13
Com o ImageMagick, você pode usar o comando -strip . Especificamente, usei o mogrify para afetar todas as imagens em uma pasta. Meu comando tinha a seguinte aparência
Maxito 25/11/2014
24
A opção -strip removerá todos os perfis. Se você omitir a opção -strip ( mogrify * .png ), apenas perfis incorretos serão excluídos.
Glenn Randers-Pehrson
2
Existe uma maneira de descobrir qual arquivo está acionando o aviso? A execução mogrify **/*.pngparece modificar todos os arquivos na árvore. Eu preferiria atualizar apenas a imagem com defeito.
Uflex
1
Use find . -type f -name '*.png' -execute mogrify \{\} \;para modificar recursivamente os .pngarquivos no diretório atual.
val diz Reintegrar Monica
Os binários do ImageMagick congelaram meu computador, talvez por trabalhar demais e depois de sair da noite para o dia, tivessem que reiniciar com força. Utilizou o aplicativo pngcrush para detectar o problema, conforme mencionado, -owpara 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.
Pysis
73

Use pngcrushpara 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 bits

Na saída do console, você deve ver Removed the sRGB chunke 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.

friederbluemle
fonte
7
Isso funcionou! Faça isso recursivamente a partir da pasta atual, coloque-o em um arquivo .bat: Para / R %% i em (* .png) faça PNGCRUSH.EXE -ow -rem allb -reduce %% i
Andy Brice
13
E um one-liner para * nix para corrigir recursivamente todos os arquivos PNG no diretório atual: find . -type f -iname '*.png' -exec pngcrush -ow -rem allb -reduce {} \;(Testado em GNU / Linux)
friederbluemle
2
Acima da linha por frieder também funciona dentro do git bash no windows.
IKlsR 8/03
Pngcrush não remove este pedaço no meu caso. Mas o mogrify de imagemagick fez isso.
Nikos
25

Solução

O perfil incorreto pode ser corrigido por:

  1. Abrindo a imagem com o perfil incorreto usando QPixmap :: load
  2. Salvando a imagem de volta no disco (já com o perfil correto) usando QPixmap :: save

Nota: Esta solução usa a biblioteca Qt .

Exemplo

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!

scopchanov
fonte
4
Estou surpreso que esta resposta não tenha sido votada. Ele não requer a instalação de qualquer coisa e ele funciona ... o que mais se poderia pedir :)
Quantuple
17

Você também pode consertar isso no photoshop ...

  1. Abra o seu arquivo .png.
  2. Arquivo -> Salvar como e na caixa de diálogo exibida, desmarque "ICC Profile: sRGB IEC61966-2.1"
  3. Desmarque "Como uma cópia".
  4. Salve corajosamente o seu .png original.
  5. Continue com sua vida sabendo que você removeu apenas um pouquinho do mal do mundo.
Spencer
fonte
8

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 -print0e -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 :)

Uflex
fonte
3
No Debian, para encontrar os arquivos que eram problemáticos no meu software, eu usei find . -name "*.png" -exec sh -c 'echo Testing {} && pngcrush -n -q {}' \;Todo PNG incorreto irá gerar #pngcrush: iCCP: known incorrect sRGB profile
Gabriel Devillers
7

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)
Devan Williams
fonte
2
Isso é bem multiplataforma, embora se você estiver em uma plataforma que suporte um bom shell * NIX-y como Zsh ou Bash, você pode apenas usá-lo mogrify **/*.png.
Kyle Strand
1
Sim, bom argumento. Eu usei apenas o Python porque desenvolvemos no Windows e Linux e queria comprometer esse script ao nosso repositório para uso futuro.
precisa
5

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.

Adriel Jr
fonte
1
Não encontrei o pngfix na instalação padrão do OS El Capitan (ou talvez não tenha pesquisado o suficiente), mas o encontrei na instalação do MAMP que eu tinha. Funcionou perfeitamente! Obrigado! Aprovado
guido
Você está certo! Eu o instalei com o "brew install libpng" há muito tempo.
Adriel Jr
Eu obtive "n! Ew ERR 08, lendo Undefined_error: _0 Undefined_error: _0 not_a_PNG_ (too_short) car.png" ao executar isso na versão 10.13.2.
Mitch
@Itch Ainda funciona bem após a atualização para 10.13.6.
Adriel Jr
4

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"
chorume
fonte
2
Isso merece mais votos. Todas as outras soluções tocam em todos os arquivos, o que é especialmente ruim se você tiver muitas imagens em um sistema de controle de versão. Obrigado pelo script!
Kfunk
Eu tenho, pngcrush 1.7.85, uses libpng 1.6.21 and zlib 1.2.8mas meu pngcrush não tem -warnnem -reducesinalizadores, então esta solução não funciona.
pbhj
4

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.

(fonte: https://forum.qt.io/topic/58638/solved-libpng-warning-iccp-known-incorrect-srgb-profile-drive-me-nuts/16 )

George Birbilis
fonte
3

Usando o visualizador de imagens IrfanView no Windows, simplesmente salvei novamente a imagem PNG e isso corrigiu o problema.

Neil Roy
fonte
1

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.

sahasrara62
fonte
0

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.

yadayada
fonte
-2

Aqui está uma resposta de força ridiculamente bruta:

Eu modifiquei o script gradlew. Aqui está meu novo comando exec no final do arquivo no diretório

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