Dimensiones, desplazamiento y anclaje en ImageMagick

by Sjlvanq E. R.
8 minutos
Dimensiones, desplazamiento y anclaje en ImageMagick

¿Qué es y qué puede hacerse con ImageMagick?

ImageMagick, la poderosa suite de software libre para la edición no interactiva de imágenes, lleva a la línea de comandos todas las herramientas necesarias para trabajar con imágenes, sean estas de tipo raster o vectorial. Operaciones básicas como redimensionar una imagen, recortarla, voltearla o girarla y corregir su nivel de brillo, gama o contraste, pero también otras más complejas como añadir a una imagen textos, combinarla con otras o aplicar una matriz de convulsión son, todas ellas, tareas que podemos realizar con ImageMagick desde una terminal de Linux o desde el intérprete de comandos de Windows. Como programa de línea de comandos que es, ImageMagick expone todo su potencial cuando es necesario trabajar con decenas o centenas de imágenes en lote o integrar funciones de procesamiento de imágenes en una aplicación propia.

La contracara de esta multitud de funciones está, fuer es decirlo, en cierta dificultad de uso. Desde luego no será necesario conocer en su totalidad las características y opciones que ofrece —seamos sinceros, la mayoría de nosotros no domina tampoco la totalidad de opciones disponibles en una suite de edición con entorno gráfico—, pero para poder avanzar en el uso de estas herramientas debemos adquirir algunas nociones básicas, para lo cual ImageMagick dispone de una documentación profusa y de calidad aunque en inglés.

La especificación de geometry en ImageMagick

Una de estas nociones que es necesario manejar, ya sea para crear un lienzo en blanco, cambiar el tamaño de una imagen, añadir un borde, eliminar o extraer una porción de imagen, recortarla, entre otras operaciones en las que intervengan variables de tamaño o posición, es la de geometría (geometry). La geometría en ImageMagick es la especificación de dimensiones de un rectángulo, su desplazamiento o la ubicación de un punto dentro de una superficie.

Se recuerda que una imagen puede representarse sobre un plano cartesiano o una matriz de dos dimensiones (2D). Cada punto de color o pixel ocupa un lugar definido por un valor de X y uno de Y.

Formas que puede adoptar la especificación de geometry

El formato de geometry puede tomar cualquiera de las formas que anticipamos aquí a modo de referencia y que más abajo desarrollaremos con algunos ejemplos.

ESCALA%
Ancho y alto ambos escalados por el porcentaje ESCALA, por ejemplo 50%.
ESCALA-X%xESCALA-Y%
Ancho y alto escalados según el porcentaje indicado para cada una de las dimensiones, por ejemplo 30%60%.
ANCHO
Especificación del ancho. El alto será calculado automáticamente para conservar la relación de aspecto.
xALTO
Especificación del alto. El ancho será calculado automáticamente para conservar la relación de aspecto.
ANCHOxALTO
Valores máximos de ancho y alto. Se conserva la relación de aspecto.
ANCHOxALTO^
Valores mínimos de ancho y alto. Se conserva la relación de aspecto.
ANCHOxALTO!
Ancho y alto ajustados a las dimensiones indicadas. Se ignora la relación de aspecto.
ANCHOxALTO>
Ajusta la imagen a las dimensiones declaradas cuando estas son mayores que ANCHO y/o ALTO.
ANCHOxALTO<
Ajusta la imagen a las dimensiones declaradas cuando estas son menores que ANCHO y/o ALTO.
AREA@
Establece el tamaño de una imagen conservando su relación de aspecto para cubrir el área declarada en píxeles.
PROPORCIÓN_ANCHO:PROPORCIÓN_ALTO
Ajusta la relación de aspecto a PROPORCIÓN_ANCHO:PROPORCIÓN_ALTO.
{TAMAÑO}{DESPLAZAMIENTO}
Siendo {TAMAÑO} cualquiera de las formas anteriores para expresar un tamaño o ninguna, {DESPLAZAMIENTO}, por defecto +0+0, señalará el desplazamiento u offset.
{TAMAÑO}{+|-}X{+|-}Y
Desplazamiento u offset horizontal X y vertical Y en píxeles. Los signos + o - son requeridos. El desplazamiento será afectado por la opción -gravity.

Dimensionar y posicionar imágenes

Creación de imágenes de prueba

Para probar la especificación de geometry en la práctica, crearemos dos imágenes o lienzos impresos con dos de los patrones de relleno incorporados a ImageMagick. Podemos consultar la lista completa de diseños en https://legacy.imagemagick.org/script/formats.php#builtin-patterns

magick -size 200x120 pattern:crosshatch fondo.png

Con el comando magick (proporcionado por la instalación de ImageMagick 7) hemos creado una superficie de 200 píxeles de ancho x 120 píxeles de alto y rellenado la misma con el patrón crosshatch. El resultado ha sido volcado al fichero fondo.png en el directorio actual.

He aquí un primer uso de la especificación de geometry para la opción -size, la cual establece el tamaño requerido para la imagen de salida.

Creamos el segundo lienzo de la misma manera pero especificando las dimensiones 50x50 píxeles.

magick -size 50x50 pattern:horizontalsaw plano.png

Otros formatos de geometry para la opción -size

