Anatomia de la línea de comandos en IM

Una línea de órdenes de IM puede ser tan simple como:

convert imagen.jpg imagen.png

o tan compleja como:

convert label.gif +matte \
		     \( +clone  -shade 110x90 -normalize -negate +clone  -compose Plus -composite \) \
		     \( -clone 0 -shade 110x50 -normalize -channel BG -fx 0 +channel -matte \) \
		     -delete 0 +swap  -compose Multiply -composite  button.gif

Vamos a intentar una disección de la línea de comandos de IM.

Una linea de comandos de IM consiste en:


La siguiente línea de órdenes es una de las mas simples: contiene la utilidad o comando (convert), un archivo input, (imagen.jpg) sobre la que actuará el comando y un archivo output (imagen.png), en el que encontraremos el resultado de la acción del comando sobre el archivo input:

convert imagen.jpg imagen.png

Veamos ahora con algo más de detenimiento cada uno de los elementos antes relacionados:


Archivos input

Los archivos input son aquellos sobre los se realizarán las operaciones descritas en la línea de órdenes.

IM maneja un concepto muy amplio de input, pudiendo ser:

Veamos más detenidamente cada uno de estos "tipos" de input.


Nombre de archivo conteniendo "comodines".

En entornos UNIX, ciertos caracteres como '*', '?',... etc, dan lugar a listas de archivos que son generados en base a un determinado patrón.

Así en la siguiente linea de órdenes:

convert *.jpg imagenes.gif

*.jpg seria un input válido.


Formato de imagen explícito

Las imágenes pueden guardarse un una gran variedad de formatos ( JPG, TIFF, PNG, GIFF ....). IM puede reconocer la mayoria de ellos y procesarlos. Para ello, IM recurrirá primero a identificar el metadato del archivo que lo asocia a un determinado formato. Si falla esto, IM recurrirá a la extensión del archivo. Si el archivo en cuestión careciera de los dos elementos anteriores, deberámos especificar explicitamente un determiado formato.

convert barco.tif barco_2.png

Imágenes y patrones propios de IM

La aplicación IM contiene un determinado número de imágenes y patrones "precargados" que pueden utilzarse como inputs en una ínea de órdenes.

La forma que tomarán estos inputs es:

Con la siguiente línea de órdenes se generará el output rose.png a partir de la imagen "precargada" rose (por razones de compatibilidad con anteriore versiones, las imágenes "pregargadas" pueden también invocarse por su nombre seguido de ':' ; así rose: seria lo mismo que magick:rose )

convert magick:rose rose.png

Standin

IM permite que el output de un comando sea tomado como input por otro, con '-' como nombre de archivo.

Con la siguiente orden convertimos la imagen imagen.gif al formato png y en lugar de escribir el resultado, lo redirigimos al comando [display] :

convert imagen.gif png:- | display png:-

En siguiente linea de órdenes se rota 30º imagen.gif y el resultado, representado por '-' se pasa como input de un nuevo comando [convert] para proceder al cambio de formato.

convert -rotate 30 imagen.gif - | convert - imagen.jpg

Fotogramas (frames) individuales pertenecientes a una serie.

Determinados formatos de imagen pueden contener mas de una imagen (frame). Son formatos de imágenes múltiples, como el formato GIF.

Como input puede especificarse una o varias de las imágenes que contine el archivo en cuestión. Supongamos que tenemos el archivo imagenes.gif compuesto de diez (10) "frames" : 0-9 . Con la orden:

convert 'imagenes.gif[3]' imagen.png

generaríamos el output imagen.png a partir de la "frame" 3 del archivo imagenes.gif ( El entrecomillado es para evitar que en entornos UNIX se confundan los '[]' con comandos de la shell)

Con la orden:

convert 'imagenes.gif[0-3]' secuencia.gif

generaríamos un archivo de imágenes multiples ( secuencia.gif), compuesto por las "frames" 0,1,2 y 3 del archivo imagenes.gif. El mismo esultado obendríamos escribiendo 'imagenes.gif[0,1,2,3]'

