Error al convertir un PDF a PNG en ImageMagick

Error al convertir un PDF a PNG en ImageMagick

Utilizo Imagemagick convert para convertir archivos pdf a png de la siguiente manera:

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

Da advertencia:

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

Y la imagen png creada es toda negra. Sin embargo, convertir a una imagen jpg está bien. ¿Cuál es el problema? Gracias.

Respuesta1

Intente agregar -colorspace RGB antes del nombre del archivo de salida.

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

Respuesta2

Eldocumentacióndice esto:

Gráficos de red portátiles PNG RW Requiere libpng-1.0.11 o posterior, se recomienda libpng-1.2.5 o posterior. La especificación PNG no admite unidades de píxeles por pulgada, solo píxeles por centímetro. Para evitar leer un perfil de imagen asociado en particular, utilice -define perfil:skip=nombre (por ejemplo, perfil:skip=ICC).

Intente agregar -define profile:skip=ICC(o skip="*") antes del nombre del archivo de salida.

Ver también:documentación sobre el comando definir

Respuesta3

Estoy usando ImageMagick 7.1.1-8 y tuve el mismo 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)
$ 

En mi caso, ImageMagick (usando Ghostscript) lee mi archivo PDF de entrada y produce datos de imagen en un espacio de color sRGB con un perfil ICC integrado:

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

Al guardar los datos de la imagen como un archivo PNG, ImageMagick optimiza automáticamente el espacio de color y guarda el archivo como un PNG en escala de grises contipo de color 0:

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

pero lo hacenoeliminar el perfil ICC integrado:

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

De eso se trata la advertencia: libpng no espera unacolorPerfil ICC integrado en unescala de grisesPNG.

Para deshacernos de la advertencia, podemos

  1. mantener el perfil ICC pero ocultar las advertencias en general,
  2. eliminar el perfil ICC o
  3. mantenga el perfil ICC y no lo guarde como PNG en escala de grises.

Mantenga el perfil ICC pero oculte las advertencias en general

Si simplemente desea ocultar la advertencia, use la -quietopción. Después de todo, no es un error, sino sólo una advertencia:

$ magick example.pdf -quiet output.png
$ 

Una desventaja podría ser que si aparecen otras advertencias en el futuro, no las notarás porque ya las estás ocultando también.

Eliminar el perfil ICC

En su lugar, puede optar por eliminar el perfil ICC. Hay varias formas de hacerlo. Otras respuestas mencionan cambiar el espacio de color, por ejemplo. Esto (a veces) funciona porque ImageMagick elimina automáticamente los perfiles incrustados al cambiar el espacio de color:

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

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

Hay dos desventajas de este enfoque:

  1. Si su imagen ya está en el espacio de color sRGB y la utiliza -colorspace sRGBpara convertirla al espacio de color sRGB, ImageMagick ignora al operador y, por lo tanto, el perfil no se eliminará. Por ejemplo, mi archivo PDF de entrada produjo una imagen en el espacio de color sRGB, lo que significa que -colorspace sRGBno tiene ningún efecto y no elimina el perfil:

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

    Por el contrario, lo mismo ocurre si lo utiliza -colorspace RGBen una imagen que ya está en el espacio de color RGB. Entonces, si desea utilizar este método para eliminar el perfil ICC, deberá verificar de antemano si su imagen está en sRGB o RGB y luego usarla -colorspaceen consecuencia.

  2. Obviamente, si usas -colorspacepara cambiar el espacio de color de tu imagen, los colores de tu imagen pueden cambiar, lo que hace que la imagen se vea diferente. Por lo tanto, después de convertir el espacio de color a un espacio de color diferente para eliminar el perfil, debe volver a convertir el espacio de color al espacio de color original. Entonces su comando usará el -colorspaceoperador dos veces. Para mi archivo de ejemplo, que es sRGB, primero lo convierto a RGB y luego vuelvo a 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:"
    $ 
    

    Probablemente seguirás recibiendo algunos errores de redondeo en las conversiones, pero la imagen se verá más o menos idéntica.

Una forma alternativa de eliminar el perfil es simplemente usar -strip:

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

Sin embargo, esa opción no sólo elimina todos los perfiles sino también otros metadatos, lo que podría no ser un comportamiento deseado. Verhttps://imagemagick.org/script/command-line-options.php#strippara más información.

Para eliminar específicamente el perfil ICC de la imagen antes de guardarla, puede utilizar +profile icc:

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

Alternativamente, para no leer específicamente ningún perfil ICC del archivo de entrada en primer lugar, puedes usar -define profile:skip=icc:

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

Tenga en cuenta que esta configuración afectalectura, por lo que debe colocarlo antes de su archivo de entrada.

Mantenga el perfil ICC y no lo guarde como PNG en escala de grises

Finalmente, si desea conservar el perfil, puede utilizar -define png:color-type=para configurar el PNG que desee.tipo de colorpara evitar la conversión automática a escala de grises y por tanto evitar la advertencia. Para mi archivo de ejemplo, es posible que desee "Truecolor con alfa", que es el tipo de color 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, puedes usar, por ejemplo, el PNG32:prefijo de salida:

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

En ambos casos, no aparece ninguna advertencia, pero se conserva el perfil ICC:

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

Puede leer más sobre este problema en la página de debates de GitHub de ImageMagick enhttps://github.com/ImageMagick/ImageMagick/discussions/2730yhttps://github.com/ImageMagick/ImageMagick/discussions/6292lo que proporciona un excelente soporte.

información relacionada