magick -size 50 pattern:horizontalsaw prueba.png
magick -size x50 pattern:horizontalsaw prueba.png

Ambos comandos crearán una imagen cuadrada de 50x50 píxeles.

magick -size 200x120+0+0 pattern:horizontalsaw prueba.png

Creará una imagen de 200x120 píxeles. La parte correspondiente al desplazamiento en -size (+0+0) es ociosa, ImageMagick la ignora y puede omitirse.

Las demás formas de geometry no tienen demasiado sentido para la opción -size. ImageMagick interpretará las especificaciones porcentuales como números enteros (número de píxeles); la relación de aspecto X:Y como XxY; e ignorará los modificadores '^', '!', '>' y '<'.

La especificación de área AREA@ producirá un error al usarla para crear lienzos con patrones de relleno, pero resultará en una imagen de AREAx1 píxeles al usarla con una superficie en blanco o de un color liso.

El comando identify es parte de la suite ImageMagick y proporciona información sobre un fichero de imagen. Añadiendo la opción -verbose antes del nombre de archivo, este comando desplegará una copiosa lista de propiedades de la imagen. Resulta muy útil para leer información de una imagen que pueda determinar el comportamiento ulterior de una edición, recomendamos, para esos casos, revisar la opción -format. https://imagemagick.org/script/identify.php

Posicionar una imagen dentro de otra

Ha llegado el momento de ocuparnos del comando que proporciona ImageMagick para combinar dos imágenes en una: composite. En su forma más simple recibe como argumentos el nombre de archivo de la imagen superior, el de la imagen inferior y el nombre del fichero de salida.

magick composite plano.png fondo.png resultado.png

Ahora podemos intentar otros valores de geometry.

Offset o desplazamiento

magick composite plano.png -geometry '+30+10' fondo.png resultado.png

Offset o desplazamiento y tamaños

magick composite plano.png -geometry '130x40!+30+10' fondo.png resultado.png

Offset o desplazamiento y proporción

composite plano.png -geometry '2:3+30+10' fondo.png resultado.png

La propiedad -gravity

Con la propiedad -gravity podemos posicionar una imagen dentro de otra haciendo coincidir sus vértices o centros. Esta propiedad es también conocida como anclaje.

composite plano.png -gravity Center fondo.png resultado.png

Para alinear las imágenes a partir de sus vértices los valores pueden ser: NorthWest (noroeste), que alinea las imágenes en torno a los vértices superiores del lado izquierdo; SouthWest (sudoeste), que lo hace en función de los vértices inferiores del mismo lado; NorthEast (noreste), para hacer coincidir las esquinas superiores del lado derecho; y SouthEast (sudeste), para las inferiores, también del lado derecho.

Para alinear las imágenes en relación a sus centros: West (oeste) y East (este) alinearán las imágenes sobre el eje horizontal y hará coincidir los bordes izquierdos o derechos; y North (norte) y South (sur), para hacer coincidir las imágenes en función de sus ejes verticales y bordes superiores o inferiores.

Gravity y Offset

Una última cuestión de la que quisiéramos ocuparnos y que quizá sea la que más dudas genere es la de la relación entre -gravity y un desplazamiento u offset positivo o negativo en -geometry ([+|-]X[+|-]Y). Un desplazamiento +50+0 sobre una capa anclada en East, por ejemplo, no tendrá igual comportamiento que el mismo desplazamiento para una capa con gravity en West o Center.

Podemos formularlo de este modo:

El desplazamiento positivo en X moverá la capa hacia la derecha, excepto que esta tenga anclaje sobre el borde derecho (East, NorthEast, SouthEast), en cuyo caso moverá la capa hacia la izquierda. A la inversa, un desplazamiento negativo en X moverá la capa hacia la izquierda excepto en los casos mencionados, que lo hará hacia la derecha.

De forma similar, el desplazamiento positivo en Y moverá la capa hacia abajo, excepto que el anclaje esté establecido sobre alguno de los valores que hacen coincidir los bordes inferiores, en cuyo caso lo hará hacia arriba y, a la inversa, un offset negativo en Y desplazará la capa hacia arriba, excepto que gravity esté establecido en North, NorthWest o NorthEast.

Gravity Center y Offset

Gravity NorthWest y Offset

Gravity North y Offset

Gravity NorthEast y Offset

Gravity East y Offset

Gravity SouthEast y Offset

Gravity South y Offset

Gravity SouthWest y Offset

Gravity West y Offset

Parece suficiente lo dicho hasta aquí para la especificación de dimensiones y ubicación de una imagen o superficie sobre otra en ImageMagick. Si ya realizaste pruebas por tu cuenta, es muy probable que se te haya presentado algún desafío cuya solución requieriese de conocimientos más avanzados acerca del funcionamiento de ImageMagick. Pero no te desanimes, como decíamos al principio, existe gran cantidad de información dando vueltas en la red. Puedes empezar consultando su documentación oficial y, en el caso de estar en la búsqueda de alguna solución en particular, revisar si alguno de los muchos scripts desarrollados por Fred Weinhaus se ajusta a tus requerimientos.

Te invitamos como siempre a compartir tus impresiones, opiniones o experiencias con ImageMagick en los comentarios y aportar valor a esta entrada. ¡Saludos internauta!