Podríamos condicionar el orden de las imágenes en el output, especificandolo en el input: 'imagenes.gif[1,2,0,3]' generaria un output con un orden de "frames" distinto al generado con la anterior sintaxis.


Regiones de una imagen.

Con imágenes RAW, debe especificarse el tamaño de la imagen output, pero también puede especificarse la región del input que debe ser leida para la generación de aquel.

Si tenemos una imagen raw de 3000x4000 px (imagen.dng) de 8-bit RGB, pero deseamos un output que se corresponda a una región determinada de la misma, p.e. de 300x400 px correspondiente correspondiente al extremo superior izquierdo, podriamos escribir cualquiera de las siguientes dos líneas de órdenes:

convert -size 3000x4000 -depth 8 'rgb:imagen.dng[300x400+0+0]' salida.png
convert -size 3000x4000 -depth 8 -extract 300x400+0+0 rgb:imagen.dng salida.png

Redimendionado in-line de imágenes.

En ocasiones puede ser conveniente redimensionar una imagen mientras se está leyendo:

convert '*.jpg' -resize 120x120 thumbnail%03d.png

Con la siguiente orden todas las imágenes serán leidas y seguidamente redimensionadas, algo mucho más facil y rápido que ir leyendo y redimensionandolas una a una, como ocurriría con la anterior línea de órdenes:

convert 'jpg.*[120x120]' thumbnail%03d.png

Recorte in-line de imágenes.

Aqui se nos presenta un caso semejante al de redimensión in-line:

convert '*.jpg' -crop 120x120+10+5 thumbnail%03d.png
convert '*.jpg[120x120+10+5]' thumbnail%03d.png

Referencias de nombres de archivos.

Existen dos métodos de usar un nombre de archivo para referenciar otros nombres de archivos.

El primero es mediante el uso del signo '@' para poder leer los nombres de imágenes contenidos en otro archivo. Por ejemplo, supongamos que el archivo imagenes.txt contine los siguientes lineas:

Si en la linea de órdenes escribimos como input '@imagenes.txt' IM leerá: imagen-1.png, imagen-2.png, imagen-3.png.

Otra forma de referenciar una secuencia de archivos es intercalando un caracter de formato en el nombre del archivo, junto con una referencia a una definición de rango.En el caso de las tres imágenes anteriores: 'imagen-%d.jpg[1-3]'


Ajustes de imagen (Opciones de ajuste)

Un ajuste de imagen actua desde el punto en que aparece en la linea de órdenes pudiendo afectar a los procesos posteriores, tales como lectura,acción de los operadores o escritura del resultado. El ajuste permanecerá activo hasta que sea reiniciado o finalice la linea de órdenes.

Las opciones de ajustes de imágenes de IM son:

-adjoin -alpha -antialias -authenticate -background -bias -black-point-compensation -blue-primary -blur -bordercolor -box -caption -channel -comment -compress -debug -define -delay -density -depth -display -dispose -dither -endian -encoding -extract -family -fill -filter -font -format -fuzz -geometry -gravity -interlace -intent -interpolate -label -limit -log -loop -mask -mattecolor -monitor -orient -origin -page -pointsize -preview -quality -quiet -red-primary -region -render -repage -sampling-factor -scene -seed -size -stroke -stretch -strokewidth -style -texture -tile -transparent-color -treedepth -type -undercolor -units -verbose -virtual-pixel -weight


Operadores (Opciones)

Un operador se diferencia de un ajuste en que afecta a la imagen que aparece inmediatamente después de el en la linea de órdenes, y aquí acaba. Se considerará operador a cualquier opción que aparezca en la línea de órdenes y que no sea un ajuste o un operador de secuencias de imágenes.

Podemos citar como operadores:

