Tratamiento y conversión de imágenes con ImageMagick (I)

AdriMcGrady 23/12/2022

Seguro que has tenido hacer cambios en las propiedades de una imagen (tamaño, formato, etc) muchas veces. Y seguro que has usado cualquier programa de edición en tu PC o una app para el móvil. Pero… ¿y si tuvieras que hacer el mismo cambio a decenas o cientos de imágenes? ¿sería efectivo hacerlo de esa forma? Para solucionar esto, damos gracias a ImageMagick por existir. En este primer capítulo os contaré como realizar algunas operaciones básicas con imágenes desde la terminal con ImageMagick. Y habrá un segundo capítulo donde aplicaré estas transformaciones para generar un script que nos ayude a lidiar con las diferentes densidades de pantalla en el desarrollo de aplicaciones para Android.

ImageMagick

Creo que es lógico empezar hablando de ImageMagick. Se trata de una suite open source para la visualización, edición y conversión de imágenes. De modo que permite la modificación de múltiples propiedades de nuestras imágenes. Desde animaciones a reducción de ruido o cambios de tamaño o directamente la conversión entre formatos. Y todo esto para usar desde la terminal, por lo que las posibilidades de automatización y de encadenamiento de operaciones son casi infinitas.

En este ejemplo, voy a centrarme en las más básicas que, al menos para mí son:

  • Cambio de tamaño.
  • Conversión de formato.

Instalación de ImageMagick

ImageMagick se puede instalar de varias maneras:

  • Mediante la mejor opción que suele ser la paquetería de tu distribución. El paquete suele llamarse imagemagick:
# Debian/Ubuntu 
apt install imagemagick

# RedHat/Centos/OracleLinux
dnf install ImageMagick
  • Si por el contrario tienes algún problema con los paquetes oficiales como por ejemplo un bug que impide convertir tus imágenes desde el formato XCF a otros formatos y usas Debian/Ubuntu puedes ayudarte de “IMEI - ImageMagick Easy Install” que automáticamente descarga los fuentes, los compila y los instala: https://softcreatr.github.io/imei/

Usando ImageMagick

Independientemente del método de instalación que hayas usado el funcionamiento será el mismo. Sí tienes que tener en cuenta que en las versiones antiguas de imagemagick, el comando básico para el tratamiento de las imágenes era convert y ahora se llama magick. De hecho, se sigue manteniendo convert como un link simbólico a magick para facilitar la compatibilidad de scripts o aplicaciones ya creadas previamente.

Como ejemplo para las transformaciones vamos a usar el logo del blog. Una imagen cuadrada de tamaño 378x378 y formato XCF. Y para que no tengas que fiarte de mi palabra con respecto a la imagen inicial, el primer subcomando del que te hablaré es identify. Este comando provee información básica sobre una imagen sobre una imagen.

El uso de ImageMagick para la opción identify es bastante simple:

adrimcgrady@bixito:~$ magick identify noroute2host_logo.xcf 
noroute2host_logo.xcf XCF 378x378 378x378+0+0 8-bit sRGB 0.020u 0:00.007

Para una información más extensa se puede usar el modificador -verbose, pero sin él ya nos quedan claras las características de nuestra imagen inicial. Así que vamos a empezar por mostrar como convertir nuestro archivo XCF a PNG manteniendo el resto de propiedades. Y esto se hace todavía más fácil. La sintaxis básica para esto es:

magick "imagen_entrada.formato_original" "imagen_salida.formato_salida"

Lo que en el caso de la conversión de nuestro logo a PNG desde XCF quedaría de la siguiente manera:

# Conversión de imagen XCF a PNG
adrimcgrady@bixito:~$ magick noroute2host_logo.xcf noroute2host_logo.png

# Uso de identify para ver las propiedades de la nueva imagen
adrimcgrady@bixito:~$ magick identify noroute2host_logo.png
noroute2host_logo.png PNG 378x378 378x378+0+0 8-bit sRGB 12617B 0.000u 0:00.000

Y aquí esta la imagen resultante:

noroute2host.com logo png

Si además de convertir el formato, quieres redimensionar la imagen, no es ningún problema. Solo tendrás que añadir la operación -resize junto con el tamaño deseado al comando de conversión. Por lo que quedaría así:

# Conversión de imagen XCF a PNG + Cambio de tamaño a 128x128
adrimcgrady@bixito:~$ magick noroute2host_logo.xcf -resize 128x128  noroute2host_logo_128.png

# Uso de identify para ver las propiedades de la nueva imagen
adrimcgrady@bixito:~$ magick identify noroute2host_logo_128.png 
noroute2host_logo_128.png PNG 128x128 128x128+0+0 8-bit sRGB 5937B 0.000u 0:00.000

Este sería el resultado:

noroute2host.com logo png 128

Al respecto de las imágenes XCF, tengo que admitir que la imagen usada de ejemplo es monocapa, pero un archivo XCF puede tener varias capas. Y si haces las conversiones tal y como te he descrito arriba, se generarían imágenes diferentes para capas diferentes añadiendo un apéndice numérico al final del nombre del fichero. Si quieres evitar esto, debes usar la operación -flatten que es un alias de -layers flatten. Y que básicamente lo que hace es “aplanar” todas las capas. Hay otras opciones para las capas tal y como puedes consultar aquí. En cualquier caso, dejo aquí un ejemplo de como realizar esta operación.

# Conversión de imagen XCF multicapa a PNG aplanando las capas.
adrimcgrady@bixito:~$ magick noroute2host_logo_mcapa.xcf -flatten noroute2host_logo_mcapa.png

Mogrify. Mejorando el tratamiento por lotes.

Lo último que voy a contarte de ImageMagick algo relativo a sus posibilidades de ser usado por lotes o en scripts. Y es que para este cometido existe un subcomando diferente llamado mogrify. Esta herramienta nos permite una mejor automatización. Pero hay que tener en cuenta que si no usamos la opción -format para realizar conversión del fichero original o -path para cambiar el destino se sobrescribirá el fichero original.

De modo, que si queremos hacer la misma operación que anteriormente, es decir, convertir una imagen de formato XCF a PNG y cambiar su tamaño, pero ampliándolo a todas las imágenes de un directorio sería algo así:

adrimcgrady@bixito:~$ magick mogrify -resize 128x128 -format png -path $HOME/imgs_convertidas/ $HOME/imgs_originales/*.xcf

En el anterior comando estamos usando la herramienta mogrify para tratar todas todas las imágenes XCF del directorio $HOME/imgs_originales/*.xcf con 3 opciones:

  • -resize: Para redimensionar las imágenes a un tamaño de 128x128.
  • -format: Para establecer el formato de salida a PNG.
  • -path: Para fijar el directorio de salida de las nuevas imágenes a $HOME/imgs_convertidas/

Puedes consultar más opciones para la herramienta mogrify en el enlace que te dejo al final del post.

¿Algo más?

Como puedes ver, las posibilidades de ImageMagick son casi infinitas. Así que si quieres ampliar tu conocimiento de que más puedes hacer te recomiendo que eches uno ojo a la documentación oficial. En concreto, te recomiendo este apartado donde hay infinidad de ejemplos de todo lo que puedes hacer. Por mi parte, te emplazo al siguiente capítulo de este tema que estará disponible próximamente, y en el que te contaré como usar estas operaciones para trabajar con las diferentes densidades de pantalla en el desarrollo de aplicaciones para Android.

Enlaces de interés:

Artículo anterior Artículo siguiente

Artículos relacionados: