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
- manter o perfil ICC, mas ocultar avisos em geral,
- remover o perfil ICC ou
- 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 -quiet
opçã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");
Há duas desvantagens nessa abordagem:
Se sua imagem já estiver no espaço de cores sRGB e você usar
-colorspace sRGB
para 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 sRGB
nã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 RGB
em 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-colorspace
de acordo.Obviamente, se você
-colorspace
alterar 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-colorspace
operador 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.