-affine -annotate -black-threshold -border -charcoal -chop -clip -clip-path -clip-mask -colors -colorize -colorspace -compose -contrast -convolve -crop -cycle -despeckle -draw -edge -emboss -enhance -equalize -evaluate -extent -flip -flop -floodfill -frame -gamma -gaussian -green-primary -implode -lat -level -linewidth -map -mask -median -modulate -monochrome -negate -noise -normalize -opaque -ordered-dither -paint -pen -posterize -raise -profile -quiet -radial-blur -raise -random-threshold -resample -resize -roll -rotate -sample -scale -sepia-tone -segment -shade -shadow -sharpen -shave -shear -sigmoidal-contrast -solarize -splice -spread -stretch -strip -swirl -threshold -transparent -thumbnail -tint -transform -trim -unsharp -version -wave -white-point -white-threshold


Operadores de secuencias de imágenes.

Este tipo de operadores se diferencian de los ajustes en que afectan solo a la secuencia de imágenes que aparece inmediatamente después de ellos en la línea de órdenes. Son operadores de secuencias de imágenes:

-append -average -clut -coalesce -combine -composite -crop -deconstruct -delete -flatten -fx -identify -insert -map -morph -mosaic -process -reverse -separate -swap -write


Pilas de imágenes.

El apilado de imágenes no son sino agrupamientos de inputs nos permite operar por separado sobre una o varias imagenes de una secuencia e introducir el resultado en la línea de órdenes. Las pilas se delimitarán mediante paréntesis y las opciones que incluyan afectarán solo a las imágenes de la pila.

En la siguiente linea de órdenes a opción [-rotate] se aplicará sólo a la imagen figura.png.:

convert imagen-1.gif \(figura.jpg -rotate 30 \) imagen-2.png +append tira.png

Obsérvese que los paréntesis deben escaparse para que no sean confundidos por comandos shell.

Debe tenerse en cuenta que los signos '(' y ')' se consideran operadores, por los que debe mediar un espacio entre ellos y otros operadores o argumentos vecinos.

Además de los operadores ya vistos, los siguientes operadosers son mas útiles cuando procesan imágenes en el interior de una pila:

-clone -delete -insert -swap

Los argumentos de estos operadores son índices de una secuencia de imágenes. Dichos índices asignan el número 0 a la primera imagen , 1 a la segunda y así sucesivamente. Sin embargo, al emplear índices negativos lo que hecemos es referenciar las imágenes desde el final de la secuencia: -1 se referirá a la útima, -2 a la penúltima y así sucesivamente..


Output

El output es el archivo que contendrá el resultado de las operaciones fijadas en la línea de órdenes.

IM también maneja un concepto muy amplio de output. Para Im un output puede ser:

Veamos cada uno de estos "tipos" de output


Formato de imagen explícito.

IM debe reconocer el formato de imágen deseado antes de escribirlo. Para ello consultará la extensión del nombre de archivo para determinar el formato. Por ejemplo, si el output es imagen.jpg, IM escribirá el archivo en formato JPG.

En algunos casos el nombre del archivo output puede no identificar ningun formato de imagen. En esto casos la imágen será escrita en el formato en que fué inicialmente leída.


Standout

Como en cualquier linea de comandos UNIX, IM permite redirigir la salida de un comando hacia otro comando, con '-' como nombre de archivo.

Con la siguiente orden convertimos la imagen imagen.gif al formato png y en lugar de escribir el resultado, lo redirigimos al comando [display] :

convert imagen.gif png:- | display png:-

En siguiente linea de órdenes se rota 30º imagen.gif y el resultado (output), representado por '-' se pasa como input de un nuevo comando [convert] para proceder al cambio de formato.

convert -rotate 30 imagen.gif - | convert - imagen.jpg

Referencias a archivos.

Incluir un caracter de formato en el nombre del output para escribir una lista de imágenes. Por ejemplo, si nuesto nombre de output fuera imagen-%d.jpg y nuestra lista de imágenes contuviera tres archivos, podriamos esperar que IM escribiera: imagen-0.jpg, imagen-1.jpg, imagen-2.jpg