Erro ao converter um PDF para PNG no ImageMagick

Erro ao converter um PDF para PNG no ImageMagick

Eu uso o Imagemagick convert para converter arquivos pdf em png da seguinte maneira:

Magick convert -density 300 PointOnLine.pdf -quality 90 PointOnLine.png

Dá um aviso:

convert: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG `PointOnLine.png' @ warning/png.c/MagickPNGWarningHandler/1744.

E a imagem png criada é toda preta. No entanto, converter para imagem JPG está bem. Qual é o problema? Obrigado.

Responder1

Tente adicionar -colorspace RGB antes do nome do arquivo de saída.

convert -density 300 PointOnLine.pdf -quality 90 -colorspace RGB PointOnLine.png

Responder2

Odocumentaçãodiz isto:

PNG RW Portable Network Graphics Requer libpng-1.0.11 ou posterior, libpng-1.2.5 ou posterior recomendado. A especificação PNG não suporta unidades de pixels por polegada, apenas pixels por centímetro. Para evitar a leitura de um determinado perfil de imagem associado, use -define profile:skip=name (por exemplo, profile:skip=ICC).

Portanto, tente adicionar -define profile:skip=ICC(ou skip="*") antes do nome do arquivo de saída.

Veja também:documentação sobre o comando define

Responder3

Estou usando o ImageMagick 7.1.1-8 e tive o mesmo problema:

$ magick example.pdf output.png
magick: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG `output.png' @ warning/png.c/MagickPNGWarningHandler/1526.
$ magick -version
Version: ImageMagick 7.1.1-8 Q16-HDRI x86_64 d92cb0e65:20230421 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI OpenMP(4.5) 
Delegates (built-in): bzlib djvu fontconfig freetype heic jbig jng jpeg lcms lqr lzma openexr png raqm tiff webp x xml zlib
Compiler: gcc (7.5)
$ 

No meu caso, o ImageMagick (usando Ghostscript) está lendo meu arquivo PDF de entrada e produz dados de imagem no espaço de cores sRGB com um perfil ICC incorporado:

$ magick example.pdf -verbose info: | grep "Colorspace:"
  Colorspace: sRGB
$ magick example.pdf -verbose info: | grep -A1 "Profiles:"
  Profiles:
    Profile-icc: 2576 bytes
$ 

Ao salvar os dados da imagem como um arquivo PNG, o ImageMagick otimiza automaticamente o espaço de cores e salva o arquivo como um PNG em escala de cinza comtipo de cor 0:

$ magick output.png -verbose info: | grep "Colorspace:"
  Colorspace: Gray
$ magick output.png -verbose info: | grep "color_type"
    png:IHDR.color_type: 0 (Grayscale)
$ 

Mas isso acontecenãoremova o perfil ICC incorporado:

$ magick output.png -verbose info: | grep -A1 "Profiles:"
  Profiles:
    Profile-icc: 2576 bytes
$ 

É disso que se trata o aviso: libpng não está esperando umcorPerfil ICC incorporado em umescala de cinzaPNG.

Para nos livrar do aviso, podemos

  1. manter o perfil ICC, mas ocultar avisos em geral,
  2. remover o perfil ICC ou
  3. mantenha o perfil ICC e não salve como PNG em escala de cinza.

Mantenha o perfil ICC, mas oculte os avisos em geral

Se você quiser simplesmente ocultar o aviso, use a -quietopção. Afinal, não é um erro, mas apenas um aviso:

$ magick example.pdf -quiet output.png
$ 

Uma desvantagem pode ser que, se outros avisos aparecerem no futuro, você não notará porque também já os está ocultando.

Remover o perfil ICC

Em vez disso, você pode optar por remover o perfil ICC. Existem várias maneiras de fazer isso. Outras respostas mencionam a alteração do espaço de cores, por exemplo. Isso (às vezes) funciona, porque o ImageMagick remove automaticamente os perfis incorporados ao alterar o espaço de cores:

(void) DeleteImageProfile(image,"icc");
(void) DeleteImageProfile(image,"icm");

