⚠️ Este es un sitio de traducción no oficial, sin relación con ImageMagick Studio LLC. Para información autorizada, consulte la página original (https://imagemagick.org/script/command-line-processing.php).

La anatomía de la línea de comandos

La anatomía de la línea de comandos • Nombre de archivo de entrada • Opciones de la línea de comandos • Nombre de archivo de salida

Las herramientas de línea de comandos de ImageMagick pueden ser tan simples como esto:

magick image.jpg image.png

O pueden ser complejas, con multitud de opciones, como en lo siguiente:

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

Este comando de ejemplo es lo bastante largo como para tener que escribirse en varias líneas, así que lo hemos formateado para mayor claridad insertando barras invertidas (). La barra invertida es el carácter de continuación de línea de Linux. En el shell de Windows, use el carácter de acento circunflejo (^) para la continuación de línea. En estas páginas web usamos el estilo Linux, como arriba. Sin embargo, a veces las líneas las envuelve su navegador si la ventana del navegador es lo bastante pequeña, pero las líneas de comandos, mostradas en blanco, siguen siendo pensadas para escribirse como una sola línea. No es necesario introducir los caracteres de continuación de línea. Los paréntesis que arriba se escapan con la barra invertida no se escapan en Windows. Hay otras diferencias entre Windows y Linux (relativas a las comillas, por ejemplo), pero trataremos algunas de esas cuestiones más adelante, a medida que surjan.

En la mayoría de los ejemplos de línea de comandos de este sitio, si existe una traducción equivalente para ejecutar en Windows, habrá un desplegable en la esquina inferior derecha que le permitirá cambiar el sistema operativo para el que previsualiza el comando.

Sin saber mucho sobre la línea de comandos de ImageMagick, probablemente pueda deducir que el primer comando de arriba convierte una imagen en formato JPEG a una en formato PNG. Sin embargo, muy pocos repararán en que el segundo comando, más complejo, le da a una etiqueta plana bidimensional un aspecto tridimensional con texturas ricas y profundidad simulada:

label ==> button

Aquí mostramos el porcentaje de finalización de una tarea como un cilindro sombreado:

Shaded Cylinder

Dada la complejidad del renderizado, quizá le sorprenda que se logre con una sola línea de comandos:

magick -size 320x90 canvas:none -stroke snow4 -size 1x90 -tile gradient:white-snow4 \
  -draw 'roundrectangle 16, 5, 304, 85 20,40' +tile -fill snow \
  -draw 'roundrectangle 264, 5, 304, 85  20,40' -tile gradient:chartreuse-green \
  -draw 'roundrectangle 16,  5, 180, 85  20,40' -tile gradient:chartreuse1-chartreuse3 \
  -draw 'roundrectangle 140, 5, 180, 85  20,40' +tile -fill none \
  -draw 'roundrectangle 264, 5, 304, 85 20,40' -strokewidth 2 \
  -draw 'roundrectangle 16, 5, 304, 85 20,40' \( +clone -background snow4 \
  -shadow 80x3+3+3 \) +swap -background none -layers merge \( +size -pointsize 90 \
  -strokewidth 1 -fill red label:'50 %' -trim +repage \( +clone -background firebrick3 \
  -shadow 80x3+3+3 \) +swap -background none -layers merge \) -insert 0 -gravity center \
  -append -background white -gravity center -extent 320x200 cylinder_shaded.png

Ejecute este script aportado por Geemack. Vislumbrará la potencia y versatilidad de la línea de comandos de ImageMagick:

magick -background none -size 960x960 xc:black \( xc:darkred -duplicate 1 +append \) \
  xc:gold \( xc:teal -duplicate 2 +append \) -modulate 100,100,"%[fx:rand()*200]" \
  xc:white -scale x1 +append -write mpr:clut +delete radial-gradient: mpr:clut \
  -clut -scale 100x4% -wave "%[fx:rand()*24+24]"x"%[fx:w/ceil(rand()*4+1)]" -extent "%[w]x%[w]" \
  -roll +0+"%[fx:(rand()*w*0.05)+(w*0.51)]" \( +clone -blur 0x4 \) -insert 0 -composite \
  -duplicate "%[fx:floor(rand()*3+3)*2-1]" -set option:rot "%[fx:180/n]" -virtual-pixel tile \
  -virtual-pixel none -distort SRT "%[fx:t*360/n]" +repage -flatten -extent 100x50% \
  \( +clone -rotate 180 \) -append +channel -virtual-pixel none -distort SRT "0.96 %[fx:rand()*360]" \
  \( +clone -flop \) +repage -insert "%[fx:round(rand())]" -background black \
  -flatten -brightness-contrast 20,20 -normalize dragonFire.png

Para asegurarse de que el script pueda ejecutarse en Windows, cambie cualquier paréntesis con barra invertida (\() por simples paréntesis, la barra invertida (\) por ^, y duplique los signos de porcentaje (%).

En las siguientes secciones diseccionamos la anatomía de la línea de comandos de ImageMagick. Con suerte, tras leer atentamente y comprender mejor cómo funciona la línea de comandos, debería poder realizar tareas complejas de procesamiento de imágenes sin recurrir a las a veces intimidantes interfaces de programación.

Consulte Examples of ImageMagick Usage para obtener ayuda adicional al usar ImageMagick desde la línea de comandos.

La anatomía de la línea de comandos

La línea de comandos de ImageMagick consta de

  • uno o más nombres de archivo de entrada obligatorios.
  • cero, uno o más ajustes de imagen (image settings).
  • cero, uno o más operadores de imagen (image operators).
  • cero, uno o más operadores de secuencia de imágenes (image sequence operators).
  • cero, uno o más pilas de imágenes (image stacks).
  • cero o un nombre de archivo de imagen de salida (obligatorio para magick, convert, composite, montage, compare, import, conjure).

Encontrará una explicación detallada de cada una de las partes constituyentes de la línea de comandos en las secciones que siguen.

Nombre de archivo de entrada

ImageMagick amplía el concepto de nombre de archivo de entrada para incluir:

  • la expansión de nombres de archivo (globbing)
  • un formato de imagen explícito
  • el uso de imágenes y patrones integrados
  • STDIN, STDOUT y descriptores de archivo
  • la selección de ciertos fotogramas de una imagen
  • la selección de una región de una imagen
  • forzar un redimensionado de imagen en línea
  • forzar un recorte de imagen en línea
  • el uso de referencias de nombre de archivo

Estas extensiones se explican en los siguientes párrafos.

Tenga en cuenta que, de forma predeterminada, si una opción de la línea de comandos es también un nombre de archivo (p. ej., -quality), se interpreta como un nombre de archivo. Use -define registry:option:pedantic=true para interpretarla en cambio como una opción.

Expansión de nombres de archivo (Globbing)

En los shells de Linux, ciertos caracteres como el asterisco (*) y el signo de interrogación (?) generan automágicamente listas de nombres de archivo basadas en coincidencias de patrones. Esta función se conoce como globbing. ImageMagick admite la expansión de nombres de archivo en sistemas, como Windows, que no la admiten de forma nativa. Por ejemplo, suponga que quiere convertir 1.jpg, 2.jpg, 3.jpg, 4.jpg y 5.jpg de su directorio actual en una animación GIF. Puede referirse cómodamente a todos los archivos JPEG con este comando:

magick *.jpg images.gif

Formato de imagen explícito

Las imágenes se almacenan en una miríada de formatos de imagen, entre ellos los más conocidos JPEG, PNG, TIFF y otros. ImageMagick debe conocer el formato de la imagen antes de poder leerla y procesarla. La mayoría de los formatos tienen una firma dentro de la imagen que identifica de forma única el formato. A falta de ella, ImageMagick aprovecha la extensión del nombre de archivo para determinar el formato. Por ejemplo, image.jpg o image.JPG le indican a ImageMagick que está leyendo una imagen en formato JPEG.

En algunos casos la imagen puede no contener una firma o el nombre de archivo no identifica el formato de la imagen. En estos casos debe especificarse un formato de imagen explícito. Por ejemplo, suponga que nuestra imagen se llama image y contiene valores brutos de intensidad de rojo, verde y azul. ImageMagick no tiene forma de determinar automágicamente el formato de la imagen, así que lo establecemos explícitamente:

magick -size 640x480 -depth 8 rgb:image image.png

Imágenes y patrones integrados

ImageMagick tiene varias imágenes y patrones integrados. Para utilizar el patrón de tablero de ajedrez (checkerboard), por ejemplo, use:

magick -size 640x480 pattern:checkerboard checkerboard.png

STDIN, STDOUT y descriptores de archivo

Linux y Windows permiten canalizar (pipe) la salida de un comando a la entrada de otro. ImageMagick permite leer y escribir datos de imagen desde los flujos estándar STDIN (entrada estándar) y STDOUT (salida estándar), respectivamente, usando un seudonombre de archivo -. En este ejemplo canalizamos la salida de magick al programa display:

magick logo: gif:- | magick display gif:-

El segundo formato explícito "gif:" es opcional en el ejemplo anterior. El formato de imagen GIF tiene una firma única dentro de la imagen, por lo que el comando display de ImageMagick puede reconocer fácilmente el formato como GIF. El programa magick también acepta STDIN como entrada de esta manera:

magick rose: gif:- | magick - -resize "200%" bigrose.jpg'

Otras tuberías pueden ser accedidas mediante sus descriptores de archivo (a partir de la versión 6.4.9-3). Los descriptores de archivo 0, 1 y 2 están reservados para los flujos estándar STDIN, STDOUT y STDERR, respectivamente, pero una tubería asociada a un número de descriptor de archivo N>2 puede accederse usando el seudónimo fd:N. (Los seudónimos fd:0 y fd:1 pueden usarse para STDIN y STDOUT.) El siguiente ejemplo muestra cómo concatenar datos de imagen canalizados desde archivos con los descriptores 3 y 4 y dirigir el resultado al archivo con el descriptor número 5.

magick fd:3 fd:4 -append fd:5

Cuando sea necesario, pueden indicarse formatos de imagen explícitos como se mencionó antes, como en lo siguiente.

magick gif:fd:3 jpg:fd:4 -append tif:fd:5

Selección de fotogramas

Algunos formatos de imagen contienen más de un fotograma de imagen. Quizá solo quiera la primera imagen, o la última, o alguna cantidad de imágenes intermedias. Puede especificar qué fotogramas de imagen leer añadiendo al nombre de archivo de la imagen el rango de fotogramas encerrado entre corchetes. Aquí nuestra imagen (un GIF animado) contiene más de un fotograma, pero solo queremos el primero:

magick 'images.gif[0]' image.png

Los shells de Linux generalmente interpretan los corchetes, así que arriba encerramos el nombre de archivo entre comillas. En un shell de comandos de Windows los corchetes no se interpretan, pero usar comillas no hace daño. Sin embargo, en la mayoría de los casos los papeles de las comillas simples y dobles están invertidos respecto a Linux y Windows, por lo que los usuarios de Windows normalmente deberían probar comillas dobles donde nosotros mostramos comillas simples, y viceversa.

Puede leer más de una imagen de una secuencia con un rango de fotogramas. Por ejemplo, puede extraer los primeros cuatro fotogramas de una secuencia de imágenes:

magick 'images.gif[0-3]' images.mng

De forma predeterminada se avanza de un fotograma en uno, así que se devuelven los fotogramas 0, 1, 2 y 3. Establezca el paso en 2 con -define frames:step=2 y obtendremos en cambio los fotogramas 0 y 2.

Por último, puede leer más de una imagen de una secuencia, en orden no consecutivo. El siguiente comando obtiene la cuarta imagen de la secuencia, seguida de la tercera y luego la quinta:

magick 'images.gif[3,2,4]' images.mng

Observe que en los dos últimos comandos se escribe una sola imagen. La salida en este caso, donde el tipo de imagen es MNG, es un archivo multifotograma porque el formato MNG admite varios fotogramas. Si el formato de salida hubiera sido JPG, que solo admite fotogramas únicos, la salida habría consistido en fotogramas separados. Más sobre esto a continuación, en la sección sobre el nombre de archivo de salida.

Selección de una región de imagen

Las imágenes brutas (raw) son una secuencia de intensidades de color sin metainformación adicional como ancho, alto o firma de imagen. Con formatos de imagen brutos, debe especificar el ancho y el alto de la imagen, pero también puede especificar una región de la imagen a leer. En nuestro ejemplo, la imagen está en el formato RGB bruto de 8 bits y tiene 6000 píxeles de ancho y 4000 píxeles de alto. Sin embargo, solo queremos una región de 600 por 400 cerca del centro de la imagen:

magick -size 6000x4000 -depth 8 'rgb:image[600x400+1900+2900]' image.jpg

Puede obtener los mismos resultados con la opción -extract:

magick -size 6000x4000 -depth 8 -extract 600x400+1900+2900 rgb:image image.jpg

Redimensionado de imagen en línea

A veces es conveniente redimensionar una imagen a medida que se lee. Suponga que tiene cientos de imágenes JPEG grandes que quiere convertir en una secuencia de miniaturas PNG:

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

Aquí se leen todas las imágenes y posteriormente se redimensionan. Es más rápido y consume menos recursos redimensionar cada imagen a medida que se lee:

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

Recorte de imagen en línea

A veces es conveniente recortar una imagen a medida que se lee. Suponga que tiene cientos de imágenes JPEG grandes que quiere convertir en una secuencia de miniaturas PNG:

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

Aquí se leen todas las imágenes y posteriormente se recortan. Es más rápido y consume menos recursos recortar cada imagen a medida que se lee:

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

Referencias de nombre de archivo

Hay dos métodos para usar un nombre de archivo que referencie otros nombres de archivo de imagen. El primero es con '@', que lee nombres de archivo de imagen separados por espacios en blanco desde el archivo especificado. Suponga que el archivo myimages.txt consta de una lista de nombres de archivo, así:

frame001.jpg
frame002.jpg
frame003.jpg

Entonces esperamos que este comando:

magick @myimages.txt mymovie.gif

lea las imágenes frame001.jpg, frame002.jpg y frame003.jpg y las convierta en una secuencia de imágenes GIF.

Si la ruta de la imagen incluye uno o más espacios, encierre la ruta entre comillas:

'my title.jpg'

Algunas opciones de la línea de comandos de ImageMagick pueden superar las capacidades de su procesador de línea de comandos. Windows, por ejemplo, limita las líneas de comandos a 8192 caracteres. Si, por ejemplo, tiene una opción draw con puntos de polígono que superan el límite de longitud de la línea de comandos, ponga la opción draw en un archivo y referencie el archivo con la @ (p. ej., @mypoly.txt).

Otro método para referirse a otros archivos de imagen es incrustar un carácter de formato en el nombre de archivo con un rango de escenas. Considere el nombre de archivo image-%d.jpg[1-5]. El comando

magick image-%d.jpg[1-5]

hace que ImageMagick intente leer imágenes con estos nombres de archivo:

image-1.jpg
image-2.jpg
image-3.jpg
image-4.jpg
image-5.jpg

Almacenamiento en búfer de flujos

De forma predeterminada, el flujo de entrada se almacena en búfer. Para asegurarse de que la información del archivo de origen o el terminal se lea tan pronto como esté disponible, establezca el tamaño del búfer en 0:

magick logo: gif:- | magick display -define stream:buffer-size=0 gif:-

Opciones de la línea de comandos

Puede dirigir el comportamiento de las utilidades de ImageMagick con estas opciones de la línea de comandos. El comportamiento de una opción cae en una de estas categorías:

  • Ajuste de imagen (Image Setting)
  • Operador de imagen (Image Operator)
  • Operador de canal de imagen (Image Channel Operator)
  • Operador de secuencia de imágenes (Image Sequence Operator)
  • Geometría de imagen (Image Geometry)
  • Pila de imágenes (Image Stack)

Ajuste de imagen (Image Setting)

Un ajuste de imagen persiste tal como aparece en la línea de comandos y puede afectar al procesamiento posterior, como la lectura de una imagen, un operador de imagen o, cuando corresponda, la escritura de una imagen. Un ajuste de imagen permanece en vigor hasta que se restablece o termina la línea de comandos. Los ajustes de imagen incluyen:

En este ejemplo, -channel se aplica a cada una de las imágenes, ya que, como mencionamos, los ajustes persisten:

magick -channel RGB wand.png wizard.png images.png

Operador de imagen (Image Operator)

Un operador de imagen se diferencia de un ajuste en que afecta a la imagen de inmediato, tal como aparece en la línea de comandos. Un operador es cualquier opción de la línea de comandos que no figure como ajuste de imagen ni como operador de secuencia de imágenes. A diferencia de un ajuste de imagen, que persiste hasta que termina la línea de comandos, un operador se aplica al conjunto de imágenes actual y se olvida. Los operadores de imagen incluyen:

En este ejemplo, -negate invierte la imagen wand pero no la wizard:

magick wand.png -negate wizard.png images.png

Tenga en cuenta que un operador de imagen se aplicará a cada imagen de una secuencia de imágenes. Por ejemplo, si usa la opción -resize para redimensionar una imagen GIF, cada fotograma se redimensionará al tamaño dado. Sin embargo, algunos fotogramas pueden ser más pequeños que la imagen completa, y redimensionar todos los fotogramas al mismo tamaño puede dar como resultado una salida inesperada. En tal caso, debería usarse -coalesce para preparar esos fotogramas.

Operador de canal de imagen (Image Channel Operator)

Operan directamente sobre los canales de la imagen:

Operador de secuencia de imágenes (Image Sequence Operator)

Un operador de secuencia de imágenes se diferencia de un ajuste en que afecta a una secuencia de imágenes de inmediato, tal como aparece en la línea de comandos. Elija entre estos operadores de secuencia de imágenes:

En este ejemplo, -append concatena tres imágenes en una:

magick mikayla.png picnic.png beach.png -append vacation.png

Geometría de imagen (Image Geometry)

Muchas opciones de la línea de comandos toman un argumento de geometría para especificar cosas como el ancho y el alto deseados de una imagen y otras magnitudes dimensionales. Como los usuarios quieren tantas variaciones en las dimensiones, tamaños y posiciones resultantes de las imágenes (y porque ImageMagick quiere proporcionarlas), el argumento de geometría puede adoptar muchas formas. Describimos muchas de ellas en esta sección.

Las opciones y ajustes de imagen que toman alguna forma de argumento de geometría incluyen los siguientes. Tenga presente que algunos de ellos analizan sus argumentos de maneras ligeramente distintas. Consulte la documentación de cada opción o ajuste individual para más detalles.

El argumento de geometría puede adoptar cualquiera de las formas enumeradas en la tabla siguiente. Estas se describirán con más detalle en las subsecciones que siguen a la tabla. La forma habitual es size[offset], lo que significa que size es obligatorio y offset es opcional. En ocasiones es posible [size]offset. En ningún caso se permiten espacios dentro del argumento de geometría.

size Descripción general (el comportamiento real puede variar según las distintas opciones y ajustes)
scale% El alto y el ancho se escalan ambos por el porcentaje especificado.
scale-x%xscale-y% El alto y el ancho se escalan individualmente por los porcentajes especificados. (Solo se necesita un símbolo %.)
width Se da el ancho; el alto se selecciona automágicamente para conservar la relación de aspecto.
xheight Se da el alto; el ancho se selecciona automágicamente para conservar la relación de aspecto.
widthxheight Se dan los valores máximos de alto y ancho; se conserva la relación de aspecto.
widthxheight^ Se dan los valores mínimos de ancho y alto; se conserva la relación de aspecto.
widthxheight! Se dan el ancho y el alto de forma terminante, ignorando la relación de aspecto original.
widthxheight> Reduce una imagen cuya(s) dimensión(es) sean mayores que los argumentos de ancho o alto correspondientes.
widthxheight< Amplía una imagen cuya(s) dimensión(es) sean menores que los argumentos de ancho o alto correspondientes.
area@ Redimensiona la imagen para que tenga el área especificada en píxeles. Se conserva la relación de aspecto.
x:y^ quita filas o columnas para lograr la relación de aspecto dada.
x:y# añade filas o columnas para lograr la relación de aspecto dada.
{size}{offset} Especificación del desplazamiento (el valor predeterminado es +0+0). A continuación, {size} se refiere a cualquiera de las formas anteriores.
{size}{+-}x{+-}y Desplazamientos horizontal y vertical x e y, especificados en píxeles. Los signos son obligatorios para ambos. Los desplazamientos se ven afectados por el ajuste -gravity. Los desplazamientos no se ven afectados por % ni por otros operadores de size. Tenga en cuenta que los desplazamientos X e Y positivos van en dirección hacia adentro, hacia el centro de la imagen, para todas las opciones de -gravity, salvo 'center'. Para East, +X es hacia la izquierda. Para South, +Y es hacia arriba. Para SouthEast, +X es hacia la izquierda y +Y es hacia arriba. Para center, se usa la convención de dirección X e Y normal (+X es a la derecha y +Y es hacia abajo).

Ajustes básicos de ancho y alto; los operadores %, ^ y !

Aquí, justo debajo, hay unos pocos ejemplos sencillos de geometría, que muestran cómo podría usarse como argumento de la opción -resize. Usaremos la imagen interna logo: como imagen de entrada. Esta hermosa imagen tiene 640 píxeles de ancho y 480 píxeles de alto. Decimos que sus dimensiones son 640x480. Cuando damos las dimensiones de una imagen, el ancho (la dimensión horizontal) siempre precede al alto (la dimensión vertical). Esto será cierto cuando hablemos de coordenadas o desplazamientos dentro de una imagen, que siempre serán el valor x seguido del y. Piense en sus clases de álgebra del instituto y en el plano xy. (Bueno, casi: ¡nuestro eje y siempre irá hacia abajo!)

magick logo: -resize '200%' bigWiz.png
magick logo: -resize '200x50%' longShortWiz.png
magick logo: -resize '100x200' notThinWiz.png
magick logo: -resize '100x200^' biggerNotThinWiz.png
magick logo: -resize '100x200!' dochThinWiz.png

El primero de los cuatro comandos es simple: estira tanto el ancho como el alto de la imagen de entrada un 200% en cada dirección; amplía el conjunto por un factor de dos. El segundo comando especifica porcentajes distintos para cada dirección, estirando el ancho al 200% y aplastando el alto al 50%. La imagen resultante (en este ejemplo) tiene dimensiones 1280x240. Observe que no hace falta repetir el símbolo de porcentaje; los siguientes son equivalentes: 200x50%, 200%x50, 200%x50%.

De forma predeterminada, el ancho y el alto dados en un argumento de geometría son valores máximos, a menos que se especifique un porcentaje. Es decir, la imagen se expande o se contrae para ajustarse a los valores de ancho y alto especificados manteniendo la relación de aspecto (la razón entre su alto y su ancho) de la imagen. Por ejemplo, el tercer comando de arriba "intenta" fijar las dimensiones en 100x200. Imagine que reduce gradualmente la imagen original (que es 640x480), manteniendo constante su relación de aspecto, hasta que justo quepa en un rectángulo de 100x200. Como la imagen es más larga que alta, cabrá cuando su ancho se reduzca a 100 píxeles. Para conservar la relación de aspecto, el alto tendrá por tanto que ser (480/640)×100 píxeles = 75 píxeles, así que las dimensiones finales serán 100x75.

Observe que en el ejemplo anterior se alcanzará al menos una de las dimensiones especificadas (en este caso, el ancho, 100 píxeles). La imagen resultante encaja ceñidamente dentro de la original. Se puede hacer justo lo contrario invocando el operador ^, como en el cuarto ejemplo de arriba. En ese caso, cuando se da 100x200^ como argumento, de nuevo se alcanzará al menos una de las dimensiones, pero esta vez la imagen resultante puede contener ceñidamente a la original. Aquí el argumento de geometría da valores mínimos. En nuestro ejemplo, el alto pasará a ser 200 y el ancho se escalará para conservar la relación de aspecto, pasando a ser (640/480)×200 píxeles = 267 píxeles. Con el operador ^, una de esas dimensiones coincidirá con el tamaño solicitado, pero la imagen probablemente desbordará las dimensiones solicitadas para conservar su relación de aspecto. (La función ^ es nueva a partir de IM 6.3.8-2.)

Vemos que ImageMagick es muy bueno conservando las relaciones de aspecto de las imágenes, para evitar la distorsión de sus fotos e imágenes favoritas. Pero quizá realmente quiera que las dimensiones sean 100x200, estirando así la imagen. En ese caso, basta con decirle a ImageMagick que va en serio (!) añadiendo un operador de exclamación a la geometría. Esto forzará el tamaño de la imagen exactamente a lo que especifique. Así, por ejemplo, si especifica 100x200! las dimensiones pasarán a ser exactamente 100x200 (dando un wizard pequeño y verticalmente alargado).

Acotar el ancho, el alto y el área; los operadores >, < y @

Aquí hay algunos ejemplos más:

magick logo: -resize '100' wiz1.png
magick logo: -resize 'x200' wiz2.png
magick logo: -resize '100x200>' wiz3.png
magick logo: -resize '100x200<' wiz4.png

Si solo se da una dimensión, se toma como el ancho. Cuando solo se especifica el ancho, como en el primer ejemplo de arriba, el ancho se acepta tal cual y el alto se elige para mantener la relación de aspecto de la imagen de entrada. De forma similar, si solo se especifica el alto, como en el segundo ejemplo de arriba, el alto se acepta y el ancho se elige para mantener la relación de aspecto.

Use > para reducir una imagen solo si su(s) dimensión(es) son mayores que los argumentos de ancho o alto correspondientes. Use < para ampliar una imagen solo si su(s) dimensión(es) son menores que los argumentos de ancho o alto correspondientes. En cualquier caso, si se realiza un cambio, el resultado es como si el operador > o < no estuviera presente. Así, en el tercer ejemplo de arriba, especificamos 100x200> y el tamaño de la imagen original es 640x480, por lo que el tamaño de la imagen se reduce como si hubiéramos especificado 100x200. Sin embargo, en el cuarto ejemplo de arriba, no habrá cambio en su tamaño.

Por último, use @ para especificar el área máxima en píxeles de una imagen, de nuevo intentando conservar la relación de aspecto. (Los píxeles solo toman valores enteros, así que siempre hay algo de aproximación en juego.) En el siguiente ejemplo, se solicita un área de 10000 píxeles. El archivo resultante tiene dimensiones 115x86, que tiene 9890 píxeles.

magick logo: -resize '10000@' wiz10000.png

En todos los ejemplos de arriba y de abajo, hemos encerrado los argumentos de geometría entre comillas. Hacerlo es opcional en muchos casos, pero no siempre. Debemos encerrar las especificaciones de geometría entre comillas cuando usamos < o > para evitar que el shell interprete estos caracteres como redirección de archivos. En los sistemas Windows, el acento circunflejo ^ debe ir entre comillas; de lo contrario se ignora. Para ir sobre seguro, probablemente convenga mantener el hábito de encerrar todos los argumentos de geometría entre comillas, como hemos hecho aquí.

Desplazamientos en la geometría

Aquí hay algunos ejemplos para ilustrar el uso de desplazamientos en los argumentos de geometría. Un uso típico de los desplazamientos es junto con la opción -region. Esta opción permite que muchas otras opciones modifiquen los píxeles dentro de una subregión rectangular especificada de una imagen. Como tal, hay que darle el ancho y el alto de esa región, y también un desplazamiento dentro de la imagen, que es un par de coordenadas que indican la ubicación de la región dentro de la imagen mayor. A continuación, en el primer ejemplo, especificamos una región de tamaño 100x200 que se ubicará en las coordenadas xy x=10, y=20. Usemos la notación algebraica habitual (x,y)=(10,20), por comodidad.

magick logo: -region '100x200+10+20' -negate wizNeg1.png
magick logo: -region '100x200-10+20' -negate wizNeg2.png
magick logo: -gravity center -region '100x200-10+20' -negate wizNeg3.png

Tenga en cuenta que los desplazamientos siempre requieren signos +/−. El desplazamiento no es en realidad una ubicación verdadera dentro de la imagen; sus coordenadas deben sumarse a alguna otra ubicación. Llamémosla la ubicación actual. En los dos primeros ejemplos de arriba, sin embargo, esa ubicación es la esquina superior izquierda de la imagen, que tiene coordenadas (0,0). (Esa es la situación predeterminada cuando no se dan otras directivas para cambiarla.) El primer ejemplo de arriba coloca la esquina superior izquierda del propio rectángulo de 100x200 en (10,20).

Un desplazamiento negativo puede tener sentido en muchos casos. En el segundo ejemplo de arriba, el desplazamiento es (-10,20), especificado por -10+20. En ese caso, solo se puede invertir la porción del rectángulo (virtual) obtenido que queda dentro de la imagen; aquí es equivalente a especificar la geometría como 90x200+0+20.

En el tercer ejemplo de arriba, el ajuste -gravity precede a los demás y fija la ubicación actual dentro de la imagen en el centro mismo de la imagen. En este caso eso es el píxel (320,240), ya que el tamaño de la imagen es 640x480. Esto significa que los desplazamientos se aplican a esa ubicación, que por tanto se mueve, en este caso, a (320-10,240+20)=(310,260). Pero la propia región de 100x200 también se ve afectada por el ajuste -gravity, así que en lugar de afectar a su esquina superior izquierda, se determina el propio centro de la región (en (+50,+100) dentro de ella). Por tanto, el centro del rectángulo de 100x200 se mueve a (310,260). La esquina superior izquierda del rectángulo invertido está ahora en (310-50,260-100)=(260,160).

Pila de imágenes (Image Stack)

En la escuela, su profesor probablemente le permitía resolver problemas en una hoja de borrador y luego copiar los resultados en su hoja de examen. Una pila de imágenes es similar. Le permite trabajar sobre una imagen o secuencia de imágenes de forma aislada e introducir posteriormente los resultados de vuelta en la línea de comandos. La pila de imágenes se delimita con paréntesis. Los operadores de imagen solo afectan a las imágenes de la pila actual. Por ejemplo, podemos limitar la rotación de la imagen solo a la imagen wizard de este modo:

magick wand.gif \( wizard.gif -rotate 30 \) +append images.gif

Observe de nuevo que los paréntesis se escapan precediéndolos con barras invertidas. Esto es necesario en Linux, donde los paréntesis son caracteres especiales del shell. La barra invertida le indica al shell que no interprete estos caracteres, sino que los pase directamente al comando que se ejecuta. No escape los paréntesis en Windows. Cada paréntesis (o paréntesis escapado) debe tener espacios a ambos lados, como en el ejemplo mostrado arriba.

Además de los operadores de imagen ya tratados, los siguientes operadores de imagen son especialmente útiles al procesar imágenes en una pila de imágenes:

Los argumentos de estos operadores son índices en la secuencia de imágenes por número, comenzando por cero para la primera imagen, y así sucesivamente. Sin embargo, si da un índice negativo, las imágenes se indexan desde el final (la última imagen añadida). Es decir, un índice de -1 es la última imagen de la secuencia de imágenes actual, -2 da la penúltima, y así sucesivamente.

Nombre de archivo de salida

ImageMagick amplía el concepto de nombre de archivo de salida para incluir:

  1. un formato de imagen explícito
  2. escritura a la salida estándar
  3. referencias de nombre de archivo

Cada una de estas extensiones se explica en los siguientes párrafos.

En lugar de un nombre de archivo de salida, use -exit para impedir por completo cualquier escritura de imagen.

Formato de imagen explícito

Las imágenes pueden almacenarse en una miríada de formatos de imagen, entre ellos los más conocidos JPEG, PNG, TIFF y otros. ImageMagick debe conocer el formato deseado de la imagen antes de escribirla. ImageMagick aprovecha la extensión del nombre de archivo para determinar el formato. Por ejemplo, image.jpg le indica a ImageMagick que escriba la imagen en formato JPEG. En algunos casos el nombre de archivo no identifica el formato de la imagen. En estos casos, la imagen se escribe en el formato en que se leyó originalmente, a menos que se especifique un formato de imagen explícito. Por ejemplo, suponga que queremos escribir nuestra imagen en un nombre de archivo image en el formato bruto de intensidad de rojo, verde y azul:

magick image.jpg rgb:image

Salida estándar

Linux permite canalizar la salida de un comando a otro. ImageMagick permite canalizar un comando a otro con un nombre de archivo -. En este ejemplo canalizamos la salida de magick al programa display:

magick logo: gif:- | magick display gif:-

Aquí el formato explícito es opcional. El formato de imagen GIF tiene una firma que lo identifica de forma única, por lo que ImageMagick puede reconocer fácilmente el formato como GIF.

Referencias de nombre de archivo

Opcionalmente, use un carácter de formato incrustado para escribir una lista secuencial de imágenes. Suponga que nuestro nombre de archivo de salida es image-%d.jpg y nuestra lista de imágenes incluye 3 imágenes. Puede esperar que se escriban estos archivos de imagen:

image-0.jpg
image-1.jpg
image-2.jpg

O bien, recupere propiedades de la imagen para modificar el nombre de archivo de la imagen. Por ejemplo, el comando

magick rose: -set filename:area '%wx%h' 'rose-%[filename:area].png'

escribe una imagen con este nombre de archivo:

rose-70x46.png

Por último, para convertir varias imágenes JPEG en páginas PDF individuales, use:

magick *.jpg +adjoin page-%d.pdf

Use -define filename:literal=true para omitir la interpretación de los caracteres de formato incrustados y usar en cambio el nombre de archivo literalmente.

Almacenamiento en búfer de flujos

De forma predeterminada, el flujo de salida se almacena en búfer. Para asegurarse de que la información aparezca en el archivo o terminal de destino tan pronto como se escriba, establezca el tamaño del búfer en 0:

magick -define stream:buffer-size=0 logo: gif:- | magick display gif:-