Fonte:https://github.com/ImageMagick/ImageMagick/blob/7a63f554dc0f986aa3ef2767d041a0f3294decd2/MagickCore/colorspace.c#L1624-L1625

Há duas desvantagens nessa abordagem:

  1. Se sua imagem já estiver no espaço de cores sRGB e você usar -colorspace sRGBpara converter para o espaço de cores sRGB, o ImageMagick ignorará o operador e, portanto, o perfil não será removido. Por exemplo, meu arquivo PDF de entrada produziu uma imagem no espaço de cores sRGB, o que significa que -colorspace sRGBnão tem efeito e não remove o perfil:

    $ magick example.pdf -colorspace sRGB -verbose info: | grep -A1 "Profiles:"
      Profiles:
        Profile-icc: 2576 bytes
    $ 
    

    Por outro lado, o mesmo acontece se você usar -colorspace RGBem uma imagem que já esteja no espaço de cores RGB. Portanto, se você quiser usar este método para remover o perfil ICC, você terá que verificar com antecedência se sua imagem está em sRGB ou RGB e então usar -colorspacede acordo.

  2. Obviamente, se você -colorspacealterar o espaço de cores da sua imagem, as cores da sua imagem poderão mudar, o que fará com que a imagem pareça diferente. Portanto, após converter o espaço de cores em um espaço de cores diferente para remover o perfil, você deve converter o espaço de cores novamente no espaço de cores original. Portanto, seu comando usará o -colorspaceoperador duas vezes. Para meu arquivo de exemplo, que é sRGB, converto primeiro para RGB e depois volto para sRGB:

    $ magick example.pdf -colorspace RGB -colorspace sRGB -verbose info: | grep "Colorspace:"
      Colorspace: sRGB
    $ magick example.pdf -colorspace RGB -colorspace sRGB -verbose info: | grep -A1 "Profiles:"
    $ 
    

    Você provavelmente ainda receberá alguns erros de arredondamento nas conversões, mas a imagem parecerá mais ou menos idêntica.

Uma forma alternativa de remover o perfil é simplesmente usar -strip:

$ magick example.pdf -strip -verbose info: | grep -A1 "Profiles:"
$ 

No entanto, essa opção não apenas remove todos os perfis, mas também outros metadados, o que pode não ser um comportamento desejado. Verhttps://imagemagick.org/script/command-line-options.php#stripPara maiores informações.

Para remover especificamente o perfil ICC da imagem antes de salvar, você pode usar +profile icc:

$ magick example.pdf +profile icc -verbose info: | grep -A1 "Profiles:"
$ 

Como alternativa, para não ler especificamente nenhum perfil ICC do arquivo de entrada, você pode usar -define profile:skip=icc:

$ magick -define profile:skip=icc example.pdf -verbose info: | grep -A1 "Profiles:"
$ 

Observe que esta configuração afetaleitura, então você deve colocá-lo antes do seu arquivo de entrada.

Mantenha o perfil ICC e não salve como PNG em escala de cinza

Finalmente, se quiser manter o perfil, você pode usar -define png:color-type=para definir o PNG desejadotipo de corpara evitar a conversão automática para escala de cinza e, portanto, evitar o aviso. Para meu arquivo de exemplo, talvez eu queira "Truecolour com alfa", que é o tipo de cor 6:

$ magick example.pdf -define png:color-type=6 output.png
$ magick output.png -verbose info: | grep "color_type"
    png:IHDR.color_type: 6 (RGBA)
$

Alternativamente, você pode usar, por exemplo, o PNG32:prefixo de saída:

$ magick example.pdf PNG32:output.png
$ magick output.png -verbose info: | grep "color_type"
    png:IHDR.color_type: 6 (RGBA)
$ 

Em ambos os casos, nenhum aviso é exibido, mas o perfil ICC é mantido:

$ magick output.png -verbose info: | grep -A1 "Profiles:"
  Profiles:
    Profile-icc: 2576 bytes
$ 

Você pode ler mais sobre esse problema na página de discussões do GitHub do ImageMagick emhttps://github.com/ImageMagick/ImageMagick/discussions/2730ehttps://github.com/ImageMagick/ImageMagick/discussions/6292que fornece excelente suporte.

informação relacionada