Ejemplos de ImageMagick -- Uso básico
Aquí explicamos en detalle el procesamiento de la línea de comandos que sigue IM, algunas de las nuevas capacidades de procesamiento de imágenes, las ideas, la filosofía y la metodología, y lo que realmente ocurre internamente. Con este conocimiento de fondo, el resto de las páginas de ejemplos resulta mucho más claro. Incluso si solo usas la Interfaz de Programación de Aplicaciones (API), esta sección bien vale la pena conocerla y comprenderla.
Procesamiento de la línea de comandos de ImageMagick
¡Por qué cambió el estilo de la línea de comandos! o...
El problema con las versiones anteriores de IM
En la versión principal anterior de ImageMagick (versión 5.5.7 y anteriores) la interfaz de línea de comandos hacia la biblioteca IM ha sido propensa a problemas relacionados con el orden en que se realizaban las operaciones. Era bastante caótica y confusa para cualquiera que intentara entender lo que realmente estaba sucediendo. Además, lo que funcionaba una vez podía no funcionar en el mismo orden otra vez, ya que el autor de IM batallaba constantemente con la interfaz para que funcionara como la gente esperaba. La causa del problema era que ImageMagick seguía un estilo de línea de comandos UNIX bastante estándar...
**command [options] input_image output_image**
Con el tiempo, esto empezó a producir problemas, ya que las imágenes son objetos complejos con una enorme cantidad de operaciones que se pueden realizar sobre ellas, a menudo involucrando otras imágenes. Como consecuencia de esto, lo anterior se fue expandiendo lentamente hasta convertirse en...
**command [options] image1 [options] image2 [options] output_image**
Esto funcionaba, y es el estilo básico que se usaba en la versión 5.5.7. Las distintas operaciones de imagen tales como "[-negate](https://imagemagick.org/command-line-options/#negate)", "[-resize](https://imagemagick.org/command-line-options/#resize)" y "[-crop](https://imagemagick.org/command-line-options/#crop)", etc., podían aparecer ya fuera antes o después de la imagen a la que estaban destinadas a aplicarse. Por ejemplo, bajo la versión 5.5.7 los dos comandos siguientes eran igualmente válidos y hacían lo mismo.
magick -negate image.gif output.gif
magick image.gif -negate output.gif
El problema era... ¡qué pasaba si estabas tratando con dos operaciones de procesamiento de imágenes! Por ejemplo...
magick -size 40x20 xc:red xc:blue \
-append -rotate 90 append_rotate.gif
El resultado (en IM v5.5.7) era que las dos imágenes de entrada se rotaban primero y luego se unían (append), produciendo una imagen como... Es decir, el operador "[-rotate](https://imagemagick.org/command-line-options/#rotate)" se aplicaba ANTES que "[-append](https://imagemagick.org/command-line-options/#append)", lo cual probablemente no era lo que el usuario pretendía.
Con ImageMagick versión 6, los operadores siempre se aplicarán en el orden de la línea de comandos dado por el usuario.
Así, el ejemplo anterior en IMv7 dará como resultado: las dos imágenes se unen primero y luego ese resultado se rota; produciendo esto...
Si el usuario realmente pretendía hacer las rotaciones antes del append, puede pedirle explícitamente a IM v6 que lo haga en ese orden.
magick -size 40x20 xc:red xc:blue \
-rotate 90 -append append_rotate_bad.gif
Este tipo de control fino quedaba simplemente fuera del alcance de las versiones anteriores de IM, y probablemente habría requerido una tubería (pipeline), o guardar imágenes intermedias para lograrlo. La solución al problema, lamentablemente, requirió una medida drástica y cierta incompatibilidad. Por otro lado, casi todos los comandos 'simples' que funcionaban en IM versión 5 funcionan como esperarías en IM versión 6. En esencia, el uso de la línea de comandos en las versiones anteriores a la versión 6 estaba mal definido y, en mi opinión, roto, produciendo numerosos resultados extraños e inesperados.
Sintaxis de comandos de IMv7
Ten en cuenta que no se debe dar ninguna 'operación' antes de que al menos una imagen sea leída o creada. De hecho, podrías considerar una 'lectura/creación de imagen' también como una operación. Después de todo, realmente es una operación de procesamiento de imágenes, la de traducir una imagen en un archivo a una imagen en memoria. Así que la forma correcta de hacer esto en IMv7 es leer la imagen, procesarla y luego usar el argumento final de 'escritura implícita' para escribir el resultado. Es decir...
**command "image" { -operation }... "output_image"**
Por supuesto, hay algunos ajustes que pueden ser necesarios para controlar la lectura de la imagen y que deben darse antes de leer realmente la imagen (más abajo se explica el significado de un ajuste). Por ello, la sintaxis de IMv7 básicamente sigue lo siguiente...
**command { [settings] [operation] }... "implict_write"**
Con la parte entre '{...}' repitiéndose con tantas 'lecturas' u 'operaciones' como quieras o necesites. Y '[operation]' siendo ya sea una lectura o creación de imagen, o una operación de procesamiento de imágenes que realmente 'hace algo'. Y las harías en el orden exacto en que quieres procesar las imágenes.
Tipos de opciones: operadores y ajustes...
Un resumen de lo siguiente también está disponible ahora en el sitio web de ImageMagick en La anatomía de la línea de comandos. Todas las opciones de la línea de comandos caerán ahora en dos grupos básicos: 'ajustes' (settings) y 'operadores de imagen' (image operators). Los ajustes establecen valores; los operadores realmente ejecutan alguna acción. Opciones de ajuste
| son opciones de la línea de comandos que solo guardan información que será usada más tarde por otros 'operadores de imagen'. Es decir, no hacen nada, excepto establecer algún valor que se usará después. Muchas de las opciones tienen un estilo con '-' y otro con '+'. Este último generalmente se usa para desactivar el ajuste, o restablecerlo a su estado normal por defecto. Esto te permite eliminar el efecto de un ajuste rápida y sencillamente. Por ejemplo, "[+gravity](https://imagemagick.org/command-line-options/#gravity)" devolverá el ajuste de gravedad a su estado inicial 'gravity none'. Los ajustes pueden subdividirse además en varias subcategorías... Ajustes de operador que controlan cómo funcionan los operadores posteriores. Establecen los colores y las fuentes que pueden usar un operador, controlan la colocación de imágenes y texto, la búsqueda de color en las imágenes de origen, controlan el método de procesamiento de algunos de los operadores más complejos, etc., etc., etc..
-dither -gravity -fill -background -bordercolor -stroke -font -pointsize -strokewidth -box -virtual-pixel -interpolate
La mayoría de las opciones de ajuste pertenecen a esta categoría. Ajustes de entrada que están específicamente restringidos a controlar la creación de imágenes que se crean o se leen. Normalmente se usan para asignar o sobrescribir metadatos específicos que se asociarán con la(s) imagen(es) creada(s) después de que ese ajuste fuera definido, cuando son creadas o leídas desde un archivo externo.
-label -delay -dispose -page -comment -size
Recuerda, SOLO se aplican cuando una imagen es creada o leída y, por lo demás, se ignoran por completo. El operador especial "[-set](https://imagemagick.org/command-line-options/#set)" se ha proporcionado para cambiar los metadatos de las imágenes después de que han sido leídas en memoria, o procesadas de alguna manera. Consulta Metadatos más abajo para más detalles. Ajustes de salida que solo se usan durante la escritura o el guardado de imágenes de vuelta al disco. Aunque pueden darse en cualquier parte de la línea de comandos, solo se aplican cuando la imagen se escribe, ya sea como la operación por defecto del último argumento de nombre de archivo, o mediante una operación "[-write](https://imagemagick.org/command-line-options/#write)" o "[-identify](https://imagemagick.org/command-line-options/#identify)".
-quality -loop -compression -format -path -transparent-color
Si no se establece, o se desactiva (usando su forma con '+'), se usará un valor por defecto apropiado. Generalmente este valor por defecto es un valor guardado de la última imagen leída. Algunos 'ajustes de operación', como el color "[-background](https://imagemagick.org/command-line-options/#background)" actual, también se asignan a la imagen si el formato de archivo lo requiere. Ajustes de control y depuración que controlan cómo IM, en general, realiza sus tareas. Estos incluyen...
-verbose -debug -warnings -quiet -monitor -regard-warnings
Consulta Controles de operación de IM más abajo para más información sobre estos ajustes especiales.
Operadores de imagen
| Son argumentos de la línea de comandos que modificarán la(s) imagen(es) de alguna manera. Se ejecutan inmediatamente cuando se ven, y pueden usar otras 'opciones de ajuste' que se hayan dado previamente en la línea de comandos. Estos operadores pueden agruparse en unas pocas subcategorías... Operadores de creación de imagen que leerán imágenes desde un archivo o tubería, o generarán nuevas imágenes. Estos incluyen...
image.png xc: canvas: logo: rose: gradient: radial-gradient: plasma: tile: pattern: label: caption: text:
Como 'operadores', también se ejecutan inmediatamente cuando se ven en la línea de comandos. Solo añaden nuevas imágenes a las que ya están en memoria, pero no tocan las leídas previamente. Por supuesto, siendo operadores, cualquier 'ajuste' definido previamente se les aplicará. Especialmente los Ajustes de entrada, usados para controlar la entrada desde el archivo o flujo de archivos. Por ejemplo "[-size](https://imagemagick.org/command-line-options/#size)", que sugiere el tamaño de la imagen que quieres crear, o ajustes que definen o sobrescriben metadatos de imagen como "[-delay](https://imagemagick.org/command-line-options/#delay)" y "[-page](https://imagemagick.org/command-line-options/#page)". Operadores simples de procesamiento de imágenes modificarán todas las imágenes que ya han sido leídas en memoria. Cada imagen se modifica por separado de todas las demás. Incluyen operaciones tales como...
`-crop -repage -border -frame -trim -chop -draw -annotate -resize -scale -sample -thumbnail -magnify -adaptive-resize -liquid-resize -distort -morpohology -sparse-color -rotate -swirl -implode -wave -flip -flop -transpose -transverse -blur -gaussian-blur -convolve -shadow --radial-blur -motion-blur -sharpen -unsharp -adaptive-sharpen -adaptive-blur -noise -despeckle -median -negate -level -level-color -gamma -auto-level -auto-gamma -sigmoidial-contrast -normalize -linear-stretch -contrast-stretch -colorize -tint -modulate -contrast -equalize -sepia-tone -solarize -recolor -opaque -transparent -colors -map -ordered-dither -random-dither -raise -paint -sketch -charcoal -edge -vignette -emboss -shade -poloroid -encipher -decipher -stegano -evaluate -function -alpha -colorspace -separate
¡Y probablemente muchos otros operadores que olvidé! (o que se han añadido)`
Como todos los operadores de imagen se ejecutan inmediatamente cuando se ven en la línea de comandos, deben darse después de las imágenes sobre las que han de operar, una vez que estas han sido leídas en memoria. Si hay más de una imagen presente, todas las imágenes se procesan, una a la vez en secuencia. Por ello, tendrás que tener cuidado con qué imagen(es) tienes en la lista de imágenes actual. Ten en cuenta que es posible que algunos de estos operadores generen múltiples imágenes. Por ejemplo "[-crop](https://imagemagick.org/command-line-options/#crop)" podría generar múltiples 'baldosas' (tiles) de imagen, o "[-separate](https://imagemagick.org/command-line-options/#separate)" que divide las imágenes en imágenes de canal separadas. Por ello, puedes acabar con más imágenes en memoria. Pero todos ellos solo toman una imagen a la vez como entrada. Ten en cuenta que muchas API solo aplican la operación equivalente a la primera imagen de la lista de imágenes dada. Es decir, puede que no recorran cada imagen. Los comandos "magick" y otros comandos CLI (interfaz de línea de comandos), sin embargo, aplican el operador a cada imagen de la lista de imágenes actual por turno. Operadores de lista multi-imagen son especiales en que modifican toda la lista actual de imágenes como una sola entidad. Podrían reemplazar toda la lista con una única imagen combinada, o modificar cada imagen dependiendo de las otras imágenes encontradas antes o después de ella. Se usan para composición alfa, manejo de animaciones, manejo de canales de color, etc...
-append -flatten -mosaic -layers -composite -combine -fx -coalesce -clut -evaluate-sequence mean -evaluate-sequence
Recuerda que toda la lista se trata como una sola entidad, y algunas imágenes pueden ser eliminadas o reemplazadas. La mayoría de los operadores anteriores fusionan todas las imágenes múltiples dadas en una única imagen final. El método Layers Composite es actualmente el único operador que dividirá la lista de imágenes actual en dos listas de imágenes completamente separadas, antes de fusionarlas para formar una lista de imágenes completamente nueva. Hace la división buscando la imagen especial 'null:' en algún lugar de la lista de imágenes actual. Ninguno de estos operadores puede usarse en un comando "[mogrify](#mogrify)", ya que ese comando procesa una lista de imágenes de entrada (dadas al final) como imágenes individuales. Operadores de pila de imágenes afectan al orden de la lista de imágenes actualmente en memoria. Específicamente, proporcionan un procesamiento especial 'al margen' de las imágenes. Son en muchos sentidos similares al anterior Operador de lista de imágenes, pero no modifican realmente las imágenes en sí, solo cómo están organizadas en memoria.
( ) -delete -insert -swap -reverse -duplicate -clone
Ten en cuenta que los paréntesis '(' y ')' pueden requerir escapado con barra invertida o comillas, para evitar cualquier significado especial que les dé la interfaz de línea de comandos (CLI) del shell. Ninguno de estos operadores puede usarse en un comando "[mogrify](#mogrify)", ya que ese comando procesa una lista de imágenes de entrada (dadas al final) como imágenes individuales. Operadores especiales misceláneos son operadores que hacen cosas de maneras inusuales o no estándar (en comparación con lo anterior).
-geometry -version -list -bench -concurrent -preview
El operador "[-geometry](https://imagemagick.org/command-line-options/#geometry)" es especial, ya que es el único operador que solo afecta a una imagen (la última) de la lista de imágenes, en lugar de afectar a todas las imágenes de alguna manera. Solo se proporciona por compatibilidad hacia atrás y para requisitos especiales de composición alfa. Consulta Geometry, redimensionar solo la última imagen para más detalles. Los otros dos, "[-version](https://imagemagick.org/command-line-options/#version)" y "[-list](https://imagemagick.org/command-line-options/#list)", son operadores generadores de información, y hacen que IM salga explícitamente después de devolver la información solicitada. Consulta Controles especiales de IM más abajo para más información sobre estas opciones. Algunas opciones podrían incluso hacer que el comando completo se ejecute varias veces. Básicamente, se manejan de forma especial de algún modo extraño e inusual. Generalmente, estas no se usan excepto en situaciones especiales o para recuperar información global específica.
Espero que la separación de las opciones en ajustes y operadores quede clara, ya que es vital para la forma en que IM funciona ahora. Recuerda que bajo la versión 6 de ImageMagick...
Los ajustes se guardan de alguna manera para usarse después,
mientras que los operadores se aplican inmediatamente a las imágenes.
Esto es lo que hace que la versión 6 sea diferente de cualquier versión anterior de IM. Todas las opciones se definen como un 'ajuste' o un 'operador', y el orden determinará exactamente cuándo, y a qué imágenes, se aplicará la opción. La Referencia de opciones de los ejemplos de IM puede usarse para identificar qué es un 'ajuste' y qué es un 'operador'.
Ejemplo práctico de un comando de IM
Veamos un ejemplo y cómo será procesado por IM versión 6. |
magick eye.gif news.gif -append storm.gif tree.gif \
-background skyblue +append result.gif
![[Salida de IM]](../static/img/basics/result.gif)
Desglosemos esto y veamos lo que hace IM v6... Argumento | | Acción realizada | Imágenes
---|---|---|---
magick | Inicializar y crear una 'lista de imágenes' vacía | secuencia vacía
eye.gif | Leer la imagen y añadirla al final de la lista de imágenes actual | 1 imagen
news.gif | Añadir una segunda imagen a la lista (ahora con dos imágenes) | 2 imágenes
-append | Tomar todas las imágenes de la lista actual y unirlas verticalmente.
Todas las imágenes se reemplazan por una sola imagen. | 1 (fusionada)
storm.gif | Añadir otra imagen a la lista de imágenes | 2
tree.gif | Y otra | 3
-background skyblue | Establecer un 'color de fondo' para usar más tarde.
No se realizan cambios en ninguna imagen. | 3
+append | Unir las 3 imágenes de la lista horizontalmente
El color de fondo actual se usa para rellenar el espacio vacío | 1 (fusionada)
result.gif | Como este es el último argumento, se realiza una operación implícita -write con este argumento. La única imagen de la lista actual se escribe usando el nombre de archivo dado, que también establece el formato de archivo de imagen a usar. | escrita
Como puedes ver, el procesamiento de la línea de comandos en ImageMagick versión 6 es muy directo y lógico, lo que hace que el resultado sea predecible. Y de eso se trata...
Estilo heredado de la línea de comandos
Debido a que muchos scripts de IM muy antiguos usan un comando con un único operador de imagen de la forma...
**command -operator input_image output_image**
Es decir, especificabas un operador de imagen antes de leer realmente la imagen a la que se aplicará el operador. Para manejar esta situación heredada, IM guardará todos los operadores de imagen que vea y los aplicará a la primera imagen cuando esta sea finalmente vista en la línea de comandos. Es decir, lo anterior funcionará como si hubieras escrito la operación al estilo de IMv7...
**command input_image -operator output_image**
Por ejemplo, este comando heredado de IMv5 (manejo de opciones al estilo UNIX).... |
magick -flip storm.gif cmd_flip_legacy.gif
![[Salida de IM]](../static/img/basics/cmd_flip_legacy.gif)
Producirá el mismo resultado que este comando de IM versión 6... |
magick storm.gif -flip cmd_flip_postfix.gif
![[Salida de IM]](../static/img/basics/cmd_flip_postfix.gif)
El estilo heredado de la línea de comandos funciona, pero tiene los mismos problemas que aquejaban a IM versión 5 (consulta Por qué cambió el estilo de la línea de comandos más arriba). Todos los ajustes se aplican antes de la primera lectura, y todos los operadores simplemente se guardan para ejecutarse cuando se lee la primera imagen (y solo sobre la primera imagen). Tampoco hay garantía de que el orden de múltiples operadores sea el mismo que el orden que das, aunque es probable que se apliquen en ese orden. Además, como los operadores se van guardando hasta que la primera imagen es realmente leída, puede que descubras que repetir un comando varias veces antes de leer la imagen resulte en que algunos de los comandos anteriores 'desaparezcan'. Esto no es un error, sino un mal uso de las capacidades heredadas de IM. Este estilo de línea de comandos es solo para soporte heredado y, como tal, está obsoleto, así que debe evitarse siempre que sea posible. Cualquier script que contenga este estilo antiguo también debería actualizarse para hacer las lecturas de imagen antes de los operadores que quieres aplicarles. | El soporte heredado continuará en IM versión 7, que incluye un comando que permite el procesamiento en una sola pasada de las líneas de comandos. Esto le permite leer realmente opciones de procesamiento de imágenes desde archivos de script e incluso desde una tubería. Sin embargo, una técnica de procesamiento en una sola pasada no permitirá guardar operadores ANTES de leer la imagen a la que aplicarlos. De hecho, el comando "magick" producirá errores del tipo 'no image' si intentas usar un operador sin una imagen en memoria.
---|---
Línea de comandos frente a la API
Hay un par de diferencias importantes entre IM en línea de comandos y el uso de las API de Magick, tales como PerlMagick, RMagick, PHP IMagick y MagickWand.
- Solo una lista de imágenes activa
- La línea de comandos solo tiene una lista de imágenes con la que se puede trabajar en cualquier momento. Puedes 'empujar' (push) o guardar temporalmente una lista de imágenes (consulta Paréntesis y MPR: Registros de memoria con nombre). Incluso puedes 'clonar' (hacer una copia eficiente) imágenes de la última lista 'empujada'. Pero realmente no puedes trabajar en dos listas de ese tipo al mismo tiempo. Otras API de lenguajes, por otro lado, te permiten tener tantas listas de imágenes o 'wands' separadas como quieras. De hecho, normalmente guardas cada imagen como un wand separado (lista de imágenes y ajustes) para un mejor procesamiento, y solo fusionas la imagen en una lista cuando es necesario o como parte del paso final. También puedes trabajar con ellas en cualquier orden, y almacenarlas en bases de datos u otras estructuras de datos, para ordenarlas o compararlas más tarde. En la línea de comandos, sin embargo, una única lista de imágenes significa que no puedes hacer operaciones en cualquier orden, sino que generalmente intentas hacer las cosas en una secuencia más lógica, terminando completamente cada paso de procesamiento de imágenes a medida que avanzas. Básicamente, significa que es mucho más difícil 'volver atrás' o cambiar algo más tarde, usando los resultados de un conjunto de operaciones para seleccionar o modificar qué conjunto de operaciones de procesamiento debe realizarse a continuación. Es especialmente más difícil fusionar o intercalar (mezclar) dos listas de imágenes completamente separadas en un todo lógico. Sin embargo, se han ideado algunas técnicas que te permiten hacer esto desde la línea de comandos. Por ejemplo, consulta Composición alfa multicapa de listas de imágenes.
- Acceso directo a los datos de píxeles
- De nuevo, puedes hacer algo de procesamiento matemático y fusión de datos de píxeles desde la línea de comandos, pero no puedes consultar fácilmente atributos, ni leer o modificar un píxel o área específica usando la interfaz de línea de comandos. Puedes fusionar y modificar matemáticamente los datos de píxeles de las imágenes usando el especial Operador de imagen FX, pero generalmente está limitado a transformar imágenes enteras, y es muy muy lento. Para facilitarlo, muchas operaciones comunes desarrolladas por usuarios usando el operador FX se han integrado ahora en IM, creando cosas como Tablas de búsqueda de color, Funciones matemáticas Evaluate y Funciones de múltiples argumentos. Así como el Operador general de distorsión de imágenes y algunos Métodos especiales de composición de imágenes. Las API pueden manipular imágenes de una manera mucho más directa, permitiéndote crear una operación única tú mismo mucho más fácilmente, a la velocidad completa proporcionada por el lenguaje de la API.
- Procesamiento condicional
- La interfaz de línea de comandos de IM no puede modificar fácilmente las imágenes basándose en algún atributo derivado de la imagen. Por ejemplo, es muy difícil procesar imágenes de forma diferente dependiendo de si la imagen usa un fondo claro o un fondo oscuro. Sí, puedes hacer algunas acciones condicionales limitadas y específicas usando el Operador de imagen FX, o pedirle a IM que ajuste (rote) la Orientación de una imagen basándose en ciertas condiciones, o que solo reduzca y nunca amplíe al Redimensionar imágenes. Pero estas solo manejan condiciones de procesamiento especiales bien conocidas y comunes. La única manera realmente práctica de hacer procesamiento condicional es usar comandos separados y archivos temporales. Para ver un ejemplo de esto, consulta el bien comentado Script de rompecabezas (Jigsaw). Las API, por otro lado, pueden hacer este tipo de procesamiento condicional, mientras mantienen en memoria todas las imágenes involucradas, listas para continuar el procesamiento basándose en las condiciones específicas, cuando y como las necesites.
- Procesamiento en bucle
- Tampoco puedes simplemente recorrer imágenes en bucle de forma controlada, ni modificar fácilmente el proceso según qué imagen de la secuencia se esté manejando. Es decir, no puedes simplemente hacer algo diferente a cada imagen según el número de 'escena' de la imagen, o según los resultados de imágenes anteriores. Por ejemplo, dibujar texto a diferentes tamaños, o desenfocar gradualmente una imagen, o generar una lista de animación en un único comando. Sí, puedes modificar imágenes específicas en una lista de imágenes. Por ejemplo, consulta Modificación cuadro a cuadro de una animación. Pero debes saber cuántas imágenes hay en la lista de imágenes, y 'desenrollar' el bucle para procesar cada imagen de la lista por separado. La única manera realmente práctica de recorrer imágenes desde la línea de comandos es escribir las imágenes individuales como archivos de imagen separados (consulta Escribir múltiples imágenes) y procesarlas una a la vez en un bucle externo con script. Por ejemplo, consulta el script de shell diseñado para Dividir una imagen verticalmente. Alternativamente, puedes generar las imágenes usando un bucle de script de shell y canalizar el resultado a un comando final para fusionarlas en la imagen o secuencia de imágenes final. Para ver un ejemplo de esto, consulta Ejemplos de imágenes en capas, o los distintos generadores de scripts de shell de Animaciones de imágenes deformadas. Las API, sin embargo, no tienen problema con recorrer múltiples imágenes en bucle, ya sea en una única lista de imágenes, o incluso en múltiples listas de imágenes, o incluso con todo un arreglo o estructura de datos de listas de imágenes. También pueden mantener todas las imágenes en memoria listas para el paso final de combinación, sin usar tuberías ni archivos temporales.
Si tu aplicación necesita poder hacer alguna de estas cosas (aunque pocas aplicaciones realmente necesitan llegar tan lejos), entonces una API puede ser una mejor opción. El programa "[magick conjure](#conjure)" (consulta más abajo) fue diseñado originalmente para permitir un mejor uso de ImageMagick mediante scripts, permitiendo el uso de múltiples listas de imágenes. Las mejoras hechas a "magick" en IM v7 han hecho que esta API experimental caiga en desuso, aunque sigue disponible y aún en desarrollo.
Manejo de argumentos
Más allá de los nombres de archivo y las opciones en la línea de comandos, solo hay unos pocos estilos básicos de argumentos de opción que se usan.
- Nombres constantes (para ajustes específicos y tipos de método)
- Lista de nombres constantes (por ejemplo, dos colores, o canales)
- Argumento de geometría (una lista de números con formato especial y banderas)
- Listas de punto flotante (a veces con Escapes de porcentaje)
- Cadenas de texto de forma libre (con Escapes de porcentaje)
Nombres constantes
Los nombres constantes son cadenas constantes específicas que se usan para buscar en una biblioteca interna de ajustes permitidos que pueden ser usados por una opción. Por ejemplo, el ajuste "[-gravity](https://imagemagick.org/command-line-options/#gravity)" puede tomar cualquiera de nueve ajustes diferentes. Una vez establecido, ese ajuste es usado por todos los operadores de procesamiento de imágenes que siguen al ajuste en la línea de comandos. Por ejemplo: ajustes como 'North', 'East' o 'NorthEast'. Puedes obtener una lista de todos los ajustes válidos usando la Opción operacional List (consulta más abajo). Por ejemplo, usando el comando...
magick -list gravity
Solo se permiten esos ajustes específicos y, si intentas usar algún otro ajuste, obtendrás un error. Por ejemplo...
magick xc: -gravity Invalid null:
El ajuste puede especificarse de varias maneras diferentes, todas las cuales son perfectamente válidas. IM es muy tolerante respecto a esto. Por ejemplo, un ajuste puede especificarse en mayúsculas, minúsculas, o cualquier combinación de ambas. Las palabras individuales (indicadas por letras mayúsculas en la salida de "[-list](https://imagemagick.org/command-line-options/#list)") pueden tener espacios, guiones o guiones bajos adicionales, que simplemente se ignoran (pero solo entre palabras). En consecuencia, todos los siguientes argumentos son válidos para establecer "[-gravity](https://imagemagick.org/command-line-options/#gravity)" "North East"...
'`NorthEast`', '`northeast`', '`NORTHEAST`', '`NorTheAst`', '`north east`', '`north-EAST`', '`NORTH_EAST`', '` North East `', '`___North___East___`'.
Pero un argumento de 'Nor The Ast' no es válido, aunque las letras sean todas correctas, ya que usa espacios dentro de las palabras declaradas del ajuste. Estos nombres constantes no son solo para ajustes, sino también para declarar el método operacional a usar en algunos de los operadores de procesamiento de imágenes más complejos, tales como "[-layers](https://imagemagick.org/command-line-options/#layers)", "[-distort](https://imagemagick.org/command-line-options/#distort)" y "[-morphology](https://imagemagick.org/command-line-options/#morphology)". Algunos de los nombres constantes se leen desde archivos de configuración externos. Por ejemplo, nombres de color como los de "[-fill](https://imagemagick.org/command-line-options/#fill)", "[-stroke](https://imagemagick.org/command-line-options/#stroke)", "[-background](https://imagemagick.org/command-line-options/#background)" y "[-mattecolor](https://imagemagick.org/command-line-options/#mattecolor)". O los mapas especiales de 'umbral' usados para "[-ordered-dither](https://imagemagick.org/command-line-options/#ordered-dither)". De nuevo, "[-list](https://imagemagick.org/command-line-options/#list)" puede usarse para consultar qué nombres conoce tu versión actualmente instalada de IM.
Lista de nombres constantes
Este es un argumento poco usado y se utiliza más comúnmente en ajustes que necesitan uno o dos colores, tales como Ajuste de nivel por color. La opción "[-level-colors](https://imagemagick.org/command-line-options/#level-color)" puede tomar cualquiera de los siguientes estilos de argumento.
color color1,color2 color1-color2
También se usa para la selección de imágenes, en operaciones que hacen uso de múltiples índices de imagen, por ejemplo Duplicate y Clone. Los índices comienzan en cero para la primera imagen, mientras que pueden usarse índices negativos para denotar índices de imagen empezando desde el final de la lista de imágenes. Por ejemplo, '-2-1' significa tomar la penúltima imagen (índice '-2'), hasta la segunda imagen (índice '1'). ¡Y sí, esto realmente significa tomar las imágenes en el orden inverso al especificado! Otra opción que hace un uso intensivo de esto es la Selección de canal, donde puedes especificar una lista de canales con nombre específicos. Por ejemplo: 'Red,Green,Blue,Black,Alpha'. Sin embargo, el Ajuste de canal también puede usar una forma abreviada con una cadena de letras individuales (p. ej.: 'RGBA')
Argumentos de geometría
Esta es la forma más común de argumento de opción, y normalmente se usa para especificar tamaños, rectángulos y desplazamientos para diversas operaciones. Pero también la usa cualquier opción que necesite una lista de 1 a 5 números, ya sean enteros o de punto flotante. Por ejemplo, opciones como "[-crop](https://imagemagick.org/command-line-options/#crop)" y "[-resize](https://imagemagick.org/command-line-options/#resize)" usarán la sintaxis completa de un argumento de geometría, mientras que otras como "[-border](https://imagemagick.org/command-line-options/#border)", "[-level](https://imagemagick.org/command-line-options/#level)" y "[-gamma](https://imagemagick.org/command-line-options/#gamma)" pueden usar solo una pequeña parte de la sintaxis completa de geometría. Este tipo de argumento es tan común que se ha escrito un analizador (parser) especial (y complejo) para convertir tales cadenas de argumento en números y banderas, para uso de cualquier operador que necesite un argumento de geometría. Un argumento de geometría básicamente permite a un usuario especificar una única cadena de argumento que contiene hasta 5 valores de punto flotante (aunque la mayoría de los operadores solo usan enteros). El analizador de argumentos de geometría entiende todas las siguientes formas de cadena...
WxH+X+Y WxH +X+Y A A/B/C A,B,C,D,E
Los usuarios podrían especificar la pequeña lista de números en CUALQUIERA de estas formas, pero normalmente qué forma se usa depende de la operación para la que se está usando el argumento. Las primeras formas se usan normalmente para la especificación de un rectángulo de tamaño y ubicación específicos, o solo de un desplazamiento para algún propósito. Los desplazamientos siempre se decodifican como números diferentes, los que están a cada lado de una 'x' en la cadena. Es decir, un "+X+Y" siempre se decodifica como el 3.º y 4.º número, mientras que indica que el 1.º y el 2.º están indefinidos (o son cero). Las últimas formas permitirán un máximo de 5 valores de entrada posibles, y se usan normalmente para especificar un valor para cada uno de los canales de imagen RGBKA estándar. Además de estos números, el analizador también informa si hay presentes caracteres especiales de 'bandera' (cualquiera de '%', '^', '!', '<', '>'). El analizador, sin embargo, solo informa si el carácter está presente. No informa de dónde se encontró en el argumento. IM, por ejemplo, no recuerda que '%' estaba adjunto a un número específico. Tampoco informa si aparece varias veces. Esto significa que un argumento de geometría de '%50' tiene exactamente el mismo significado que '50%', aunque este último es preferible por legibilidad. Además, '50%x30' probablemente significará en realidad '50%x30%' y NO el 50 % del ancho de las imágenes y 30 píxeles de alto como podrías pensar. | _Como los argumentos de geometría pueden contener banderas especiales '%', actualmente no puedes usar Escapes de porcentaje para establecer sus valores basándote en atributos de la imagen.
Hay una Propuesta futura sobre exactamente cuándo se expandirá un escape de porcentaje que podría solucionar este problema con los argumentos de geometría. Y con suerte será parte de IMv7.
Listas de punto flotante
Si se necesitan más de 5 números de punto flotante, quizás incluso un número desconocido de valores, entonces se usa un argumento de lista de punto flotante, aunque por el momento estos generalmente son analizados por opciones individuales, ya que pueden variar ligeramente de una opción a otra. Generalmente consisten en una cadena (normalmente entre comillas) de números de punto flotante separados por comas o espacios. El Operador Distort es probablemente el operador más conocido que usa una lista de números de punto flotante. Otros incluyen los Núcleos de morfología y convolución definidos por el usuario, aunque este también tiene sintaxis extra específica para definir un arreglo de números (núcleos). Una variante de los números de punto flotante la usa "[-sparse-color](https://imagemagick.org/command-line-options/#sparse-color)", permitiéndote sustituir colores por algunos valores de punto flotante. Internamente, estos siguen convirtiéndose en valores de punto flotante cuando el arreglo resultante se pasa a la función de la biblioteca central.
Cadenas de forma libre
Otras opciones simplemente toman una cadena como argumento. Ya sea para generar etiquetas, anotar texto, o guardar como metadatos de imagen. Estas normalmente incluirán Escapes de porcentaje en la cadena, que se reemplazan (sustituyen) en algún momento antes de usar la cadena. Puede ser una sustitución inmediata, o la sustitución puede realizarse más tarde, justo antes de que el argumento sea realmente usado. (Consulta Escapes de porcentaje diferidos más abajo.
Argumentos con escapes de porcentaje
Debido a su naturaleza, cualquiera de los dos últimos tipos de argumentos a menudo se preprocesa para expandir los Escapes de porcentaje de propiedades de imagen dentro de la cadena. Eso significa que secuencias específicas de caracteres se expandirán (se reemplazan o sustituyen como cadena) en alguna otra cadena, o valor que se busca o calcula a partir de la(s) imagen(es) que se están procesando. Esto normalmente se hace justo antes de que el argumento sea realmente aplicado por el operador a una imagen específica, de modo que puedan usarse ajustes específicos de esa imagen. Si se permiten escapes de porcentaje en un argumento, puedes en su lugar prefijar el argumento con un '@' para que todo el argumento se lea desde el archivo externo dado (o la entrada estándar). Por ejemplo, '@filename' será reemplazado con el contenido del archivo 'filename'. Si esto ocurre, no se aplica ningún escape de porcentaje ni otro escape especial. Es decir, la cadena leída desde el archivo se tomará de forma literal, y se usará sin modificación. |
ADVERTENCIA: ese archivo podría ser cualquier cosa, incluyendo archivos del sistema y de contraseñas que pudieran ser legibles por el programa. Por ello, los usuarios web deberían comprobar de antemano las cadenas de entrada para este caso especial, o mejor aún, pasar esa cadena a IM usando la cláusula '@filename', como medida de seguridad. |
|---|---|
Si la cadena no se lee desde un archivo o flujo de entrada, entonces cualquier secuencia '\n' se reemplaza con un carácter de 'nueva línea', y cualquier etiqueta prefijada con '%' se reemplaza con el valor apropiado. Consulta Escapes de porcentaje de propiedades de imagen para la lista completa de reemplazos. El uso de escapes de porcentaje en los argumentos significa que, para una lista creciente de operadores que permiten el uso de tales escapes, como "[-set](https://imagemagick.org/command-line-options/#set)", "[-sparse-color](https://imagemagick.org/command-line-options/#sparse-color)", "[-distort](https://imagemagick.org/command-line-options/#distort)" o "[-morphology](https://imagemagick.org/command-line-options/#morphology)", puedes generar argumentos basados en diversos atributos de imagen y metadatos. ImageMagick versión 7 permite el uso de escapes de porcentaje en casi TODOS los argumentos (¡una característica clave de IMv7!). ¡Y no solo eso, sino que incluso puedes calcular argumentos diferentes dependiendo del contenido o del índice de la imagen! Incluso puedes precalcular algunos ajustes complejos usando ajustes por imagen o ajustes globales predefinidos. |
Antes de IM v6.6.9-0, los Escapes de porcentaje y, más específicamente, los Escapes de porcentaje FX que involucran índices de imagen, como '%p', '%n', '%[fx:t]' y '%[fx:n]', estaban rotos. Normalmente solo devolverían valores poco útiles de '0' o '1', y no el índice real ni el número de imágenes en la lista de imágenes actual. |
| --- | --- |
Escapes de porcentaje diferidos
Ten en cuenta que, para algunas opciones de ajuste, los Escapes de porcentaje no se expanden inmediatamente cuando se ven, sino que simplemente se almacenan TAL CUAL se dan. Es solo más tarde, cuando el texto es realmente usado, que cualquier Escape de porcentaje encontrado en la cadena debe expandirse, cuando se conoce finalmente la imagen con la que se usarán. Es decir, estos argumentos deben diferir la sustitución de los Escapes de porcentaje hasta que el argumento sea realmente usado. Estas opciones incluyen los Ajustes de entrada tales como: "[-label](https://imagemagick.org/command-line-options/#label)", "[-comment](https://imagemagick.org/command-line-options/#comment)", así como el ajuste "[-format](https://imagemagick.org/command-line-options/#format)", y los valores globales "[-define](https://imagemagick.org/command-line-options/#define)". Esto significa que puedes especificar una "[-label](https://imagemagick.org/command-line-options/#label)" que contenga Escapes de porcentaje específicos de la imagen mucho antes de que la imagen a la que se va a aplicar sea realmente leída. Solo cuando la etiqueta se adjunta realmente a la imagen (justo después de leerla) se expanden los Escapes de porcentaje, de modo que pueda hacer uso de los atributos de la imagen a la que se está aplicando. | _La principal limitación para un uso más generalizado de los Escapes de porcentaje es que actualmente solo se aplican a un conjunto limitado de argumentos de opción. Por ejemplo, actualmente no podemos usarlos con Argumentos de geometría, que también usan caracteres 'porcentaje', pero para un propósito diferente.
Este problema es uno de los principales problemas que IMv7 solucionará._
---|---
Comandos de ImageMagick
Si bien la mayoría de estas páginas de ejemplos de ImageMagick usan el comando "magick" para procesar imágenes, hay varios otros comandos de ImageMagick, que presentaré brevemente aquí. Sin embargo, algunos de estos comandos no pueden demostrarse correctamente en una página web. No obstante, intentaré darte pistas y consejos sobre esos comandos aquí, aunque no pueda mostrar su salida directamente.
Convert -- Convertir y modificar imágenes
El comando "magick" es el principal caballo de batalla de ImageMagick y, como tal, casi todos los conjuntos de ejemplos de estas páginas usan este comando. Por ello, no cubriré mucho el uso de este comando aquí, sino que veré un poco de historia en su lugar. El propósito original del comando, cuando IM fue creado por primera vez, era la conversión de imágenes de un formato de imagen a otro. De hecho, todavía se usa para este propósito, y por eso se llama "magick". Por esto, el comando puede que ni siquiera lea una imagen en memoria, sino que use programas Delegados secundarios fuera de IM propiamente dicho para hacer la conversión directamente. Sin embargo, este aspecto completamente externo ha caído en desuso con el tiempo, y por falta de necesidad, excepto como medio para leer y escribir formatos de archivo de imagen complejos. Durante un largo periodo de tiempo se añadieron algunas características adicionales de procesamiento de imágenes para hacer cambios menores en las imágenes a medida que se transferían entre formatos, o incluso al mismo formato. Estas eran generalmente opciones simples, pero a partir de IM versión 5 el uso de estas características de procesamiento se había vuelto extenso, y un aspecto mucho más importante del comando "magick" que la mera conversión de imágenes. A medida que las opciones se multiplicaban, y se empezaron a usar varias opciones, el orden de las opciones comenzó a producir resultados extraños e incontrolables. Para los usuarios, IM se hizo conocido como inestable e incontrolable cuando se usaban múltiples opciones de procesamiento de imágenes, y empezó a caer en desgracia. IM versión 6 vio el cambio de un estilo simple de 'opciones' a un estilo de 'hazlo según lo veas' para el procesamiento de imágenes y, como resultado, las capacidades de procesamiento de imágenes se volvieron estables, predecibles, y las capacidades de línea de comandos de IM se volvieron muchos órdenes de magnitud más útiles. Como resultado de esto, "magick" ya no trata tanto de 'convertir' imágenes de un formato a otro, sino que es una API de línea de comandos para acceder a funciones de procesamiento de imágenes, para crear y modificar imágenes de maneras muy complejas, sin necesitar un título en procesamiento de imágenes, ni programar en un lenguaje de computadora (como Perl, PHP o C). Por supuesto, algo de conocimiento de scripting de shell es útil, aunque no estrictamente necesario.
identify -- Imprimir los detalles de las imágenes que IM ve
El comando "identify" está diseñado para devolver información sobre una imagen de una manera simple y útil. Por defecto, produce un resumen compacto sencillo, detallando el nombre de la imagen, el formato de archivo, el tamaño de la imagen, el tamaño y desplazamiento del lienzo virtual, la profundidad de color, el tipo de formato interno y, si se conoce, el tamaño original de la imagen en disco en términos comprensibles. Por ejemplo...
magick identify tree.gif
Ten en cuenta que el '8c' en el resultado anterior no es el número de colores dentro de esta imagen (que en realidad es 6), sino el tamaño de la paleta de 'pseudo-color' (consulta un ejemplo posterior para el número real de colores). Ten en cuenta también que el 'lienzo virtual' de la imagen tiene el mismo tamaño que la imagen real con un desplazamiento cero, lo que significa que actualmente no se está usando. Añadir un control -verbose, de Control operacional, producirá toda la información sobre la imagen que IM conoce o puede calcular fácilmente. Esto incluye estadísticas de color, conteos de color, información de perfiles, tipo de guardado interno de la imagen, etc., etc.. Sin embargo, ten cuidado de que la salida realmente es... ¡verbose (detallada)! Se puede obtener información específica y producirla de maneras específicas usando el ajuste "[-format](https://imagemagick.org/command-line-options/#format)" y los escapes de porcentaje especiales de IM ('%') para producir Propiedades de imagen. Sin embargo, normalmente necesitas especificar un EOL (nueva línea en UNIX o MacOSX) como parte de ese argumento (cambiado en IM v6.8.5-8). Por ejemplo, puedes simplemente extraer un conteo del número de colores dentro de una imagen.
magick identify -format '%k\n' tree.gif
| Antes de IM v6.8.5-8, "[-format](https://imagemagick.org/command-line-options/#format)" añadía automáticamente uno o varios caracteres de fin de línea a la salida, para separar los resultados de múltiples imágenes. Esto ya no se hace, así que puede que necesites añadir tus propios caracteres EOL apropiados a la cadena "[-format](https://imagemagick.org/command-line-options/#format)".
---|---
Identify, hacer ping o no hacer ping
"[magick identify](#identify)" por defecto solo lee información básica mínima sobre una imagen, usando una técnica conocida como "[-ping](https://imagemagick.org/command-line-options/#ping)". Esto significa que identify solo lee lo suficiente del archivo de imagen para determinar información simple de la imagen, como el tamaño, sin intentar leer toda la imagen en memoria. Consulta Ping, control operacional más abajo. Esta es una gran ventaja que "[magick identify](#identify)" tiene sobre "[magick](#magick)". Sin embargo, la mayoría de los metadatos de imagen no estarán disponibles. Por ejemplo, las etiquetas de imagen de un archivo de imagen PNG. Por ejemplo, aquí creo una imagen con una 'etiqueta', e intento usar un ajuste de formato simple para imprimir esa etiqueta.
|
magick rose: -set label "rose with a label" rose.png
magick identify -format '"%l"\n' rose.png
Sin embargo, esto solo ocurre para casos muy específicos. Cualquier "[-format](https://imagemagick.org/command-line-options/#format)" que tenga escapes más complejos desactivará automáticamente el uso de una lectura 'ping' mínima.
magick identify -format '"%[label]"\n' rose.png
O puedes desactivar específicamente esta lectura 'ping' mínima, y forzar a identify a leer la imagen 'en su totalidad' para que obtenga la información deseada.
magick identify +ping -format '"%l"\n' rose.png
Generalmente no necesitas preocuparte demasiado por ello. A menos que estés tratando con imágenes muy grandes, como fotos.
Identify como calculadora de punto flotante
Puedes hacer algo de matemática de punto flotante usando Expresiones de escape FX...
magick identify -ping -format 'double_width=%[fx:w*2] PI=%[fx:atan(1)*4]\n' tree.gif
Ten en cuenta que el cálculo ni siquiera necesita estar relacionado con la imagen en sí, lo que te permite usar IM como una simple calculadora de punto flotante para usar dentro de tus scripts. Como solo necesitábamos información básica, usamos el control Ping para evitar que identify lea toda la imagen. No tiene efecto en el resultado en este caso, pero puede acelerar el comando enormemente.
Advertencias adicionales sobre Identify
- Detalles de formatos específicos
- Normalmente IM lee la imagen en memoria (que es esencialmente su propio formato de datos interno), usando diversas API de bibliotecas de imágenes y programas delegados, antes de producir los resultados que ve usando identify. Es decir, "
magick identify" analiza el contenido de imagen/datos que ha leído y almacenado. No analiza cómo el formato de archivo específico almacena o maneja los datos de imagen. Esto es importante, ya que puede haber aspectos muy específicos de formatos de archivo concretos sobre los que "magick identify" no informará. Por ejemplo, aunque lista el contenido de la tabla de colores de una imagen GIF para cada imagen presente (es posible tener múltiples imágenes), no te dirá si todas las imágenes del archivo comparten la misma tabla de colores o no. Si necesitas información específica sobre un formato de archivo de imagen concreto, puede ser mejor usar una herramienta diseñada específicamente para ese formato. Por ejemplo, "giftrans" para el formato de archivo GIF, y "jpegtrans" para el formato de archivo JPEG. - Salida del histograma de color
- Ten en cuenta que si la imagen tiene más de 1024 colores, no se incluirá ningún histograma ni tabla de colores en la salida verbose. Para forzar la generación de esta información, puedes usar el formato de archivo especial '
histogram:' que incluye todo como un gran comentario de imagen. - Estado de salida
-
El programa identify devuelve un estado de salida distinto de cero si se encuentra una imagen corrupta y añades un Control Regard Warnings.
error=
magick identify -regard-warnings image 2>&1 >/dev/null;if [ $? -eq 0 ]; then echo "The image is good" else echo "The image is corrupt or unknown format" echo "$error" fi
Alternativas de salida de Identify
A partir de IM v6.2.4 también puedes producir la salida de identify desde el comando "[convert](#convert)" usando el formato de archivo de salida especial "[info:](files.html#info)".
magick ../images/k* \
-format 'image \"%f\" is of size %G\n' info:
Puedes usar un Operador Write para escribir a "[info:](files.html#info)" en medio de una secuencia de operaciones, por ejemplo como herramienta de depuración. También puedes hacer que escriba esa salida a un archivo (o flujo de archivos) específico. Un método más simple sería usar una opción "[-identify](https://imagemagick.org/command-line-options/#identify)" para escribir a la 'salida estándar' normal.
magick ../images/k* \
-format 'Image #%p named \"%f\" is a %m\n' -identify \
null:
Esto también puede combinarse con otra opción, "[-print](https://imagemagick.org/command-line-options/#print)", para producir otra información.
magick null: -print ' (50 + 25)/5 ==> %[fx: (50+25)/5 ]\n' null:
La principal diferencia entre "[-identify](https://imagemagick.org/command-line-options/#identify)" y "[-print](https://imagemagick.org/command-line-options/#print)" es que el primero se ejecutará una vez por cada imagen en memoria, mientras que el segundo solo se ejecutará una vez. Eso significa que podemos generar casi cualquier archivo de texto que queramos sobre las imágenes en memoria, completamente desde dentro de un único comando de ImageMagick. Por ejemplo, aquí genero un archivo HTML del mismo conjunto de imágenes que he usado en el ejemplo anterior...
magick ../images/k* \
-print "<HTML><BODY><CENTER>\n" \
-print "<H1> Display of %n Thumbnails </H1>\n" \
-print "\n" \
-format "<IMG SRC=\"%i\" ALT=\"%f\" WIDTH=%w HEIGHT=%h>\n" -identify \
-print "\n" \
-print "<BR>That's all folks\!\n" \
-print "\n" \
-print "</CENTER></BODY></HTML>\n" \
null:
Puedes ver el resultado de la salida anterior como una Página web HTML que muestra las imágenes. Una última palabra sobre estas opciones. Todas ellas, por defecto, imprimirán a la 'salida estándar' del comando "magick". No puedes producir salida específicamente a alguna otra 'tubería' o a un archivo específico, a menos que hayas redirigido previamente la 'salida estándar'. Escribir la salida usando "[info:](files.html#info)" te permitirá dirigir la salida a un archivo específico, igual que puedes hacerlo a un archivo de imagen. También puedes dirigir la salida a un descriptor de archivo previamente preparado, usando el formato de archivo de salida especial "[fd:](files.html#fd)". Por supuesto, eso escribe una vez por imagen, así que puede ser necesario hacer algún malabarismo con las imágenes para que solo produzca salida una vez.
Mogrify -- procesamiento por lotes en el lugar
El comando "magick mogrify" es en muchos sentidos como "magick", excepto que está diseñado para modificar imágenes en el lugar. Es decir, su propósito principal es leer imágenes (o animaciones), un archivo a la vez, y modificarlas, antes de guardar la imagen de vuelta en el exacto mismo nombre de archivo del que se leyó la imagen. Por esto...
¡Mogrify es peligroso, ya que puede destruir fácilmente la imagen original!
Por ello, antes de hacer algo definitivo, prueba "magick mogrify" con una copia separada de tus imágenes. No lo uses en una imagen original que no tenga copia de seguridad. Ahora bien, aunque "magick mogrify" normalmente guarda una imagen modificada en el mismo nombre de archivo, tiene dos opciones especiales que le permiten guardar imágenes en un archivo diferente. El ajuste específico de "magick mogrify", "[-format](https://imagemagick.org/command-line-options/#format)", define un formato y sufijo diferentes a usar al guardar archivos. Por ello, un comando como...
magick mogrify -format jpg *.png
Te permitirá convertir, o modificar por lotes, imágenes sin destruir la imagen original. En este caso, convirtiendo todos los archivos PNG en archivos JPEG con el mismo nombre de archivo pero un sufijo diferente. Sin embargo, ten cuidado, ya que si existe un archivo con el mismo nombre, será sobrescrito. Así que déjame reiterar...
Piensa y comprueba antes de usar Mogrify
o puede que descubras que acabas de sobrescribir algo que querías conservar. A partir de IM v6.2.0 también puedes usar una nueva opción "[-path](https://imagemagick.org/command-line-options/#path)" para especificar un directorio diferente en el que producir las imágenes procesadas. Esto lo hace más seguro, sin embargo, todavía sobrescribirá cualquier imagen del mismo nombre que ya pueda estar en ese directorio. Además, ninguna imagen antigua que quedara en ese directorio será eliminada. Por ello, puedes hacer que IM guarde los resultados (digamos, miniaturas de imagen) en un subdirectorio existente, usando algo como esto...
magick mogrify -path thumbnail-directory -thumbnail 100x100 *
| Antes de IM v6.3.4-3, los ajustes "[-format](https://imagemagick.org/command-line-options/#format)" y "[-path](https://imagemagick.org/command-line-options/#path)" eran mutuamente excluyentes. A partir de esa versión puedes cambiar formatos y la ubicación del directorio de salida.
---|---
Debido a la capacidad de procesamiento de múltiples imágenes, el comando "magick mogrify" no puede usar ninguno de los Operadores de lista multi-imagen ni los Operadores de pila de imágenes. Eso significa que no puedes usar operadores de procesamiento de imágenes como "[-fx](https://imagemagick.org/command-line-options/#fx)", "[+swap](https://imagemagick.org/command-line-options/#swap)", "[-composite](https://imagemagick.org/command-line-options/#composite)", "[-append](https://imagemagick.org/command-line-options/#append)", "[-flatten](https://imagemagick.org/command-line-options/#flatten)" y "[-layers](https://imagemagick.org/command-line-options/#layers)" en un comando "magick mogrify". Como algunas opciones de ajuste necesitan establecerse antes de que se lea la primera imagen (por ejemplo "[-size](https://imagemagick.org/command-line-options/#size)", "[-label](https://imagemagick.org/command-line-options/#label)" y "[-density](https://imagemagick.org/command-line-options/#density)"), estas opciones se procesan y establecen antes de leer la primera imagen. Después de esto, cada imagen se lee y los operadores se les aplican en el orden de la línea de comandos antes de que la imagen se guarde y se lea la siguiente. Es importante tener esto en cuenta, ya que si cambias uno de estos ajustes más adelante en la secuencia puedes hacer que IM olvide un ajuste anterior. Por ejemplo..
magick mogrify -format gif -size 200x200 -pointsize 18 \
-font Candice -gravity north -annotate 0 "%f" \
-font Ravie -gravity Center -annotate 0 "%f" \
-font Gecko -gravity south -annotate 0 "%f" \
-size 100x64 xc:gold xc:orange xc:tomato
Como puedes ver, el tamaño de las imágenes generadas arriba fue determinado por el segundo ajuste de entrada "[-size](https://imagemagick.org/command-line-options/#size)", siendo el primer ajuste más grande ignorado por completo. Por otro lado, el ajuste de operación "[-font](https://imagemagick.org/command-line-options/#font)" se establece correctamente para cada una de las operaciones "[-annotate](https://imagemagick.org/command-line-options/#annotate)" individuales. Esta complejidad añadida significa que probablemente sea una buena idea...
Aplicar mogrify a las imágenes de forma simple.
No intentes hacer operaciones muy largas y complejas al estilo "magick" en una operación por lotes usando "magick mogrify", probablemente tendrás problemas de 'ajustes'. Si realmente quieres hacer un procesamiento complejo, escribe un script de shell/dos/perl para usar "magick" para procesar cada imagen una a la vez, o ve a una interfaz de API de ImageMagick. Para ver ejemplos de modificación de muchas imágenes usando un script, consulta Ejemplos avanzados de ImageMagick. Solo recuerda, "magick mogrify" es un comando peligroso, y siempre debe probarse a fondo en imágenes de respaldo, antes de ponerlo en producción. De hecho, también recomiendo que los scripts incluyan 'pruebas' rápidas sobre cosas como "magick mogrify" para asegurarse de que el comando no rompe nada (debido a cambios de versión o diferencias en las instalaciones de las computadoras) antes de procesar una colección muy grande de imágenes. Es decir, haz un pequeño 'caso de prueba' y aborta si no produce un resultado correcto, antes de continuar. Esto es en realidad una buena idea para cualquier proyecto de procesamiento de imágenes a gran escala, para proteger a los usuarios de consecuencias imprevistas. Yo mismo hago esto en los ejemplos de IM, y me ha ahorrado muchos problemas.
Composición alfa usando "magick mogrify"
Como "magick mogrify" no puede usar Operadores de lista multi-imagen, no puede superponer fácilmente cosas como logotipos, ni enmascarar imágenes usando Composición alfa. Hay una excepción a esto, usando "[-draw](https://imagemagick.org/command-line-options/#draw)" para realizar composición alfa de imágenes. Esto te permite especificar la segunda imagen, como parte de los argumentos del operador, fuera de la lista de imágenes actual. Por ejemplo, aquí primero hago una copia de las imágenes originales que quiero procesar usando un script especial "[cp_perl](http://www.ict.griffith.edu.au/anthony/software/#mv_perl)". Luego creo una imagen temporal de 'máscara' circular, que después uso para recortar una forma circular de todas esas imágenes, usando "magick mogrify" con un método de composición alfa '[Dst_In](compose.html#dstin)'.
cp_perl 's/^/mogrify_/' eye.gif news.gif storm.gif tree.gif
magick -size 32x32 xc:none -draw 'circle 15.5,15.5 15.5,0' circle.gif
magick mogrify -alpha Set -draw 'image Dst_In 0,0 0,0 "circle.gif"' mogrify_*.gif
Ten en cuenta que cualquier método de composición alfa puede usarse de esta manera, pero solo con una imagen 'fuente' o 'superposición' constante aplicada a todas las imágenes. Además, como "magick mogrify" leerá la imagen 'fuente' varias veces, te sugiero que uses el formato de archivo específico de IM "MPC:" para reducir la sobrecarga de decodificar la imagen al leerla una y otra vez. Este formato de archivo de imagen no necesita ser analizado por IM, ya que se mapeará directamente desde el disco a la memoria (para la misma máquina en la que fue creado). Esto ahorra mucho tiempo de procesamiento, especialmente al tratar con un gran número de imágenes.
Usar Convert en lugar de Mogrify
Usando una técnica especial para modificar el nombre de archivo de salida mediante Escapes de porcentaje, (consulta Escapes de porcentaje de nombre de archivo), puedes reemplazar "[mogrify](#mogrify)" con un comando "[convert](#convert)" más versátil. No solo eso, sino que te proporcionará un mayor control del nombre de destino final de la imagen y te permitirá manejar mejor el procesamiento de múltiples imágenes, como composiciones y animaciones. Por ejemplo, aquí creo miniaturas de las imágenes del directorio actual, insertando una cadena "_tn" en el nombre del archivo de entrada, para crear el nombre de archivo de salida apropiado.
magick *.jpg -thumbnail 120x90 \
-set filename:fname '%t_tn' +adjoin '%[filename:fname].gif'
Advertencia: no incluyas un sufijo de archivo diferente en el propio ajuste del nombre de archivo. IM no lo verá al decidir el formato de archivo de imagen a usar. Ten en cuenta que si IM no puede decidir a partir del nombre de archivo, recurrirá al formato de archivo original que se leyó, así que un sufijo claro, o un prefijo de codificador, puede ser importante al usar esta técnica. Para obtener el nombre de archivo original exacto del que proviene la imagen fuente, usa "%i", "%d/%f" o "%d/%t.%e". Por supuesto, todos estos tienen el sufijo de nombre de archivo en el ajuste del nombre de archivo, que IM no usa, pero eso debería estar bien, ya que es el mismo formato de archivo de imagen. El verdadero problema de usar "[convert](#convert)" en lugar de "[mogrify](#mogrify)" es que TODAS las imágenes se leen primero en memoria. Mogrify se esfuerza mucho por leer/modificar/escribir solo un archivo a la vez (aunque ese archivo podría contener múltiples imágenes). Pero "[convert](#convert)" no lo hace. Por ello, puedes superar muy fácilmente los límites de memoria si no tienes cuidado. Aunque hay formas de evitarlo. Consulta los ejemplos en Modificadores de lectura y Miniaturas. Además, como todas las imágenes están en memoria como una única lista de imágenes, tendrás que tener cuidado con cómo procesas esas imágenes. Por ejemplo, no puedes usar directamente la Composición alfa como lo harías normalmente, sino que puede que necesites usar la especializada Composición de lista multi-imagen para hacer el trabajo. Por supuesto, igual que con "magick mogrify", este método de usar "magick" puede ser peligroso, ya que podría sobrescribir y destruir fácilmente los archivos de imagen originales.
Alternativas al procesamiento por lotes
Si el procesamiento por lotes de imágenes usando "magick mogrify" no es práctico, especialmente si estás copiando las imágenes en lugar de modificarlas en el lugar, entonces puede ser mejor usar alguna otra solución de bucle ajena a IM. Estas incluyen...
# Use a simple shell loop, to process each of the images.
mkdir thumbnails
for f in *.jpg
do magick $f -thumbnail 200x90 thumbnails/$f.gif
done
# Use find to substitute filenames into a 'convert' command.
# This also provides the ability to recurse though directories by removing
# the -prune option, as well as doing other file checks (like image type,
# or the disk space used by an image).
find * -prune -name '*.jpg' \
-exec magick '{}' -thumbnail 200x90 thumbnails/'{}'.gif \;
# Use xargs -- with a shell wrapper to put the argument into a variable
# This can be combined with either "find" or "ls" to list filenames.
ls *.jpg | xargs -n1 sh -c 'magick $0 -thumbnail 200x90 thumbnails/$0.gif'
# An alternative method on linux (rather than plain unix)
# This does not need a shell to handle the argument.
ls *.jpg | xargs -r -I FILE magick FILE -thumbnail 200x90 FILE_thumb.gif
Y así sucesivamente. Recomiendo el uso tanto de "find" como de "xargs" para hacer procesamiento de archivos recursivo o incluso no recursivo. Lee sus páginas de manual. Para una introducción rápida, consulta esta Publicación de discusión de IM, así como la guía Xargs - Wikipedia que incluye información sobre los peligros involucrados. Si tus comandos empiezan a complicarse más que esto, puede ser hora de pasar a un script de shell, o un programa de API, para leer múltiples imágenes, recopilar información, calcular los argumentos apropiados y procesar las imágenes. También recomiendo echar un buen vistazo al comando "[parallel](http://www.gnu.org/software/parallel/)" (normalmente un reemplazo directo de "xargs"). Esto no solo te permite ejecutar múltiples comandos simultáneamente, sino que con un poco de trabajo puede ejecutar cada comando en diferentes computadoras, permitiéndote hacer procesamiento distribuido en red de un número muy grande de tareas. Para usuarios de Windows, te remito a la sección de Uso en Windows, y en particular a Windows, procesamiento por lotes de varios archivos. |
Recuerda que "[mogrify](#mogrify)", y todos los demás comandos de IM, también expandirán todos los nombres de archivo que contengan metacaracteres del shell como '*' y '?'. Esto se hace para permitir el uso de estos metacaracteres en el antiguo shell de línea de comandos de DOS. Sin embargo, esto podría causar un error, una ejecución repetida de magick mogrify, o posiblemente incluso un 'hackeo' de alguna fuente malvada que proporcionara el nombre de archivo a usar. Se aconseja precaución y una comprensión completa de los problemas de seguridad. |
|---|---|
Composite -- superponer imágenes de maneras especiales
El comando "magick composite" está diseñado específicamente para la simple composición (superposición) alfa de dos imágenes de varias maneras. Esto incluye limitar el área en la que las imágenes se combinan, mediante el uso de una tercera imagen de enmascaramiento. A diferencia de "magick", el comando "magick composite" es un comando muy tradicional, en el sentido de que leerá todas sus opciones y ajustes antes de realizar realmente la operación de procesamiento de una sola imagen para la que fue diseñado. El comando "magick composite" también proporciona acceso simple a algunos de los modos de composición alfa más complejos. Por ejemplo, la composición de imágenes "[-dissolve](https://imagemagick.org/command-line-options/#dissolve)", "[-blend](https://imagemagick.org/command-line-options/#blend)" y "[-watermark](https://imagemagick.org/command-line-options/#watermark)". Si se da alguno de estos argumentos, anularán cualquier otro ajuste "[-compose](https://imagemagick.org/command-line-options/#compose)" que se haya dado (o vaya a darse) para ese comando. Ten en cuenta también que el ajuste "[-tile](https://imagemagick.org/command-line-options/#tile)" también funciona de manera diferente al de "magick" o "magick montage" y "magick display". En "magick composite" esto hará que la imagen superpuesta se repita en mosaico por toda la imagen de fondo. Algo que aún no está disponible en otros comandos de IM. Aunque estas características especiales hacen de "magick composite" un comando útil, la composición alfa también está ahora disponible para su uso en el comando "magick". (Para más detalles consulta Composición alfa en IM). Para un resumen de las múltiples formas diferentes de superponer dos o más imágenes, consulta los ejemplos en Composición de múltiples pares de imágenes. Para más información sobre el método por el cual dos imágenes pueden fusionarse, consulta la página de ejemplos de Composición alfa. Las capacidades de limitación de superposición o 'enmascaramiento' también se detallan en la página de ejemplos anterior, en Usar una máscara de composición para limitar el área compuesta.
Montage -- generar arreglos de miniaturas
El comando especial de indexación de imágenes de IM "magick montage" también sigue el mismo estilo de estructura de línea de comandos 'hazlo según lo veas' que "magick". La única diferencia es que cuando se llega al final del comando (aparte del argumento final del nombre de archivo de imagen de salida), "magick montage" empezará a procesar la lista de imágenes en una o varias páginas de índice de miniaturas, según los ajustes que estén actualmente establecidos. Esto hace que "magick montage" sea mucho más versátil de lo que era en IM versión 5, ya que ahora puedes procesar las imágenes igual que lo harías en "magick", luego establecer todos los ajustes de "magick montage" que quieras, y dejar que termine el trabajo. Para más detalles sobre "magick montage", consulta Montage, arreglos de miniaturas.
display -- Pases de diapositivas de imágenes
El programa "magick display" está diseñado para mostrar una imagen, o una lista de imágenes, en forma de un pase de diapositivas en bucle. No está diseñado para una animación de imágenes cuidadosamente orquestada y temporizada; para eso usa el comando "[animate](#animate)". Cada imagen se mostrará en una ventana de tamaño apropiado para la imagen, a menos que otras opciones (como "[-geometry](https://imagemagick.org/command-line-options/#geometry)" de la ventana, ver más abajo) anulen este comportamiento. La imagen también se mostrará generalmente sobre un fondo de tablero de ajedrez para mostrar los efectos de cualquier transparencia que pueda tener la imagen (ver más abajo). Recuerda que esto NO está diseñado para mostrar una animación, sino como un pase de diapositivas de imágenes reales. Por ello, puede ser necesaria cierta precaución al usar display en un programa de scripting. Tiempo de visualización de imagen, bucle y otras opciones Por defecto se usa un retardo de aproximadamente 2 segundos además de cualquier retardo que el usuario especifique usando el ajuste "[-delay](https://imagemagick.org/command-line-options/#delay)". Sin embargo, puedes hacer que espere la entrada del usuario (barra espaciadora) usando la opción "-delay 0". No obstante, los valores por defecto pueden ser anulados por las propias imágenes, dependiendo de su formato de archivo. Por ello, los formatos de animación como GIF y MIFF podrían resultar en una pausa, o en 2 segundos más el ajuste de retardo de los metadatos de la imagen. Por ello, se recomienda que siempre establezcas un "[-delay](https://imagemagick.org/command-line-options/#delay)" según corresponda (recuerda que "-delay 5x1" retardará 5+2 o unos 7 segundos) para tu script y necesidades. Lo mismo ocurre con el ajuste "[-loop](https://imagemagick.org/command-line-options/#loop)". Por defecto, "magick display" hace bucle para siempre ("-loop 0"), pero formatos de imagen como MIFF o GIF pueden anular esto para hacer que salga después de la última imagen del bucle. Configura la opción "[-loop](https://imagemagick.org/command-line-options/#loop)" apropiadamente para tu situación. Ten en cuenta que "magick display" no manejará ningún Ajuste de animación GIF, por lo que los cuadros no se eliminan (dispose), y los tamaños y desplazamientos del lienzo virtual se ignoran. En otras palabras, verás las imágenes parciales en crudo de una animación GIF, no la imagen correctamente superpuesta. Sí proporciona una opción "[-coalesce](https://imagemagick.org/command-line-options/#coalesce)" para limpiar tales animaciones con fines de visualización.
Manejo de la transparencia
Las imágenes que contienen un canal alfa completo (p. ej., los formatos PNG y MIFF) se superpondrán sobre un patrón de fondo de 'tablero de ajedrez', para permitirte ver los efectos de cualquier semitransparencia, como los efectos de sombra. Puedes cambiar eso seleccionando un fondo diferente con "[-texture](https://imagemagick.org/command-line-options/#texture)" tal como...
magick display -texture granite: test.png
magick display -texture xc:black test.png
Las imágenes con transparencia de paleta (o booleana), como los formatos GIF y PNG8, se muestran con el 'color transparente' actual que se usó para representar la transparencia en la tabla de colores. Es decir, puede usarse un color generalmente aleatorio (normalmente negro) en lugar del patrón de tablero de ajedrez por defecto. Esto podría considerarse un error, aunque técnicamente no lo es. Sin embargo, si quieres que display maneje tales imágenes de la misma manera que otras imágenes que contienen información de transparencia, puedes eliminar los metadatos de la paleta antes de pasar la imagen a "magick display" usando los siguientes comandos para cambiar el estilo interno del formato de salida de la imagen.
magick image.gif -type truecolormatte miff:- | display -
Alternativamente, casi cualquier operación que modifique la imagen que se está mostrando también eliminará los metadatos de paleta existentes. Por ello, algunas opciones de "magick display" pueden usarse para eliminar la paleta. Por ejemplo, usando "[-coalesce](https://imagemagick.org/command-line-options/#coalesce)".
magick display -coalesce image.gif
Esto tiene la ventaja adicional de limpiar las optimizaciones de animación GIF que puedan estar presentes. Aunque para múltiples imágenes no relacionadas podría tener otros efectos secundarios indeseables. Sí, estos métodos son torpes, pero funcionan.
Mostrar usando Convert
Un método de visualización alternativo (distinto a usar "magick animate", ver el siguiente) es usar el formato de imagen de salida más simple "x:" (consulta formato de salida display).
magick image.png x:
Este método no proporciona una ventana de fondo, opciones de menú, ni otros controles. Simplemente muestra las imágenes una a una. Si solo quieres 'mostrar' la imagen resultante, el Delegado de generación de salida especial 'show:' o 'win:' hará lo mismo ejecutando el comando "[display](#display)" sobre la imagen de salida, y saliendo sin esperar a que esa ventana se cierre.
magick image.png show:
Tamaño de salida de Display
Display no escalará una imagen para ajustarla a la visualización de la ventana X. El tamaño de la ventana se ajustará para encajar cada imagen, a menos que se establezca usando el ajuste "[-geometry](https://imagemagick.org/command-line-options/#geometry)". Ese ajuste también puede usarse para fijar la posición de las ventanas en la visualización de la ventana X. Las imágenes que sean más grandes que la pantalla tampoco se redimensionarán, sino que desbordarán la pantalla; display, sin embargo, también proporcionará una 'ventana de desplazamiento' para permitir al usuario deslizarse por la imagen. Esto puede ser molesto al ver una foto digital moderna de alta resolución. Para limitar display a, digamos, un área de 800x600 píxeles (solo redimensionar hacia abajo, nunca hacia arriba), usa...
magick display -resize 800x600\> photo.jpg
Para imágenes JPG puedes acelerar la lectura de la imagen usando un ajuste especial de pista de tamaño de entrada jpeg. Consulta Opciones de control de lectura JPEG.
magick display -define jpeg:size=1600x1200 -thumbnail 800x600\> photo.jpg
Si la imagen es de una cámara digital moderna, también puedes usar "[-auto-orient](https://imagemagick.org/command-line-options/#auto-orient)" para corregir la rotación de la cámara de la imagen mostrada, usando los metadatos EXIF en el formato de archivo de imagen. Si no quieres menús, puedes desactivarlos usando el ajuste "[-immutable](https://imagemagick.org/command-line-options/#immutable)" en "magick display", para que sepa que no debe permitir la edición.
Uso de Display con scripts
Teniendo estas opciones en mente, lo siguiente es mi recomendación para usar "magick display" para mostrar resultados de un script de shell complejo...
magick display -delay 0 -loop 1 -coalesce -resize 800x600\> some_random_image
Display con X Windows
La opción "[-window](https://imagemagick.org/command-line-options/#window) root" puede usarse para mostrar una imagen en la ventana de fondo (raíz) de X window. En este caso, el programa "magick display" sale automáticamente. Por defecto, una imagen se repite en mosaico por todo el fondo. Por ejemplo, prueba esto..
magick display -window root pattern:checkerboard
Para muchos otros ejemplos de baldosas de imagen, y cómo generarlas, consulta Lienzos en mosaico, y Ejemplos de imágenes de fondo. Si quieres usar una sola imagen para tu fondo de X Windows, puede que necesites saber el tamaño de tu visualización de X window. El programa "xdpyinfo", aunque no forma parte de ImageMagick, puede darte esa información.
xdpyinfo | grep dimensions:
Y aquí usamos la salida de "xdpyinfo" para redimensionar una imagen de modo que llene completamente el fondo de X window.
screen_size=`xdpyinfo | sed '/dimensions:/!d;s/^[^0-9]*//;s/ pixels.*//'`
magick display -resize $screen_size! -window root photo.jpg
Control remoto de Display
Display proporciona una opción especial "[-remote](https://imagemagick.org/command-line-options/#remote)". Esta buscará un comando "magick display" que ya esté en ejecución y luego le pasará los argumentos dados. Por ejemplo...
magick display wizard: &
sleep 5
magick display -remote logo: &
Mostrará la imagen "wizard" incorporada en un comando en segundo plano. El script esperará entonces 5 segundos antes de reemplazarla con la imagen "logo" incorporada. Ten en cuenta que si no hay ningún comando "magick display" en ejecución, el comando actual abrirá una ventana y no saldrá. Por ello, también deberías poner en segundo plano los comandos "display -remote" como precaución. En este momento no puedes pedirle a un "magick display" remoto que salga. Por ello, la mejor manera de cerrar el display remoto es matar el proceso en ejecución, o 'eliminar' la ventana de display usando algún comando de X window. Por ejemplo (usando el comando ajeno a IM "xdotool")...
xdotool search -class "display" windowkill
animate -- Mostrar una animación de imágenes
En muchos sentidos, "magick animate" y "[display](#display)" son extremadamente similares. Sin embargo, "[display](#display)" solo muestra las imágenes del archivo de imagen dado 'tal cual', sin cambios, añadiendo una pausa mínima de 2 segundos entre cada cuadro para la entrada del usuario. "magick animate", por otro lado, aplicará cualquier Ajuste de animación GIF que se guarde con la imagen, y solo mostrará cada imagen según sus ajustes de 'retardo de tiempo', volviendo en bucle al inicio para repetir la animación. En otras palabras, "magick animate" 'anima' los formatos de animación correctamente, mientras que "[display](#display)" no lo hace. Sin embargo, por esto, el lienzo virtual de la primera imagen controlará el tamaño de la imagen de salida, y las demás imágenes se superpondrán en esa área de imagen. Por supuesto, como las imágenes se animan, tienes un control fino de la temporización de visualización de la imagen, usando opciones como "[-delay](https://imagemagick.org/command-line-options/#delay)". El comando también tiene un argumento extra "[-pause](https://imagemagick.org/command-line-options/#pause)" para añadir una pausa extra al final del bucle de animación, más allá de lo que especifique el ajuste "[-delay](https://imagemagick.org/command-line-options/#delay)" de los cuadros finales. Por ejemplo, puedes usar "magick animate" para generar una Comparación por parpadeo de dos imágenes muy similares, usando algo como..
magick image1.png image2.png -scale 400% miff:- |\
magick animate -delay 50 -loop 0 -
He escrito un script para aprovechar este método llamado "[flicker_cmp](../static/img/scripts/flicker_cmp)", y lo encuentro extremadamente útil para detectar cambios muy sutiles en la intensidad de los píxeles que de otro modo se me pasarían por alto.
compare -- Buscar diferencias
Toda la información actual sobre esto está en la sección de la Página de comparación de imágenes de los ejemplos de IM.
stream -- procesamiento en tubería de imágenes masivas
"magick stream" es un programa especial diseñado para manejar la extracción de una porción de un archivo de imagen muy grande. Es el único programa de este tipo dentro de ImageMagick; todos los demás leen las imágenes completamente en memoria antes de procesarlas (la excepción son las imágenes JPEG mediante "[-size](https://imagemagick.org/command-line-options/#size)", ya que esta opción se pasa a la biblioteca delegada JPEG). Puedes seleccionar una porción de la imagen con el ajuste "[-extract](https://imagemagick.org/command-line-options/#extract)". Y puedes especificar la profundidad de los bytes en crudo con el ajuste "[-depth](https://imagemagick.org/command-line-options/#depth)". Y finalmente, puedes seleccionar qué canales de color extraer usando la opción "[-channel](https://imagemagick.org/command-line-options/#channel)". Sin embargo, "magick stream" solo producirá los bytes de color en crudo de la imagen (formato RAW) según lo defina la profundidad de la imagen, por lo que puede que necesites canalizar la salida del segmento extraído a convert. Por ejemplo... |
magick stream -map rgb -storage-type char -extract 100x100+200+100 logo: - |\
magick -depth 8 -size 100x100 rgb:- magick stream_wand.gif
![[Salida de IM]](../static/img/basics/stream_wand.gif)
Para más información y ejemplos, consulta Manejo de imágenes realmente masivas.
import -- leer imágenes de la pantalla
El comando "magick import" es un programa especial que puede usarse para capturar y extraer imágenes de una visualización de X windows. Por ejemplo, hagamos que capture e imprima una ventana que selecciones de tu pantalla...
magick import -page A4 -gravity center ps:- | lpr
En realidad rara vez se usa, ya que el formato de archivo especial "[X:](files.html#x)" también proporciona exactamente la misma funcionalidad desde dentro del comando magick. La única diferencia entre ambos es que "magick import" tiene más ajustes específicos de X window que el formato "[X:](files.html#x)", como especificar la visualización, la pantalla y/o el ID de ventana del que se va a capturar la imagen. Otras opciones incluyen controles para el 'pitido' de la visualización y capturas repetidas. Si no se especifica ninguna ventana concreta, el ratón puede usarse para seleccionar qué partes de la visualización quiere capturar el usuario como imagen.
- Si se usa un solo clic del ratón, se captura toda la ventana en la que se hizo clic y se devuelve como imagen. Ten en cuenta que si alguna otra ventana de la visualización está ocultando parte de la ventana seleccionada, entonces capturarás una imagen de las otras ventanas que están ocultando la ventana seleccionada que se está capturando.
- Un clic en la ventana raíz, o seleccionar "
-window root", devolverá toda la pantalla. - Si se usa un clic y arrastre del ratón, se devuelve una sección Recortada de toda la pantalla, lo que por supuesto también significa que la ubicación (desplazamiento del lienzo virtual) en toda la visualización (tamaño del lienzo virtual, o página) también se devuelve.
Otras opciones te permiten evitar la interacción humana con el ratón capturando toda la pantalla ("-window root"), o una ventana específica, dado un título de ventana, o un ID de ventana X, que puedes encontrar usando la utilidad de X window "xwininfo". También puedes reducir el área de la ventana seleccionada usando "[-extract](https://imagemagick.org/command-line-options/#extract)". Consulta también el formato de entrada especial, "[X:](files.html#x)", como alternativa a usar "magick import".
Note to import from the Windows clipboard use
magick clipboard:myimage image.png
and not "import"
conjure -- lenguaje de scripting experimental de IM
Fue diseñado originalmente para permitir el uso de ImageMagick mediante scripts, con el uso de múltiples listas de imágenes, pero las mejoras hechas a "magick" en IM v6 han hecho que esta API experimental caiga en desuso. Es un lenguaje basado en XML. Aunque si quieres XML, SVG puede ser mejor para tus necesidades. En mi opinión, usar el script "magick conjure" es probablemente mejor y más fácil al tratar con listas de múltiples imágenes. Y se usa, aunque no muy ampliamente, debido a la falta de ejemplos y de soporte por parte de los usuarios.
Listas de imágenes...
Uno de los puntos más importantes que recordar con ImageMagick, y uno que confunde tanto a los usuarios nuevos como a los experimentados, es que...
ImageMagick trabaja con listas ordenadas de imágenes, no con imágenes individuales
Es decir, IM no trata solo con una imagen, sino potencialmente con una lista ordenada de imágenes, ya sean imágenes individuales separadas, un conjunto de imágenes que se superponen unas sobre otras, o los cuadros de una animación. Además, en general, todos los operadores de imagen se aplicarán a todas las imágenes de la lista actual. Por ello, si usas un operador "[-draw](https://imagemagick.org/command-line-options/#draw)", no solo dibujará en la última imagen de la lista, como asumirían muchos usuarios nuevos, sino que dibujará en todas las demás imágenes de la lista de imágenes actual, y lo hace en cada imagen por turno. Los operadores de capas de imagen, como "[-coalesce](https://imagemagick.org/command-line-options/#coalesce)" y "[-layers](https://imagemagick.org/command-line-options/#layers)", reemplazarán cada imagen de la lista con una nueva imagen modificada según las otras imágenes de la lista. ¡Incluso pueden añadir o eliminar imágenes extra! Además, los operadores de lista de imágenes, como "[-append](https://imagemagick.org/command-line-options/#append)", "[-mosaic](https://imagemagick.org/command-line-options/#mosaic)" y "[-fx](https://imagemagick.org/command-line-options/#fx)", reemplazarán TODAS las imágenes de la lista de imágenes actual con la imagen combinada resultante. Es decir, destruirán todas las imágenes, a menos que se hayan guardado previamente usando Paréntesis, y se hayan usado Imágenes clonadas. Consulta Operadores de lista de imágenes más abajo para ver ejemplos prácticos. Finalmente, cuando se lee o se crea una nueva imagen, IM solo añade esa nueva imagen al final de la lista de imágenes actual (que siempre existe). Algunos formatos (como GIF) pueden en realidad añadir múltiples imágenes a la lista de imágenes actual, a menos que se añada un Modificador de lectura de indexación especial al nombre de archivo de entrada, para limitar lo que se lee. Al guardar imágenes, IM guardará toda la lista de imágenes que esté en memoria en el momento de la escritura. Si el formato de imagen lo permite, IM escribirá TODAS las imágenes en un solo archivo. Si el formato NO permite múltiples imágenes (por ejemplo, JPEG), escribirá las imágenes en archivos separados (consulta Escribir múltiples imágenes).
Paréntesis -- procesar imágenes 'al margen'
Con la formalización de las opciones de la línea de comandos, el orden de procesamiento es ahora exactamente predecible, y también se ha hecho posible añadir paréntesis (o corchetes) al procesamiento de imágenes. Esta ha sido una característica deseada por los usuarios de IM durante mucho tiempo, y te permite hacer cosas nunca antes posibles en un solo comando. El paréntesis de apertura '(' iniciará en efecto una nueva lista de imágenes, sobre la que trabajarán todos los operadores encerrados. El paréntesis de cierre correspondiente ')' añadirá entonces la lista de imágenes resultante (que puede ser más de una imagen, o ninguna) al final de la lista de imágenes anterior. En otras palabras, usar paréntesis significa...
"Necesito hacer un poco de trabajo en una lista de imágenes separada
antes de añadir los resultados al final de la lista anterior."
Te permite trabajar en un subconjunto de imágenes, como un borrador, y luego añadir el resultado de vuelta a la lista de imágenes principal sin afectar a las imágenes que ya has leído previamente o con las que has estado trabajando. Veamos algunos ejemplos simples... |
magick eye.gif storm.gif -negate +append cmd_negate.gif
![[Salida de IM]](../static/img/basics/cmd_negate.gif)
Como puedes ver, el operador "[-negate](https://imagemagick.org/command-line-options/#negate)" negó el color de ambas imágenes, ya que ambas estaban en la lista de imágenes actual en memoria en ese momento. Pero añadiendo paréntesis podemos limitar la negación solo a la segunda imagen... |
magick eye.gif \( storm.gif -negate \) +append cmd_bracket.gif
![[Salida de IM]](../static/img/basics/cmd_bracket.gif)
Como la imagen "storm.gif" se lee en una lista de imágenes separada de la de la primera imagen (generada por el operador de lista de imágenes "("), puede negarse sin afectar a la primera imagen. Luego podemos añadir el resultado a la lista de imágenes principal (es decir, el operador ")"), antes de unir las dos imágenes como antes. | _Los paréntesis deben darse como un argumento separado. Es decir, debes separarlos de los otros argumentos con espacios. No puedes pegarlos directamente a los argumentos vecinos. En otras palabras, en el argumento de la línea de comandos de IM "\(+clone" está mal, mientras que "\( +clone" es correcto.
Además, en el último ejemplo necesité poner una barra invertida '\' antes del paréntesis. Eso es porque, al usar IM en una máquina UNIX (linux), los paréntesis tienen un significado especial para el shell de la línea de comandos. Por ello, necesito escapar, o entrecomillar, los símbolos de corchete cuando los uso.
Los scripts de DOS de Windows no requieren que los paréntesis se escapen con barra invertida. Consulta Scripts de DOS de Windows para esta y otras diferencias con el scripting de linux.
_
---|---
Los paréntesis también hacen posible hacer algo que antes no era posible hacer en un solo comando "magick". ¡Generar arreglos de imágenes! |
magick eye.gif news.gif +append \
\( storm.gif tree.gif +append \) -append cmd_array.gif
![[Salida de IM]](../static/img/basics/cmd_array.gif)
Arreglos como este eran por supuesto posibles usando "magick montage" (consulta Modo de concatenación de Montage), pero usar un comando separado hace que los scripts de procesamiento de imágenes sean más complejos. Por supuesto, si quieres que el comando se parezca más a un arreglo en sí, eres libre de añadir algunos paréntesis adicionales. |
magick \( eye.gif news.gif +append \) \
\( storm.gif tree.gif +append \) \
-append cmd_array2.gif
![[Salida de IM]](../static/img/basics/cmd_array2.gif)
El primer conjunto de paréntesis no es estrictamente necesario, y añade una pequeña cantidad de trabajo extra al procesamiento interno de IM, pero deja claro lo que el comando está haciendo al separar los pasos de procesamiento. También puede ser más fácil para los scripts de procesamiento de imágenes realizar cada paso de procesamiento como un paréntesis separado, como medio de separar los pasos de procesamiento que está aplicando.
Paréntesis y ajustes
Los 'ajustes' de opción no se ven afectados por los paréntesis, y continuarán a través de los operadores de imagen entre paréntesis, hasta que el ajuste se cambie o se desactive. Por ejemplo... |
magick -pointsize 24 \
-font Candice label:Outside \
\( label:Inside \
-font Gecko label:Inside \) \
label:Outside -append cmd_settings.gif
![[Salida de IM]](../static/img/basics/cmd_settings.gif)
Observa cómo el primer ajuste "-font Candice" NO se restablece a su ajuste por defecto cuando se entra en el paréntesis, mientras que el segundo "-font Gecko" no es reemplazado por el ajuste de fuente original al salir del paréntesis. En otras palabras...
Los paréntesis solo crean una secuencia de imágenes separada.
No limitan los ajustes, solo las imágenes sobre las que se trabaja.
A partir de IM v6.4.1-4, la nueva opción de control operacional "[-respect-parentheses](https://imagemagick.org/command-line-options/#respect_parenthesis)" puede anular este comportamiento. Cuando se da al inicio de un comando de IM, hará que los paréntesis también guarden y recuperen los ajustes anteriores que se hayan dado. Eso significa que cualquier ajuste dado dentro de los paréntesis solo permanecerá establecido hasta el final de los paréntesis. Por ejemplo... |
magick -respect-parentheses -pointsize 24 \
-font Candice label:Outside \
\( label:Inside \
-font Gecko label:Inside \) \
label:Outside -append cmd_settings2.gif
![[Salida de IM]](../static/img/basics/cmd_settings2.gif)
Como puedes ver, cuando terminó el paréntesis, el ajuste de fuente se restauró a la fuente 'Candice' anterior, en lugar de la fuente 'Gecko' que se estableció dentro del paréntesis. Esto puede ser muy útil cuando tienes que cambiar muchos ajustes, solo por un breve tiempo...
magick -respect-parentheses \
-font Arial label:"This is a line of plain text." \
\( -font Candice -pointsize 16 -fill red -undercolor lightblue \
label:"A line using a lot of different settings." \) \
label:"Text is back to normal -- like Magick\!" \
-append cmd_settings_lots.gif
Operadores de lista de imágenes
Con el mayor énfasis de IM en las secuencias de imágenes, especialmente dentro de los paréntesis, no es de extrañar que se haya proporcionado un conjunto de nuevos operadores de imagen para manipular las listas de imágenes.
Los argumentos de estos operadores son números que indexan la lista de imágenes, comenzando con cero ('0') para la primera imagen, y uno ('1') para la segunda imagen, y así sucesivamente. Sin embargo, si das un índice negativo, las imágenes se referencian desde el final (última imagen añadida) de la lista de imágenes. Es decir, un índice de '-1' es la última imagen de la lista de imágenes actual (generalmente la última imagen leída o creada), '-2' para la penúltima, y así sucesivamente.
-delete {index_range_list}
El operador de lista "[-delete](https://imagemagick.org/command-line-options/#delete)" es el más simple de los operadores de lista de imágenes; simplemente elimina imágenes de la lista de imágenes actual. |
magick font_[0-3].gif -delete 1 +append seq_delete.gif
![[Salida de IM]](../static/img/basics/seq_delete.gif)
La forma 'más' del operador, "[+delete](https://imagemagick.org/command-line-options/#delete)", no toma argumento, y simplemente elimina la última imagen de la lista de imágenes actual. El operador "[-delete](https://imagemagick.org/command-line-options/#delete)" también aceptará una lista de números separados por comas, o un rango de números a eliminar. |
magick font_[0-7].gif -delete 1-4,6 +append seq_delete2.gif
![[Salida de IM]](../static/img/basics/seq_delete2.gif)
O eliminar todo (y añadir una nueva imagen)... |
magick font_[0-7].gif -delete 0--1 tree.gif seq_delete3.gif
![[Salida de IM]](../static/img/basics/seq_delete3.gif)
El argumento '0--1' significa eliminar imágenes desde la primera imagen (índice 0) hasta la última imagen (índice -1). En otras palabras, TODAS las imágenes de la lista de imágenes actual. La imagen del árbol se añadió entonces para darle a IM un resultado real, y así evitar un error del tipo 'no image'. También se podría haber usado una imagen de salida "[NULL:](files.html#null)" para no producir ninguna salida. Si un índice de imagen no existe, o un rango de números está invertido, "[-delete](https://imagemagick.org/command-line-options/#delete)" ignorará silenciosamente esa eliminación de imagen específica. Por ejemplo, el argumento '-25' intentará eliminar la 25.ª imagen desde el final de la lista de imágenes, pero no hará nada silenciosamente si hay menos de 25 imágenes presentes. Por ello, puedes generar una animación rotatoria de 24 imágenes usando una secuencia como...
magick animation.gif new_frame.gif -delete -25 animation_new.gif
Sin embargo, no se eliminará ninguna imagen si el número de imágenes era 24 o menos. Como resultado, la animación crecerá en un cuadro cada vez que se ejecute el comando, hasta que se alcance un máximo de 24 cuadros. Después de eso, el cuadro más antiguo (el primero) se eliminará mientras se añade uno nuevo. A partir de IM v6.3.4, "[-delete](https://imagemagick.org/command-line-options/#delete)" no eliminará imágenes que resulten en que el rango numerado quede invertido. Eso significa que el último ejemplo podría reescribirse así...
magick long_animation.gif new_frame.gif -delete 0--25 animation_new.gif
Esta vez, "[-delete](https://imagemagick.org/command-line-options/#delete)" eliminará todas las imágenes entre la primera y la 25.ª imagen desde el final, dejando como máximo 24 imágenes en la lista. Si solo hay 24 imágenes o menos presentes, el rango dado de imágenes a eliminar quedará efectivamente invertido, y el operador "[-delete](https://imagemagick.org/command-line-options/#delete)" no eliminará nada.
-insert {index}
La operación "[-insert](https://imagemagick.org/command-line-options/#insert)" es algo así como lo opuesto de "[-delete](https://imagemagick.org/command-line-options/#delete)". Tomará la última imagen de la lista de imágenes actual y la insertará de modo que quede posicionada en el índice dado. |
magick font_[0-3].gif tree.gif -insert 1 +append seq_insert.gif
![[Salida de IM]](../static/img/basics/seq_insert.gif)
Puedes pensar en el índice de inserción como el número de imágenes que deberían aparecer antes del punto donde se insertó la imagen. Por supuesto, la imagen que estaba en ese índice (y todas las imágenes posteriores) será desplazada a la siguiente posición de índice para hacer sitio a la nueva imagen. Si se usa una posición de índice negativa, la posición de inserción se calcula después de que la imagen que se está insertando sea eliminada del final de la lista. Es decir, actuará como si la imagen que se está insertando no fuera parte de la lista de imágenes original. Por ello, "-insert -2" 'rotará' las últimas tres imágenes, colocando dos imágenes entre la imagen recién insertada y el final de la lista de imágenes. |
magick font_[0-3].gif tree.gif -insert -2 +append seq_insert2.gif
![[Salida de IM]](../static/img/basics/seq_insert2.gif)
La forma 'más' "[+insert](https://imagemagick.org/command-line-options/#insert)" moverá la última imagen al frente de la lista de imágenes (índice 0), rotando efectivamente toda la lista de imágenes en un cuadro. |
magick font_[0-3].gif tree.gif +insert +append seq_insert3.gif
![[Salida de IM]](../static/img/basics/seq_insert3.gif)
Para hacer lo inverso de lo anterior (mover una imagen al final de la lista de imágenes), se puede hacer usando primero "[-duplicate](https://imagemagick.org/command-line-options/#duplicate) 1,0" para copiar la primera imagen, y luego usando "[-delete](https://imagemagick.org/command-line-options/#delete) 0" para eliminar la primera imagen.
-swap {index}[,{index}]
Dicho de forma simple, "[-swap](https://imagemagick.org/command-line-options/#swap)" intercambiará las posiciones de dos imágenes en la lista de imágenes actual. Por ejemplo, "-swap 0,2" intercambiará la primera y la tercera imágenes de la lista de imágenes actual. |
magick font_[0-3].gif -swap 0,2 +append seq_swap.gif
![[Salida de IM]](../static/img/basics/seq_swap.gif)
La forma 'más' de esta opción "[+swap](https://imagemagick.org/command-line-options/#swap)" intercambiará las dos últimas imágenes de la lista de imágenes actual. En otras palabras, es equivalente a "-swap -2,-1". |
magick font_[0-3].gif +swap +append seq_swap2.gif
![[Salida de IM]](../static/img/basics/seq_swap2.gif)
Probablemente el uso más común de este operador es intercambiar dos imágenes antes de que sean usadas por un operador de capas de imagen como "[-composite](https://imagemagick.org/command-line-options/#composite)", "[-flatten](https://imagemagick.org/command-line-options/#flatten)", "[-append](https://imagemagick.org/command-line-options/#append)" o "[-fx](https://imagemagick.org/command-line-options/#fx)". |
magick tree.gif frame.gif +swap \
-gravity center -composite framed_tree.gif
![[Salida de IM]](../static/img/basics/framed_tree.gif)
A partir de IM v6.4, un "[-swap](https://imagemagick.org/command-line-options/#swap)" con un solo número intercambiará la última imagen con el número dado. Es decir, "-swap 1" es equivalente a un "-swap 1,-1". |
magick font_[0-3].gif -swap 1 +append seq_swap3.gif
-reverse
El operador "[-reverse](https://imagemagick.org/command-line-options/#reverse)" (añadido en IM v6.3.4) simplemente invertirá el orden de toda la lista de imágenes. |
magick font_[0-3].gif -reverse +append seq_reverse.gif
![[Salida de IM]](../static/img/basics/seq_reverse.gif)
Es básicamente un Operador Swap definitivo.
-clone {index_range_list}
Este operador de lista de imágenes es un poco diferente. Dado un número de lista de imágenes, "[-clone](https://imagemagick.org/command-line-options/#clone)" hará una copia de una imagen que ha sido guardada por el operador 'corchete de apertura' o 'paréntesis'. Es decir...
Clone solo debe usarse dentro de paréntesis
La razón de esto es que te permite extraer una copia de una imagen de la última lista de imágenes guardada (empujada), para poder procesarla más. Por ejemplo. |
magick font_[0-2].gif \( -clone 1 -rotate 90 \) +append seq_clone.gif
![[Salida de IM]](../static/img/basics/seq_clone.gif)
La forma 'más' sin argumento "+clone" simplemente hará una copia de la última imagen de la lista de imágenes guardada (empujada) para que puedas procesarla más |
magick font_[0-2].gif \( +clone -flip \) +append seq_clone2.gif
![[Salida de IM]](../static/img/basics/seq_clone2.gif)
A partir del lanzamiento de la versión 6.2.2, el operador "[-clone](https://imagemagick.org/command-line-options/#clone)" tomará una lista de imágenes separadas por comas, o un rango de índices de la forma '_{index}-{index}_'. |
magick font_[0-2].gif \( -clone 1-2 \) +append seq_clone_range.gif
![[Salida de IM]](../static/img/basics/seq_clone_range.gif)
Por supuesto, los índices negativos siguen comportándose tal como esperarías. Por ejemplo, para duplicar toda la lista de imágenes puedes especificarla usando los números '0' (primera imagen) y '-1' (última imagen), es decir, usando el rango '0--1'. Puede parecer extraño, pero tiene sentido y funciona bien. |
magick font_[0-2].gif \( -clone 0--1 \) +append seq_clone_all.gif
![[Salida de IM]](../static/img/basics/seq_clone_all.gif)
Cuando usas una lista de índices separados por comas, las imágenes se extraen en el orden que especifiques. |
magick font_[0-2].gif \( -clone 2,0,1 \) +append seq_clone_list.gif
![[Salida de IM]](../static/img/basics/seq_clone_list.gif)
Si las imágenes de un rango están invertidas (después de que los índices negativos se conviertan en un índice de imagen real), las imágenes extraídas también se invierten, como parte del proceso. |
magick font_[0-2].gif \( -clone 2-0 \) +append seq_clone_reversed.gif
El Operador de imagen Clone puede usarse sin paréntesis, y simplemente copiará imágenes de la lista de imágenes actual y las añadirá directamente. Sin embargo, este no es su uso previsto y debe desaconsejarse, ya que producirá un resultado diferente si más tarde rodeas ese conjunto de operaciones con paréntesis. Además, en los ejemplos anteriores estoy generando clones y añadiéndolos a la lista de imágenes actual, para demostrar el operador. En realidad, debería usar el Operador de imagen Duplicate para duplicar imágenes en la lista de imágenes actual. Tú también deberías hacerlo, ya que dejará más claro lo que estás intentando hacer. El Registro de memoria de imagen MPR: también puede usarse para clonar imágenes y estaba disponible en IM v5. En realidad sigue siendo un método útil para clonar y almacenar toda una lista de imágenes (de longitud desconocida) para usarla más tarde, y no solo una sola imagen individual como hacen los operadores de lista de imágenes anteriores.
-duplicate {count}[,{index_range}]
Puedes usar "[-duplicate](https://imagemagick.org/command-line-options/#duplicate)" para generar copias extra (clones) de una imagen, a partir de la lista de imágenes actual (añadido en IM v6.6.8-7). Las nuevas imágenes se añaden al final de la lista. A diferencia del anterior (y más antiguo) Operador Clone, no requiere el uso de paréntesis. Por ejemplo, para hacer N copias extra de una imagen (hasta un total de N+1) puedes hacer esto... |
magick font_5.gif -duplicate 4 +append seq_duplicate.gif
![[Salida de IM]](../static/img/basics/seq_duplicate.gif)
Ten en cuenta que este operador puede generar cientos de imágenes muy rápidamente, sin embargo, hasta que las imágenes se procesan, las imágenes son simplemente 'clones' unas de otras, compartiendo los datos de imagen reales entre ellas. Por ello, las imágenes duplicadas son muy eficientes en memoria. Si hay más de una imagen presente, la última imagen se duplica N veces... |
magick font_[0-1].gif -duplicate 3 +append seq_dup_n.gif
![[Salida de IM]](../static/img/basics/seq_dup_n.gif)
Si solo quieres duplicar la última imagen una vez, puedes usar la forma 'más' del argumento. |
magick font_[0-3].gif +duplicate +append seq_dup_last.gif
![[Salida de IM]](../static/img/basics/seq_dup_last.gif)
Si quieres seleccionar una imagen en particular para duplicarla varias veces, puedes especificar el índice de la imagen como segundo argumento. |
magick font_[0-2].gif -duplicate 2,0 +append seq_dup_index.gif
![[Salida de IM]](../static/img/basics/seq_dup_index.gif)
La parte de índice del argumento puede contener una lista o rango de índices de imagen a duplicar N veces. Por ejemplo, duplicar toda la lista dos veces para crear tres veces el número original de imágenes...
magick font_[0-4].gif -duplicate 2,0--1 +append seq_dup_list.gif
Una lista de animación de tipo Ciclo de patrulla también es fácil de crear usando una lista de imágenes que está invertida. |
magick font_[0-9].gif -duplicate 1,-2-1 \
-set delay 50 -set dispose previous -loop 0 seq_reverse_anim.gif
![[Salida de IM]](../static/img/basics/seq_reverse_anim.gif)
Ten en cuenta que no copié toda la lista de imágenes, sino que omití copiar la primera (0) y la última (-1) imagen, haciendo que los índices de imagen fueran de -2 a 1. Si tu versión de IM es anterior a la v6.6.8-7, aún puedes generar imágenes duplicadas con el Operador de imagen Clone, pero solo un conjunto de imágenes a la vez. O usando una técnica que básicamente hace mal uso del Operador Color Morph, generar múltiples imágenes duplicadas. El truco consiste en hacer primero un clon para generar dos imágenes idénticas, luego usar "[-morph](https://imagemagick.org/command-line-options/#morph)" para generar las últimas N-2 imágenes entre ellas. |
magick font_7.gif \( +clone \) -morph 3 +append seq_dup_morph.gif
![[Salida de IM]](../static/img/basics/seq_dup_morph.gif)
Ten en cuenta, sin embargo, que al hacer mal uso del Operador Color Morph, las imágenes se están procesando realmente, por lo que a morph le toma tiempo procesar realmente las imágenes (sin producir ningún cambio). Además, las imágenes creadas contendrán copias reales de los datos originales, y no clones simples que ahorran memoria.
Combinar operaciones de secuencia de imágenes
Usando estos operadores, puedes extraer una copia de una imagen específica, modificarla, y devolver esa imagen al lugar de donde la sacaste. Por ejemplo, aquí hago un "[-clone](https://imagemagick.org/command-line-options/#clone)" de la 2.ª imagen (índice de imagen '1'), roto los colores de las imágenes de azul a rojo, luego reemplazo la imagen original con la modificada, primero haciéndole "[-delete](https://imagemagick.org/command-line-options/#delete)" y luego "[-insert](https://imagemagick.org/command-line-options/#insert)" de la nueva. |
magick font_[0-3].gif \( -clone 1 -modulate 100,100,166 \) \
-delete 1 -insert 1 +append seq_update_1.gif
![[Salida de IM]](../static/img/basics/seq_update_1.gif)
Otra forma que parece haberse vuelto más común es usar "[-swap](https://imagemagick.org/command-line-options/#swap)" para reemplazar la imagen original, y luego "[+delete](https://imagemagick.org/command-line-options/#delete)" la imagen antigua que ahora está al final. Esto solo requiere que des la posición de la imagen dos veces, en lugar de tres. Una para clonar, y otra para reemplazar la imagen modificada. |
magick font_[0-3].gif \( -clone 2 -modulate 100,100,166 \) \
-swap 2 +delete +append seq_update_2.gif
![[Salida de IM]](../static/img/basics/seq_update_2.gif)
Estas técnicas continúan más abajo en la siguiente sección sobre Procesamiento y depuración de imágenes complejas.
Procesamiento y depuración de imágenes complejas
Gracias a la adición de los Operadores de secuencia de imágenes (ver más arriba), ya no necesitas procesar las imágenes un paso a la vez, guardando la imagen y releyéndola cada vez. En su lugar, ahora puedes simplemente mantener la imagen intermedia en memoria y seguir procesándola. Esto ahorra mucho tiempo, tanto en la conversión de imágenes a un formato de archivo como en la E/S real de guardar la imagen en el lento disco. Este tipo de comandos de procesamiento de imágenes pueden volverse muy largos y complejos. Por ello, es mejor escribir el comando en scripts, e intentar colocar cada operación importante en una línea por sí misma para una programación y edición más fáciles. Consulta Consejos para mejores scripts de shell/PHP de ImageMagick. Por ejemplo, aquí recorro toda una secuencia de procesamiento compleja para generar un botón rojo sobre un fondo negro. |
magick -size 30x30 xc:black -fill white -draw 'circle 15,15 5,15' \
\( +clone -shade 110x90 -normalize -negate -alpha Off \) \
\( +clone -clone -2 -compose Plus -composite \) \
\( -clone 0 -shade 110x50 -normalize -alpha Off \) \
\( +clone -gamma 1,0,0 \) \
\( -clone 2,-1 -compose Multiply -composite \) \
-append seq_process_fx.gif
![[Salida de IM]](../static/img/basics/seq_process_fx.gif)
Cada línea del comando magick genera una nueva imagen, excepto la última línea, donde simplemente Uní (append) todas las imágenes de trabajo para producir los resultados de todos los pasos de procesamiento, en lugar de solo la imagen final. Esta técnica te permite seguir lo que produjo cada paso (envuelto en paréntesis) del comando muy complejo, y permite una depuración más fácil de cada paso de un proceso. Observa cómo solo usa el tamaño y la forma de la imagen inicial para generar la forma inicial del botón, así que eres libre de usar cualquier forma o imagen que quieras. El resto del comando la procesará igual que antes. Por supuesto, normalmente Eliminarías (Delete) todas las imágenes de trabajo temporales. Es decir, reemplazaría la última línea del comando anterior con algo como esto...
-delete 0--2 seq_process_result.gif
Otra forma de comprobar los resultados es canalizar el resultado al comando display, para ver los resultados en pantalla, en lugar de guardarlo en un archivo de imagen. Es decir, usa algo como esto para la última línea...
+append miff:- | display -
Alternativamente, en lugar de "[display](#display)" puedes usar 'show:', que mostrará la imagen resultante en pantalla, y luego permitirá que el comando original continúe o salga. Consulta Show, salida de imagen en pantalla para más información.
+append show:
En realidad, ni siquiera necesitas el "[+append](https://imagemagick.org/command-line-options/#append)", en cuyo caso IM mostrará cada imagen en secuencia, presionando la 'barra espaciadora'. Incluso puedes ponerte más sofisticado usando el comando "[montage](#montage)" para ver los resultados de una manera más agradable...
miff:- | montage - -bordercolor blue -border 1 -geometry +2+2 show:
Este tipo de procesamiento de imágenes también permite ver fácilmente las imágenes intermedias, inmediatamente después de que la imagen ha sido creada. Básicamente, puedes insertar líneas como esta entre las sentencias "\( ... \)".
\( +clone -write show: +delete \)\
IM continuará automáticamente el procesamiento una vez que esa imagen intermedia haya sido producida para fines de visualización. Consulta Show, salida de imagen en pantalla. Alternativamente, insertando esta línea en su lugar, puedes mostrar todas las imágenes actuales generadas hasta ese punto del procesamiento...
\( -clone 0--1 -append -write show: +delete \)\
Después de que hayas depurado y afinado los pasos de procesamiento de imágenes, puedes optimizar el código, de modo que no uses tantos pasos de paréntesis, así como menos Imágenes clonadas, resultando en menos imágenes intermedias que Eliminar (Delete) al final. Recuerda también que la "Composición de imágenes", y/o el "Aplanado de capas (Layer Flattening)", fusionan múltiples imágenes para dejar solo una imagen resultante, lo que puede reducir el número total de imágenes intermedias en memoria. |
magick -font Ravie -pointsize 48 -background black -fill white \
label:'IM' -bordercolor black -border 5 seq_label.gif
magick seq_label.gif -alpha Off \
\( +clone -shade 110x90 -normalize -negate \
+clone -compose Plus -composite \) \
\( -clone 0 -shade 110x50 -normalize -gamma 1,0,0 -alpha Set \) \
-delete 0 +swap -compose Multiply -composite seq_button.gif
![[Salida de IM]](../static/img/basics/seq_button.gif)
La capacidad de ImageMagick de procesar cualquier imagen de una manera estándar, programada y automatizada, usando múltiples pasos todos en un mismo comando, es lo que hace de IM una herramienta tan potente. Puedes escribir en script una operación muy compleja, y luego aplicarla a muchas imágenes. Los operadores de lista de imágenes y los paréntesis simplemente hicieron a IM un orden de magnitud más potente, permitiéndote escribir programas de manipulación de imágenes más complejos, con menos comandos. Para otro ejemplo de cómo combinar en un script un proceso de imágenes complejo, consulta el ejemplo Viñetas 3D mediante script a partir de formas. Consulta también Consejos para mejores scripts de shell/PHP de ImageMagick, sobre formas de mejorar tu scripting de procesamiento de imágenes, tanto para una edición y comprensión más fáciles, como para que otros puedan seguir lo que has hecho.
Metadatos de imagen: atributos, propiedades y artefactos
Hasta ahora hemos mirado las imágenes y el contenido o los datos reales que componen la imagen. Pero las imágenes son más que solo 'datos de imagen'. Hay muchos atributos o metadatos que también son parte de una imagen, y que afectan a su procesamiento y a cómo otros programas deberían manejar la imagen. Por ejemplo, una imagen podría tener un 'desplazamiento' o ser parte de un 'lienzo virtual' (página) más grande. Es decir, una sola imagen puede ser solo una pequeña parte de una imagen más grande, compuesta por una serie de otras imágenes, para formar 'capas' o una 'animación'. IM también adjunta muchos 'ajustes' especiales que son usados por muchos operadores de procesamiento de imágenes para modificar cómo funcionan. Por ejemplo, el 'color de fondo' a usar. Algunos de estos son ajustes globales, que son los mismos en toda una lista de imágenes, mientras que otros pueden ser diferentes para cada imagen dentro de la lista. Entonces, ¿qué tipo de cosas también son parte de una imagen? Muchas cosas...
- Metadatos de imagen que normalmente (aunque no siempre) se guardan con la imagen en los formatos de archivo de imagen. Por ejemplo: perfiles, etiquetas, leyendas y comentarios, e información de lienzo virtual (página). Todos estos son ajustes por imagen, y pueden ser diferentes para cada imagen de la lista de imágenes actual.
- Ajustes globales usados por muchos operadores de procesamiento de imágenes diferentes, pero generalmente no guardados con la imagen: colores como el de fondo, el de borde, el de relleno y el de matte, también la fuente y el tamaño de punto, la gravedad, el método de composición, el manejo de canales de color, la profundidad de bits de lectura/escritura de los valores de color.
- Ajustes y defines de experto, usados para controlar la operación más profunda y de bajo nivel de operadores de procesamiento de imágenes específicos. Por ejemplo: viewport de distorsión, argumentos especiales del método de composición,
- Cómo se va a almacenar realmente la imagen en memoria dentro de ImageMagick: por ejemplo como RGB o CMYK. Si un canal alfa está presente y habilitado o no, también la paleta que una imagen pudiera haber tenido al ser leída. Sin embargo, algunos de estos ajustes de almacenamiento están codificados de forma fija en tiempo de compilación (como la calidad de los valores de color en memoria).
- Algunos ajustes operacionales generales de IM, como los ajustes de depuración o verbose, que normalmente controlan la salida de información o el manejo de errores.
Es decir, mucha información que puede guardarse, y/o afectar cómo se procesan las imágenes. Y aunque pueden caer en varios grupos, lo bien que ImageMagick maneja cada una de estas cosas, y si son globales o específicas de la imagen, depende mucho de la cosa específica involucrada. Sí, estoy siendo vago, porque hasta que llegas a los detalles concretos es muy difícil no serlo. También puede ser muy confuso. Todos estos valores se almacenan con las imágenes en memoria de tres maneras diferentes...
- Atributos
- Estos se almacenan como elementos especiales de la estructura de datos para cada imagen, generalmente para permitir un acceso rápido y directo por parte de los diversos operadores de procesamiento de imágenes. Por ejemplo: tamaño de imagen, geometría del lienzo virtual, colores de fondo, relleno, trazo, matte, tamaño de punto, densidad, fuente, composición, interpolación, método de píxel virtual, bloques de perfil, ajustes de retardo de tiempo y de eliminación (disposal); y muchas más cosas. Ten en cuenta que algunos de estos son 'específicos' de cada imagen, mientras que otros se tratan como un ajuste 'global' que se establece al mismo valor en todas las imágenes mediante la interfaz CLI, aunque siguen almacenándose como parte de cada imagen individual. Los atributos se modifican normalmente usando las muchas opciones, como parte del procesamiento normal de imágenes, o más generalmente usando Set.
- Propiedades
- Estas son un conjunto de forma libre de cadenas clave-valor que se adjuntan a cada imagen de forma individual. Cada imagen puede tener un conjunto de cadenas completamente diferente. Esencialmente son elementos de metadatos que no necesitan ser accedidos o decodificados regularmente, o que se usan de alguna manera especial. Ejemplos típicos de esto son: cadenas de etiqueta, leyenda y comentario; fechas de creación y modificación; cadenas definidas por el usuario; resultados de algunos operadores. Los usuarios pueden usar Set para establecer o cambiar estas, siempre que la 'clave' no corresponda a algún 'atributo' conocido.
- Artefactos
- Este es un conjunto global de cadenas de forma libre que es común a todas las imágenes. Se usa para guardar ajustes globales de forma libre que definen o modifican la lectura y el procesamiento de todas las imágenes. Un ejemplo de esto es el ajuste "
verbose" que hace que algunas operaciones produzcan información general sobre sus acciones, incluyendo una salida de magick identify más detallada. Los usuarios pueden modificar estos valores globales usando Define (ver más abajo), o con un caso especial de Set, (consulta Usar Set "Option:" para definir un artefacto).
Comprender estos tres métodos de almacenamiento es la clave para saber cómo funciona el manejo de ajustes y metadatos dentro de ImageMagick. Y te permite hacer algunas técnicas de procesamiento de imágenes muy avanzadas y normalmente difíciles de lograr.
Establecer/Cambiar atributos/propiedades de imagen
Los metadatos simples son atributos de imagen que a menudo tienen la mayor importancia para el procesamiento de imágenes. Tan importante que se decodifican y se hacen disponibles en la estructura de datos de la imagen para permitir un uso rápido por parte de los operadores de procesamiento de imágenes. Tales datos generalmente se modifican de dos maneras. Un cambio directo de los metadatos de la imagen a medida que esta se lee o se crea. O como una modificación de los metadatos de una imagen que ya está en memoria. Por ejemplo, "-label 'string'" establecerá el comentario en cada imagen que se lea o se cree después de que ese ajuste haya sido establecido. Sin embargo, "-set label 'string'" cambiará los metadatos de 'etiqueta' de todas las imágenes de la lista de imágenes actual, que ya están en memoria. La razón de los dos métodos se debe a la compatibilidad histórica hacia atrás y a la conveniencia. Básicamente, "-label" se ha establecido tradicionalmente ANTES de que la imagen a la que se aplica haya sido leída. Solo afecta a las imágenes que se leen (o se crean) después de que haya sido establecido, o cambiado. Por ejemplo....
magick -label one image_one.png \
-label two image_two.png output_image_list
Por otro lado, el operador "[-set](https://imagemagick.org/command-line-options/#set)" cambia TODAS las imágenes que están en la lista de imágenes actual, incluyendo las leídas previamente. Por ello, generalmente debes usar paréntesis para limitar a qué imagen estás aplicando la opción, a menos que quieras aplicarla a TODAS las imágenes leídas hasta ese momento.
magick \( image_one.png -set label one \) \
\( image_two.png -set label two \) output_image_list
Puedes anular la definición del ajuste usando "+label", en cuyo caso los metadatos de etiqueta se dejarán intactos a medida que se lee o se crea la imagen. Si la imagen leída tampoco tiene una etiqueta, IM recurrirá a algún valor por defecto lógico. Para la etiqueta, ese es simplemente la cadena vacía. Puedes ver ejemplos más detallados y específicos de ambos métodos en Etiquetado de imágenes con Montage, que hace un uso intensivo de esto con fines de etiquetado. Esta 'dualidad' de establecer metadatos de imagen también existe para otras opciones. Esto incluye... "[-comment](https://imagemagick.org/command-line-options/#comment)", "[-caption](https://imagemagick.org/command-line-options/#comment)", "[-page](https://imagemagick.org/command-line-options/#page)", "[-dispose](https://imagemagick.org/command-line-options/#dispose)" y "[-delay](https://imagemagick.org/command-line-options/#delay)". El ajuste del tamaño del lienzo virtual y del desplazamiento de la imagen (página), sin embargo, también tiene un tercer método, usando un operador especial "[-repage](https://imagemagick.org/command-line-options/#repage)" (consulta Lienzo virtual más abajo).
Por ejemplo, aquí uso todos los métodos de ajuste disponibles para establecer el 'desplazamiento del lienzo virtual' o 'página' de las imágenes individuales, mientras creo una Animación a partir de ellas... |
magick -delay 100 -dispose Background \
-page 100x100+5+10 eye.gif \
-page +35+30 news.gif \
\( storm.gif -set page +62+50 \) \
\( tree.gif -repage +10+55 \) \
-loop 0 animation_page.gif
![[Salida de IM]](../static/img/basics/animation_page.gif)
Como puedes ver, el método tradicional (no-set) es más simple al crear una lista de múltiples imágenes a partir de archivos de imagen separados. Pero los operadores "[-set](https://imagemagick.org/command-line-options/#set)" o el especializado "[-repage](https://imagemagick.org/command-line-options/#repage)" son mejores cuando necesitas cambiar una imagen que ya ha sido leída en memoria, o que fue creada por algún método de procesamiento de imágenes complejo. Por ejemplo, para cambiar el desplazamiento de la imagen de la tercera imagen (índice de imagen '2', o el 'árbol') en el último ejemplo... |
magick animation_page.gif \
\( -clone 2 -set page +55+10 \) -swap 2 +delete \
animation_mod.gif
![[Salida de IM]](../static/img/basics/animation_mod.gif)
Para un ejemplo más extremo de extracción y modificación de imágenes individuales en una lista de imágenes, consulta Modificación cuadro a cuadro de una animación. Aquí hay otro ejemplo usando "[-set](https://imagemagick.org/command-line-options/#set)" para especificar un comentario en todas las imágenes, y luego modificar una imagen específica.
magick xc: -duplicate 9 \
-set comment 'T minus %[fx:n-t]' \
\( -clone 7 -set comment 'We have ignition!' \) -swap 7 +delete \
-format "image #%p : %c" info:
Puedes usar "[mpr:](files.html#mpr)" como una forma alternativa de establecer atributos en imágenes en memoria. Por ejemplo, aquí tomamos una imagen con un comentario 'Malo', que está en memoria, y reemplazamos el comentario con uno 'Bueno'...
magick -comment 'Bad Comment' rose: \
-write mpr:rose +delete \
-comment Good mpr:rose rose.jpg
magick identify -format "image comment = %c" rose.jpg
Esto funciona, pero es extremadamente engorroso y doloroso de usar, especialmente al tratar con múltiples imágenes como una animación. De hecho, esta es la única forma de cambiar los metadatos en las imágenes en IM versión 5. (¡Puaj!)
Atributos globales generales
En construcción
La mayoría de estos atributos generalmente se establecen globalmente, ya sea antes o después
de leer las imágenes en memoria (no hay diferencia). Normalmente se usan
como un control general de las operaciones de procesamiento de imágenes posteriores.
* Muchos ajustes simplemente se guardan globalmente para usarse según se necesite
-fill -background -bordercolor -strokecolor -mattecolor -quantize
+dither -channels -size -gravity -units -density -font -pointsize
-tile
* Algunos ajustes afectan a la forma en que una imagen se guarda en disco, o a los metadatos
guardados con la imagen. Esto incluye
-loop -compression -quality -depth
-density -background
* -compose es complicado, ya que solo puede establecerse globalmente. Pero si no se establece,
entonces las imágenes individuales pueden tener un ajuste diferente (para las capas).
Sin embargo, la mayoría de estos pueden desactivarse (usando una versión con +), lo que
hace que el operador recupere el ajuste de los metadatos de la imagen
(p. ej.: +background recurre a los metadatos de la imagen original si está presente)
pero más generalmente recurre a algún valor por defecto. (p. ej.:
+gravity recurre a 'None' para indicar que no se ha establecido ninguna gravedad).
Algunos de estos también se guardan con las imágenes cuando se escriben. Específicamente
el formato GIF guardará el -background y el -bordercolor como parte de los
atributos de la imagen, sin embargo, estos normalmente son ignorados por los programas que
leen estas imágenes.
Puede que hayas notado que algunos ajustes se usan en varios lugares.
por ejemplo -density
* usado al leer muchos formatos de imagen vectoriales como
los formatos de imagen Postscript, PDF y WMF.
* también en generadores de imagen especiales como label: caption: y text:
* usado como parte del dibujo de fuentes en los operadores -annotate -draw y -polaroid.
* Y finalmente, algunos formatos guardan la densidad o resolución como parte
del formato de archivo de imagen. Por ejemplo, imágenes ráster envueltas en
postscript, JPEG y TIFF.
¿Es de extrañar entonces por qué los ajustes pueden ser tan confusos?
Lienzo virtual, y los operadores Page y Repage
| El propósito principal de los ajustes de 'página' o 'lienzo virtual' dentro de IM es definir cómo la parte 'real' de una imagen (la parte que realmente contiene datos de píxeles de color) encaja en un contexto más grande de un 'lienzo'. Esto es especialmente importante cuando hay múltiples imágenes involucradas que necesitan posicionarse unas respecto a otras para Capas de múltiples imágenes y en Animaciones GIF. También se usa (y de ahí su nombre del término 'página') para definir dónde encaja una imagen en una pieza física más grande de papel o 'página', en Postscript o al generar la imagen de una 'página' de Texto. Aunque se usa más a menudo para Capas de múltiples imágenes y en Animaciones GIF, también está involucrado en recordar las posiciones originales de las imágenes al Recortar (Cropping) y Recortar bordes (Trimming) imágenes, así como en la Composición de lista multi-imagen, y en las Distorsiones generales de imágenes. Ahora bien, la 'página' define dos partes separadas: un 'lienzo virtual' o área, que define un espacio más grande en el que existe la imagen, y el 'desplazamiento' o ubicación dentro de ese 'lienzo' donde se posiciona la imagen real. | Aunque se permiten 'desplazamientos' negativos, el 'tamaño del lienzo' está limitado a un área desde 0,0 hasta el ancho y alto dados. Es decir, solo se puede especificar un lienzo positivo. |
|---|---|
Estos dos aspectos, 'tamaño' y 'desplazamiento', están estrechamente relacionados, pero normalmente quieres manejar estos aspectos por separado, o de una manera más controlada. Así que además de los métodos normales "[-page](https://imagemagick.org/command-line-options/#page)" y "[-set](https://imagemagick.org/command-line-options/#page) page", también se ha proporcionado una opción separada "[-repage](https://imagemagick.org/command-line-options/#repage)" para permitir un control más fino. Específicamente... |
- +repage
- Sin argumentos, restablecerá el lienzo virtual de la imagen a la imagen real en sí. Es decir, simplemente borra cualquier información de lienzo virtual que la imagen pueda tener. Esto a menudo es importante después de aplicar los operadores de subdivisión de imágenes tales como Recortar (Cropping) y Recortar bordes (Trimming). Es especialmente importante eliminar el tamaño y los desplazamientos del lienzo virtual antes de guardar en los formatos de archivo de imagen GIF o PNG, ya que muchos navegadores usan la información de lienzo/desplazamiento como parte de la visualización de la imagen.
- -repage WxH
- Cambia el tamaño del lienzo virtual de las imágenes existentes, pero no restablece la posición de la imagen en ese lienzo. Ten en cuenta que suministrar este argumento a "
[-page](https://imagemagick.org/command-line-options/#page)" o "[-set](https://imagemagick.org/command-line-options/#set) page" restablecerá la ubicación de las imágenes a '+0+0', lo cual probablemente no se desea.. - -repage +X+Y
- Simplemente mueve la imagen en el lienzo virtual a esta ubicación absoluta sin cambiar el tamaño del lienzo de la imagen.
- -repage +X+Y\!
- Hace un movimiento relativo de la imagen en el lienzo virtual sumando los números dados (positivos o negativos) a la posición de desplazamiento existente de la imagen.
- -repage 0x0
- Intenta encontrar el mejor tamaño de lienzo virtual que contenga toda la imagen. Sin embargo, esto fallará para imágenes con un desplazamiento negativo, ya que no hay forma de especificar un lienzo virtual con componentes negativos. Para evitar problemas, usará el tamaño de la imagen real como el tamaño de lienzo más pequeño posible. Es decir, nunca asignará un lienzo virtual con dimensiones cero.
- -repage 0x0+X+Y
- Mueve el desplazamiento de las imágenes, luego redimensiona el lienzo virtual para que encaje mejor con la nueva ubicación de las imágenes.
- -repage 0x0+0+0
- Equivalente a un "
[+repage](https://imagemagick.org/command-line-options/#repage)" o "[+set](https://imagemagick.org/command-line-options/#set) page" o un "[-set](https://imagemagick.org/command-line-options/#set) page 0x0". Toda la información de lienzo virtual y desplazamiento se elimina. - -repage WxH+X+Y
- Equivalente a un "
[-set](https://imagemagick.org/command-line-options/#set) page WxH+X+Y". Es decir, simplemente asigna los valores dados directamente.
Ten en cuenta que el uso de una bandera '!' hará que el desplazamiento dado sea un desplazamiento relativo al desplazamiento actual de la imagen. Es decir, un '-repage +5+0\!' moverá el desplazamiento de las imágenes 5 píxeles a la derecha, sin modificar el tamaño del lienzo virtual. Actualmente no es posible especificar directamente un redimensionamiento relativo del tamaño del lienzo virtual. Sin embargo, se puede hacer usando Escapes de porcentaje FX. Pero esto no se necesita comúnmente. Se da un ejemplo en Recortar bordes con un color específico. Se requiere precaución al dar a una imagen una posición de desplazamiento final negativa, ya que el formato de archivo GIF no puede manejar esto, y lo restablece a cero si es negativo. Además, algunos navegadores se vuelven locos cuando se les dan imágenes PNG con desplazamientos negativos. Qué información de lienzo virtual se guarda con una imagen depende del formato. JPEG |
Como muchos formatos de archivo de imagen, las imágenes JPEG no guardan ninguna información de lienzo virtual en absoluto. La información simplemente se ignora y se pierde. |
|---|---|
| GIF | El tamaño del lienzo virtual y los desplazamientos se guardarán como parte de su manejo de animación GIF. Sin embargo, no manejará desplazamientos negativos. Cualquier desplazamiento negativo se restablecerá a cero al guardar. |
| PNG | Los desplazamientos e incluso los desplazamientos negativos se guardan, pero el formato de archivo PNG normalmente no guarda la información del lienzo virtual. Sin embargo, las imágenes PNG guardadas por IM incluirán la información del tamaño del lienzo virtual, pero solo es usada por otros comandos de IM. Si IM lee una imagen PNG sin este atributo específico de IM, establecerá el lienzo virtual de la imagen a un tamaño apropiado para asegurar que la imagen sea visible en el lienzo virtual (como con un "-repage 0x0"). Para imágenes sin un desplazamiento, eso significa que el lienzo virtual tiene el mismo tamaño que la imagen real. |
Algunos formatos como GIF y PNG guardan información de lienzo virtual, otros como JPEG no. Todos los formatos anteriores tienen sus propias limitaciones para la información de lienzo virtual. Solo el formato de archivo interno MIFF no tiene tales limitaciones. Ten en cuenta que "[-page](https://imagemagick.org/command-line-options/#page)" tiene un significado especial para los operadores generadores de imagen "text:" y "ps:" (consulta Text: archivos de texto multilínea y PS: texto y gráficos con formato Postscript). Por ello, su significado normal de tamaño de lienzo y desplazamiento no se usa durante la creación de estas imágenes. |
Set y propiedades por imagen
Sin embargo, IM no puede crear una opción para manejar cada posible ajuste que una imagen pueda tener. Eso sería simplemente imposible. No solo eso, sino que a los usuarios a menudo les gusta añadir o definir sus propios ajustes. Por esto, la opción "[-set](https://imagemagick.org/command-line-options/#set)" puede en realidad definir CUALQUIER ajuste con CUALQUIER valor. Si el ajuste no es un atributo específicamente conocido de una imagen (que se guarda de una manera que permite un acceso rápido por parte de los operadores), se guarda en la imagen como una 'Propiedad' (un arreglo de cadenas), y se listará cerca del final de una salida verbose de "magick identify", o se recuperará y expandirá usando Escapes de porcentaje. La imagen rose incorporada, por ejemplo, genera automáticamente tres 'propiedades': dos cadenas de fecha, y un 'hash de firma'. A esto también le he añadido mi propio ajuste de 'propiedad' definido por el usuario.
magick rose: -set my_property my_value -verbose info: |\
sed -n '/Artifacts/q; /Properties/,$ p'
Algunos operadores de procesamiento de imágenes incluso devuelven valores de especial interés como 'propiedades' de imagen. No son necesarios para otros operadores, por lo que no se almacenan como un 'atributo', sino que se guardan como una cadena de 'propiedad' para su posible uso por parte del usuario. Por ejemplo, el tamaño de punto final seleccionado por una Etiqueta de mejor ajuste se guardará como una propiedad de imagen especial. |
magick -size 100x label:Anthony -verbose -identify property_label.gif |\
sed -n '/Artifacts/q; /Properties/,$ p'
| Ten en cuenta que el propio generador label: también establece un atributo 'label', que resulta guardarse como una cadena de propiedad.
---|---
| _Todas las 'propiedades' se guardan como un tipo de dato de cadena de forma libre, y se almacenan como metadatos de imagen.
Por esto, no todos los 'atributos' se guardan como 'propiedades', ya que muchos atributos necesitan guardarse y usarse directamente como datos numéricos por parte de los operadores de procesamiento de imágenes. Un ejemplo de esto es el atributo de 'página' del lienzo virtual._
---|---
Aquí uso un ajuste "[-format](https://imagemagick.org/command-line-options/#format)" de identify para hacer que IM produzca el tamaño de punto de la etiqueta que creó y descartó. |
magick -size 100x label:Anthony \
-format 'pointsize = %[label:pointsize]pts' info:
![[Salida de IM]](../static/img/basics/property_pointsize.txt.gif)
Usar esta información para generar una nueva imagen de etiqueta es complicado y se examinará más abajo. Uno de los ajustes definidos por el usuario más útiles que puedes usar es el ajuste "filename:". Por ejemplo...
magick rose: -set filename:my_area '%wx%h' 'rose-%[filename:my_area].png'
Lo anterior generará una imagen llamada "rose-70x46.png". Solo los ajustes definidos por el usuario prefijados con la cadena "filename:" pueden usarse dentro del nombre de archivo de salida, como medida de seguridad, aunque puede usarse cualquier nombre. Para más ejemplos de esto, consulta Escapes de porcentaje de nombre de archivo.
Define y artefactos globales
Los valores definidos se conocen como 'Artefactos' y se definen globalmente en todas las imágenes, y se establecen usando el operador especial "[-define](https://imagemagick.org/command-line-options/#define)". El propósito principal de tales 'Artefactos' es servir como ajustes especiales que pueden usarse como ajustes adicionales (o fuera de banda) por parte de los Codificadores de formato de archivo de imagen o los Operadores de procesamiento de imágenes. Básicamente, permite la adición de ajustes de forma libre para requisitos específicos sin necesidad de crear otro 'atributo'. Además, al establecerse globalmente, no se adjuntan a imágenes específicas, sino a todas las imágenes de una secuencia de imágenes, y están disponibles cuando aún no se ha leído ni creado ninguna imagen. |
Ten en cuenta que las API pueden tener múltiples listas de imágenes, con diferentes conjuntos de 'artefactos' adjuntos, pero la interfaz de línea de comandos (CLI) solo tiene una lista de imágenes activa, por lo que los 'artefactos' realmente son globales. |
|---|---|
| En otras palabras, los 'artefactos definidos' proporcionan una forma para que los usuarios expertos modifiquen la operación normal o estándar de operadores específicos, más allá del uso normal de argumentos. Por ejemplo, los Ajustes del codificador JPEG, tanto para leer como para escribir tales imágenes... |
-define jpeg:size=300x200
-define jpeg:preserve-settings=1
-define jpeg:optimize-coding=true
Las Opciones de distorsión de imágenes, tales como...
-define distort:scale=2
-define distort:viewport=44x44+15+0
Los Controles de filtro de redimensionamiento, tales como
-define filter:blur=0.75
-define filter:support=1.25
Algunos defines de artefactos tienen atajos porque son usados muy regularmente por los usuarios. Por ejemplo, el control operacional "[-verbose](https://imagemagick.org/command-line-options/#verbose)" (ver más abajo) es realmente equivalente a usar "-define verbose", y por lo tanto a crear un artefacto 'verbose'. Por ejemplo...
magick xc: -verbose info: |\
sed -n '/Tainted:/q; /Artifacts:/,$ p'
De ello se desprende que la forma 'más' "[+verbose](https://imagemagick.org/command-line-options/#verbose)" simplemente elimina el artefacto 'verbose', y es por lo tanto equivalente a "+define verbose".
Artefactos y escapes de porcentaje diferidos
Los artefactos también se usan a menudo para contener atributos especiales que deben asignarse a las imágenes que se leen, después de que se haya dado el define. El ajuste "[-label](https://imagemagick.org/command-line-options/#label)" también simplemente establece un artefacto con el argumento proporcionado por el usuario. Este artefacto se convierte luego en un 'label' Ajuste o propiedad después de que una nueva imagen haya sido leída o creada. Por ejemplo, creando una imagen "rose:" con una etiqueta establecida
magick -label "%wx%h" rose: -verbose info: |\
sed -n '/Tainted:/q; /Properties:/,$ p'
Es decir, "[-label](https://imagemagick.org/command-line-options/#label)" primero definió el artefacto 'label' mostrado. Más tarde, cuando se creó la imagen rose (y su atributo de tamaño era conocido), IM convirtió ese artefacto global en una 'propiedad' específica de la imagen y solo entonces expandió cualquier Escape de porcentaje en ese momento. Esto se conoce como Escapes de porcentaje diferidos. Lo mismo ocurre con algunas otras opciones de ajuste, como "[-comment](https://imagemagick.org/command-line-options/#comment)" y "[-caption](https://imagemagick.org/command-line-options/#caption)". Es debido a los Escapes de porcentaje diferidos que "[-define](https://imagemagick.org/command-line-options/#define)" solo guardará las cadenas, mientras que el operador "[-set](https://imagemagick.org/command-line-options/#set)" hará la expansión.
Usar Set "option:" para definir un artefacto
Mostramos más arriba cómo puedes usar "[-set](https://imagemagick.org/command-line-options/#set)" para establecer Propiedades personales de propósito especial, por imagen. Por ejemplo... |
magick -size 80x40 xc: -set myinfo 'I love IM!' \
-gravity center -annotate 0x0 '%[myinfo]' \
property_annotate.gif
![[Salida de IM]](../static/img/basics/property_annotate.gif)
Pero como las Propiedades se adjuntan a imágenes específicas, no puedes usarlas en la creación de nuevas imágenes. Por ejemplo, esto fallará... |
magick rose: -set myinfo 'I love IM!' label:'== %[myinfo] ==' \
-gravity center -append property_append_fail.gif
![[Salida de IM]](../static/img/basics/property_append_fail.gif)
Como puedes ver, la propiedad 'myinfo' no fue encontrada ni incluida en la etiqueta añadida. Por otro lado, los Artefactos definidos globalmente están disponibles para los generadores de imagen. Tienen que estarlo, para que los generadores de imagen o los codificadores de archivos de imagen puedan leerlos para diversos ajustes de control. Por ello, usar un "[-define](https://imagemagick.org/command-line-options/#define)" funcionará como se espera. |
magick rose: -define myinfo='I love IM!' label:'== %[myinfo] ==' \
-gravity center -append artifact_append.gif
![[Salida de IM]](../static/img/basics/artifact_append.gif)
Entonces, ¿cómo puedes crear una etiqueta usando una propiedad o atributo de imagen? ¡La opción "[-define](https://imagemagick.org/command-line-options/#define)" actualmente no permite el uso de propiedades de imagen! El truco consiste en usar un prefijo especial "option:" al usar la opción "[-set](https://imagemagick.org/command-line-options/#set)". Esta adición hace que "[-set](https://imagemagick.org/command-line-options/#set)" defina un 'artefacto' con el nombre que sigue al prefijo. Por ejemplo, esto es equivalente al último ejemplo. |
magick rose: -set option:myinfo 'I love IM!' label:'== %[myinfo] ==' \
-gravity center -append property_option_append.gif
![[Salida de IM]](../static/img/basics/property_option_append.gif)
Más importante aún, la opción "[-set](https://imagemagick.org/command-line-options/#set)" expandirá los Escapes de porcentaje. Lo que significa que si tenemos alguna Propiedad por imagen, podemos convertirla en un Artefacto global. Por ejemplo, aquí creo una etiqueta, luego convierto la propiedad 'label:pointsize' que creó el generador de imagen "label:" en un artefacto global 'my_pointsize'. Como artefacto, esta información está disponible cuando creo una segunda imagen de etiqueta. Luego uno las dos etiquetas (con una línea 'gray' separadora). Un ejemplo muy ingenioso. |
magick -size 100x -gravity center label:Anthony \
-set option:my_pointsize '%[label:pointsize]' \
-set option:my_height '%h' \
-size 100x1 xc:gray \
-size 100x label:'at %[my_pointsize]pt and %[my_height]px high' \
-append property_append.gif
![[Salida de IM]](../static/img/basics/property_append.gif)
Observa la colocación del "-set option:..." en lo anterior. Si lo colocaras DESPUÉS de la creación del "xc:gray", sería esa imagen la que se usaría para establecer el artefacto global. Es decir, porque solo las propiedades de la última imagen definen el valor almacenado en el artefacto global. La razón es que solo la última imagen se usa para definir el artefacto. En realidad, lo que sucede es que "[-set](https://imagemagick.org/command-line-options/#set)" se aplica a cada imagen de la lista de imágenes actual, aunque esté generando un artefacto global. Por ello, cada imagen asignará sus propias propiedades al artefacto global, reemplazando los valores asignados previamente. Al terminar, solo la última imagen habrá 'definido' el artefacto. | En este momento, el 'escape FX' no tiene forma de leer propiedades o artefactos. Y por ello, actualmente no puedes hacer aritmética con tales valores.
---|---
Tipo de imagen al leer y escribir
El operador/ajuste "[-type](https://imagemagick.org/command-line-options/#type)" define el estilo o el espacio de color a usar cuando una imagen se lee o se escribe, para asegurar que la imagen resultante (en memoria, o en el archivo de imagen) sea la que esperas que sea. Como parte de esto, puede hacer algunas modificaciones de Espacio de color en el momento de la E/S de archivos, aunque solo para asegurar que la imagen esté en una forma que se esperaba. Por ejemplo, "[-type](https://imagemagick.org/command-line-options/#type)" tiene un ajuste especial 'bilevel' que puede usarse para convertir y guardar imágenes como una imagen monocromática de dos colores para algunos formatos de imagen. De forma similar, 'TrueColor' y 'TrueColorAlpha' pueden usarse para forzar que una imagen TIFF se guarde como una imagen RGB a todo color, incluso si la imagen es en realidad puramente en escala de grises. Otros ajustes incluyen 'GrayScale' y 'GrayScaleAlpha', que asegurarán que la imagen escrita sea solo en escala de grises (sin o con transparencia, respectivamente). O 'Palette' para forzar el uso de un mapa de colores indexado en los formatos que soporten esta opción. Durante la lectura de formatos de archivo de imagen, un ajuste "[-type](https://imagemagick.org/command-line-options/#type)" de 'TrueColorAlpha' forzará a una imagen JPEG que se está leyendo a tener un canal 'Alfa' añadido a su almacenamiento en memoria, aunque el propio formato JPEG no pueda manejar transparencia. Al escribir en un formato de archivo PNG, establecer un "[-type](https://imagemagick.org/command-line-options/#type)" de 'Pallette' lo forzará a usar un formato de imagen interno con índice de color "PNG8'. De forma similar, usar "BiLevel" forzará a IM a aplicar dither a las imágenes de color para convertirlas a blanco y negro para la mayoría de los formatos de archivo de imagen. Lamentablemente, el significado exacto y las capacidades de "[-type](https://imagemagick.org/command-line-options/#type)" dependen del formato de imagen específico que estés leyendo o escribiendo. Consulta las diversas áreas de ejemplos de Formatos de archivo de imagen. Para ejemplos específicos de PNG, consulta Formatos de salida PNG.
Controlar la calidad de las imágenes
Depth - Profundidad de bits del formato de archivo
Quality (calidad) y Depth (profundidad) son dos términos de los que se habla a menudo en los foros de discusión y en estas páginas de ejemplos, así que me gustaría explicarlos un poco. La Calidad es un ajuste de tiempo de compilación en ImageMagick, y se usa para determinar el tamaño de los valores usados para almacenar las imágenes en la memoria de IM y durante el procesamiento. Básicamente, significa la calidad de procesamiento para la que se compiló un IM específico. La Profundidad es el tamaño de los valores usados cuando una imagen se lee o se guarda hacia/desde un formato de archivo de imagen. Por ello, es mucho más variable, y está controlada por el ajuste "[-depth](https://imagemagick.org/command-line-options/#depth)", o por la 'profundidad' original de la imagen que se leyó. Más sobre esto en un momento. Recuerda...
La calidad es el tamaño del valor 'en memoria', y está compilada en IM.
La profundidad es el tamaño del valor del formato de archivo, y es variable.
Ahora bien, la mayoría de los formatos de imagen son de profundidad 8. Es decir, usan 8 bits (o un valor de 0 a 2^8-1) para guardar cada valor de color usado en la imagen. Es decir, un valor de 0 a 255 para el rojo, de 0 a 255 para el verde, y de 0 a 255 para el canal azul. Más comúnmente, este tipo de imagen se denomina imagen de 24 bits (es decir, "bits por píxel", NO "bits por valor" como usa el ajuste "[-depth](https://imagemagick.org/command-line-options/#depth)"). Esto incluye formatos como JPEG). Si el canal alfa también está involucrado, entonces obtienes 4 x 8 bits de valores, o una imagen de 32 bits/píxel. Esto es lo que normalmente usará una imagen PNG, aunque tales imágenes también pueden guardarse usando 16 bits por valor. Lo que mucha gente llama imágenes de 8 bits (8 bits/píxel) son realmente imágenes con una paleta o mapa de colores de 8 bits (dando un límite máximo de 256 colores en toda la imagen). Los datos de píxeles reales son un valor de índice de 8 bits (0-255) que luego se usa para buscar el color de ese píxel en la tabla de colores. Es decir, el 'ráster' (arreglo de píxeles) es solo un índice usado para buscar el color real del píxel en una tabla de colores separada. En otras palabras, aunque las imágenes de 8 bits también tienen una profundidad de 8 bits, los 8 bits son un índice en una tabla de búsqueda de color y no un color real. Las imágenes GIF son un buen ejemplo de esto. La transparencia en tales imágenes normalmente se maneja ya sea especificando un color específico como representante de la transparencia (establecido usando el ajuste de metadatos "[-transparent-color](https://imagemagick.org/command-line-options/#transparent-color)") como en el formato GIF, o usando un perfil especial para un número específico de colores en la tabla de colores (como usan algunas imágenes PNG8 (que también es una imagen con color indexado como GIF). En general...
24 bit images are : 3 x 8 bit values - 3 color channels only
32 bit images are : 4 x 8 bit values - 3 colors + Alpha channel
8 bit images are : 8 bit color indexed image, with a 256 color limit
Como la mayoría de los formatos de imagen solo guardan valores de color a una profundidad de 8 bits/valor, mucha gente ha instalado IM usando un nivel de 'Q' o calidad de profundidad 8, que requiere mucha menos memoria y procesa las imágenes más rápido que una versión Q16 más normal de IM. A menudo 3 o más veces más rápido. Estas versiones Q8 funcionan bien para el procesamiento general de imágenes (recorte, etc.) y para la conversión entre formatos, y también pueden funcionar bien para generar imágenes simples, anotar o superponer imágenes. Sin embargo, aunque un IM de baja calidad es más rápido y más eficiente en memoria, no funciona bien cuando empiezas a usar secuencias complejas de operaciones que involucran múltiples cambios de color, redimensionamiento, oscurecimiento, aclarado, corrección de color por gamma o histograma, etc.. En Q8, las imágenes intermedias en memoria permanecerán almacenadas como calidad de 8 bits, y por lo tanto múltiples operaciones introducirán cada una pequeñas distorsiones de color incrementales. El resultado puede ser efectos de redondeo, especialmente para colores extremos cercanos al blanco y al negro. (ver más abajo).
Quality - Calidad de bits en memoria
Recuerda, la Calidad es un ajuste de tiempo de compilación en ImageMagick, y se usa para determinar el tamaño de los valores usados para almacenar las imágenes en la memoria de IM y durante el procesamiento. No puede cambiarse, excepto recompilando ImageMagick desde las fuentes. Un ImageMagick 'Q16' (el valor por defecto de IMv7) usará por lo tanto al menos el doble de memoria para guardar la misma cantidad de datos de imagen que una versión 'Q8' de ImageMagick y, dependiendo de tu CPU, será mucho más lento, aunque en los procesadores de hoy en día eso no es muy probable. De forma similar, puedes compilar versiones 'Q32' y 'Q64', aunque estas no son muy comunes, y normalmente solo se usan en procesamiento de imágenes de muy alta gama. Consulta también la nueva opción de calidad de compilación HDRI más abajo. Un ImageMagick 'Q16' también te permite guardar más información de bits para cada valor de píxel. Es decir, los valores de color se guardan como enteros que van desde '0' hasta '2^_quality_ -1'. Ese último valor se conoce en la programación de IM como el 'QuantumRange' actual (o el antiguo nombre obsoleto 'MaxRGB'). Cuanto más alto sea el ajuste de calidad usado al compilar IM, más precisos son los valores de color al almacenar la imagen en memoria. Eso significa que si al procesar una imagen generas muchas variaciones de color muy pequeñas y ligeras, entonces esas variaciones se preservarán en el almacenamiento en memoria de ImageMagick, y pueden usarse en pasos de procesamiento posteriores. Operaciones como redimensionamiento, filtros de ruido, desenfoque, enfoque, promediado, color global, gamma y modificaciones de histograma, o muchas operaciones complejas de composición de imágenes, pueden producir todas errores de color no deseados en un IM Q8, creando artefactos de color muy distintivos en la imagen resultante. Por supuesto, guardar la imagen final en un formato de imagen de 8 bits de 'profundidad' 'cuantizará' esos valores de color de vuelta a 8 bits, pero durante el procesamiento de la imagen en memoria, la calidad intermedia de la imagen se preserva. Hay algunos formatos disponibles que preservan el nivel de calidad de bits más alto usado por IM. Por ejemplo, el formato de IM MIFF, el formato de píxel enumerado TXT, así como los formatos de imagen NetPBM. Sin embargo, aunque una versión Q8 de IM te permitirá producir imágenes de profundidad de 16 bits, tales imágenes solo tendrán información equivalente a una profundidad de 8 bits, ya que la calidad simplemente no está presente en memoria para ser guardada. | _Si IM lee una imagen usando valores de 8 bits (muchos formatos de imagen lo hacen), la 'profundidad' de las imágenes se establecerá en 8 bits, y al guardar, IM normalmente guardará la imagen a esa misma profundidad de valor de 8 bits, incluso si procesas la imagen usando una versión Q16 de IM. Puedes anular este ajuste o borrar el ajuste "[-depth](https://imagemagick.org/command-line-options/#depth)" para esa imagen, para que IM la guarde a la mejor profundidad posible para que la imagen coincida con la calidad en memoria de IM.
Ten en cuenta también que muchos operadores que generan colores extra, como el Redimensionamiento de imágenes, también restablecerán la 'profundidad' de la imagen en memoria al ajuste de calidad de tiempo de compilación, para que IM intente entonces guardarla a una profundidad mayor, si es posible.
HDRI - calidad de punto flotante
HDRI, o Imágenes de alto rango dinámico (High Dynamic Range Imaging), fue diseñado originalmente para representar de forma más natural la capacidad de nuestros ojos de ver simultáneamente las zonas brillantes y oscuras de una escena. En términos prácticos de procesamiento de imágenes, hace mucho más que eso. Una versión HDRI de IM (la compilación por defecto) está compilada para usar valores de punto flotante para las imágenes almacenadas en memoria, para permitirte realizar un manejo HDRI más exacto de las operaciones de imagen, de modo que se evite que tales operaciones 'recorten' (clip) los colores de la imagen en los extremos. HDRI usa el mismo rango de color que el Ajuste de calidad por defecto de tiempo de compilación para el almacenamiento en memoria. Es decir, los valores siguen yendo de '0' al 'Quantum Range', significando negro a blanco. Pero los valores se guardan usando punto flotante ('doubles' en términos de programación en C) en lugar de enteros, de modo que los efectos 'cuánticos' del redondeo de valores a enteros no se vean. Los valores tampoco se 'recortan' cuando los valores van más allá del 'Quantum Range' o a negativos. Básicamente, pierdes mucha menos información entre los pasos de procesamiento. HDRI es por lo tanto vital cuando planeas usar un procesamiento matemático extremadamente intensivo de imágenes, que involucre el uso temporal de valores negativos, o un escalado fuerte a valores muy pequeños o muy grandes. Es especialmente importante para los usuarios que quieren hacer pleno uso de las capacidades de las Transformadas rápidas de Fourier (FFT), y es aquí donde verás la mayoría de los ejemplos de una versión HDRI de IM, en estas páginas. Para información sobre cómo compilar una versión HDRI de IM, consulta Habilitar HDRI en ImageMagick en el sitio web principal de IM, también para información específica de Windows y Ubuntu Linux consulta la Discusión del anuncio de transformadas de Fourier en los foros de usuarios. Un operador importante que debe tenerse en cuenta al usar HDRI es "[-clamp](https://imagemagick.org/command-line-options/#clamp)". Esta opción recortará los valores de una imagen que caigan fuera del rango normal para las imágenes. Es decir, cualquier valor negativo se recortará a cero, y cualquier valor mayor que 'QuantumRange' se establecerá a ese valor. Sin embargo, NO 'redondea' los valores de punto flotante a enteros.
Efectos cuánticos, HDRI vs no-HDRI
Redondeo cuántico... Por ejemplo, aquí uso los operadores Level y Reverse Level para comprimir el rango de color de una imagen de gradiente de modo que solo usen los valores de 0 a 15, luego lo descomprimo de nuevo. El gradiente resultante también se muestra como un perfil de imagen (usando el script "[im_profile](../static/img/scripts/im_profile)") para que sea más fácil de seguir. |
# Using a normal non-HDRI version of IM...
magick -size 20x600 gradient: -rotate 90 \
+level 0,15 -level 0,15 level_rounding.png
im_profile -s level_rounding.png level_rounding_pf.gif
Observa el severo redondeo (efectos cuánticos) que ahora es visible, formando escalones en el perfil del gradiente. Como solo se usaron 16 valores de nivel de gris, ¡efectivamente convertiste la imagen a una profundidad de color de solo 4 bits! Ten en cuenta que este tipo de problema de redondeo cuántico se vuelve muy común en una versión Q8 de IM, simplemente por hacer múltiples tareas de procesamiento de imágenes, más allá de un redimensionamiento y recorte básicos de las imágenes. Algo que la versión Q16 más normal de IM resuelve con su uso adicional de memoria. El redondeo cuántico solo se convierte en un problema para IM Q16 cuando usas un procesamiento de imágenes realmente intensivo, como las Transformadas rápidas de Fourier (FFT), o la fusión de imágenes que contienen diferentes tiempos de exposición (intensidad de luz) para generar imágenes de alto rango dinámico. Esto es, después de todo, por lo que HDRI se añadió a ImageMagick en primer lugar. Quemado y recorte... Y aquí 'estiro' el gradiente de modo que los valores de color blanco y negro originales vayan mucho más allá del "Quantum Range", antes de ser restaurados de nuevo. |
# Using a normal non-HDRI version of IM...
magick -size 20x600 gradient: -rotate 90 \
-level 20% +level 20% level_clipping.png
im_profile -s level_clipping.png level_clipping_pf.gif
Puedes ver que un IM normal pierde la información en ambos extremos. Los valores del extremo inferior se 'queman' a medida que los valores se vuelven negativos, mientras que los valores superiores se 'recortan' a medida que van más allá de los límites máximos del 'Quantum Range' de los enteros usados para almacenar los valores. El resultado de la versión HDRI de ImageMagick... Repetir estas dos operaciones usando una versión HDRI de ImageMagick no producirá ninguno de los anteriores redondeos, quemados o recortes de los resultados, pero tendrá un costo extra en términos de memoria (los doubles necesitan más espacio que los enteros). En cuanto a velocidad, no cuesta mucho, e incluso puede ser más rápido en muchos de los hardware de computadora modernos de hoy en día, debido a los aceleradores de punto flotante.
# Using HDRI version of IM...
magick -size 20x600 gradient: -rotate 90 \
+level 0,15 -level 0,15 level_rounding_hdri.png
magick -size 20x600 gradient: -rotate 90 \
-level 20% +level 20% level_clipping_hdri.png
im_profile -s level_rounding_hdri.png level_rounding_hdri_pf.gif
im_profile -s level_clipping_hdri.png level_clipping_hdri_pf.gif
Como puedes ver, el gradiente permanece perfectamente intacto, incluso después de una fuerte compresión o estiramiento de la imagen y de vuelta.
Clamp para hacer cumplir los límites de la imagen en HDRI
Puedes forzar que una imagen HDRI sea 'recortada' por el rango normal de valores de imagen usando "[-clamp](https://imagemagick.org/command-line-options/#clamp)" entre las dos opciones de level. Por ejemplo... |
# Using a HDRI version of IM...
magick -size 20x600 gradient: -rotate 90 \
-level 20% -clamp +level 20% level_hdri_clamp.png
im_profile -s level_hdri_clamp.png level_hdri_clamp_pf.gif
El uso de "[-clamp](https://imagemagick.org/command-line-options/#clamp)" en lo anterior básicamente generó la misma imagen que la que habría obtenido con una versión normal no-HDRI de ImageMagick. Sin embargo, esta imagen no sería exactamente la misma que un resultado no-HDRI, ya que aunque "[-clamp](https://imagemagick.org/command-line-options/#clamp)" quemará y recortará los valores de la imagen, no añade efectos de redondeo cuántico. Por ello, los valores solo se redondean a enteros durante el guardado final a un formato de archivo de imagen no-HDRI. La opción "[-clamp](https://imagemagick.org/command-line-options/#clamp)" puede ser de vital importancia al usar HDRI, para lograr el resultado que deseas.
Formatos de archivo HDRI
Por supuesto, guardar una imagen que contiene valores muy pequeños, grandes o negativos en un formato de archivo de imagen normal también será recortado, cuantizado e incluso reducido en color, por las mismas razones que arriba. Por ello, si necesitas guardar imágenes que no han sido 'normalizadas' de vuelta a una escala de 0 a 'Quantum Range', entonces necesitarás usar uno de los raros formatos de archivo de imagen de punto flotante. Algunos formatos de imagen que pueden manejar valores de punto flotante (sin recorte ni redondeo) incluyen NetPBM PFM. Este es el único formato de archivo de imagen que no requiere ninguna opción especial adicional.
Otros formatos de archivo de imagen también pueden usarse, pero requieren un interruptor especial para especificar que el archivo va a guardar valores de punto flotante. Específicamente, necesitas especificar la opción de codificador "**-define quantum:format=floating-point**" para solicitar valores de punto flotante en estos formatos de archivo. El ajuste "-depth" también puede usarse para definir qué tipo de valores de punto flotante se usan. Si se usa "-depth 32" o menos (el valor por defecto en la mayoría de las versiones de IM), entonces se usan "floats" normales. Pero si se establece "-depth 64", entonces se usan "doubles" para los datos de punto flotante escritos en, o leídos desde, el formato de archivo de imagen. Los formatos de archivo de imagen que puedes usar con esta bandera especial para guardar valores de punto flotante incluyen... TIFF, FITS y MIFF. El formato de archivo de datos en crudo RGB también guardará (y leerá) punto flotante, aunque ese formato no guarda el tamaño de la imagen, y necesitas especificar los ajustes de punto flotante también para la lectura.
Otra opción especial de codificador es "-define quantum:scale=65535.0". Esta se multiplicará con el valor leído del archivo de imagen, para escalar el valor desde un valor de punto flotante normalizado de 0.0 a 1.0, al rango de valores internos de 0.0 a 65535.0. Así que si obtienes una imagen casi completamente negra al leer una imagen de punto flotante, intenta añadir esta opción para escalar los valores que se leen al rango apropiado.
El formato de archivo directo de memoria a disco MPC también guardará los valores de punto flotante usados por una versión HDRI de IM, y no necesitará ninguna bandera especial. Pero como con cualquier archivo de imagen MPC, solo la misma versión exacta (compilación específica) de IM en la misma máquina leerá correctamente tal archivo. Por ello, solo es bueno para archivos temporales de 'lectura rápida' para procesamiento de imágenes mediante scripts, y no para almacenamiento a largo plazo.
Qué nivel Q debería usar
En resumen, ¿qué tipo de ImageMagick debería usar? ¿Q8, Q16, HDRI? Q8 tiene una menor huella de memoria, ya que los valores de imagen se guardan en memoria como valores de 8 bits, igual que la mayoría de los formatos de archivo de imagen. Para composición básica, conversión de formato de imagen, un simple 'redimensionamiento único', o dibujar en imágenes, entonces Q8 es 'suficientemente bueno'. Q16 duplica la huella de memoria, ya que los valores de color se guardan en valores de 16 bits (mayor precisión). Pero si planeas hacer un procesamiento de imágenes intensivo que involucre muchos niveles de operaciones, como 'cambio de espacio de color' (incluso solo sRGB hacia/desde RGB), redimensionamiento, distorsiones, desenfoque, sombras, etc., etc., todo a la misma imagen, en el mismo comando (lo cual se recomienda por la misma razón), entonces tener 16 bits es mejor, ya que preservará la menor precisión de las imágenes entre los pasos de procesamiento. También puedes entonces guardar en formatos de archivo de 16 bits (PNG, MIFF, PbmPlus) entre comandos, incluso si el guardado final es de vuelta a un formato de archivo de imagen de 8 bits como ICO y JPEG. (Este es el valor por defecto por esta razón) El siguiente nivel es Q16 HDRI, que lleva la precisión a valores de punto flotante de 32 bits, lo que te permite tratar con valores de imagen que se vuelven muy pequeños o muy grandes sin los efectos de redondeo y recorte de las imágenes. Incluso puedes tratar con valores negativos, especialmente en algunos espacios de color. Esencialmente se usa para evitar la pérdida de datos de imagen al procesar imágenes en extremos, como al usar imágenes HDRI, transformadas de Fourier, o solo altos niveles de compresión y expansión que puedas obtener en el procesamiento matemático de datos en crudo. Eso es, en pocas palabras. Q16 es un buen punto medio para la mayoría de las operaciones que involucran distorsiones, composiciones de múltiples imágenes y efectos de procesamiento de imágenes. Q8 si la memoria es escasa pero solo estás haciendo operaciones simples, HDRI si estás haciendo operaciones extremas.
Densidad o resolución de la imagen
La Densidad de una imagen es la resolución espacial (del espacio) de la imagen. Es decir, la densidad (generalmente expresada como ppp, o puntos por pulgada) de una imagen define qué tan separados (o qué tan grandes) están los píxeles individuales, y por lo tanto el tamaño general de la imagen en términos del mundo real, y se usa generalmente para mostrar o imprimir la imagen en un dispositivo del mundo real. Es solo algún número almacenado con la imagen para decirles a los dispositivos de salida, como impresoras y pantallas, cuántos puntos (o píxeles) por pulgada debe mostrarse la imagen, O, para formatos vectoriales como postscript, PDF, MWF y SVG, la escala de píxeles a la que dibujar usando cualquier coordenada del mundo real que pueda usarse dentro de la imagen. Es completamente irrelevante para el tamaño real en píxeles de la imagen, o para la Calidad en memoria y la Profundidad del formato de archivo de guardado que definen la 'resolución' de color de la imagen. Puedes establecer la resolución o densidad de una imagen a medida que se lee en IM usando la función "[-density](https://imagemagick.org/command-line-options/#density)", antes de leer o escribir la imagen, o usando "[-set](https://imagemagick.org/command-line-options/#set) density" después de leer la imagen. Un ajuste "[-units](https://imagemagick.org/command-line-options/#units)" puede usarse para definir si el número de densidad se expresa en los términos por defecto (de impresión tradicional) de 'PixelsPerInch' o en las unidades métricas más modernas de 'PixelsPerCentimeter' (PNG usa estas últimas). Por ejemplo, una imagen de 200x200 píxeles a 600 ppp se mostrará por lo tanto en un cuadrado de 1/3 de pulgada en términos del mundo real. Por otro lado, una imagen mucho más pequeña de 72x72 píxeles a 72 ppp se mostrará en un cuadrado de 1 pulgada, en el mundo real, aunque su calidad espacial no será muy buena en comparación. La primera siendo de 'calidad fotográfica', mientras que la segunda de 'resolución de pantalla'. En términos prácticos, una imagen de 72 ppp se verá 'digital' o 'con puntos' en una impresora. Por otro lado, una foto digital moderna grande tomada a una imagen de 1200 ppp probablemente necesitaría ser remuestreada para mostrarla en una pantalla, o puede que solo veas una pequeña parte de la imagen. Para más información sobre resolución y densidad de imágenes, consulta las notas sobre el Operador de redimensionamiento Resample. Para información sobre resolución y densidad para texto y fuentes, consulta Tamaño de punto y tamaño real de la fuente.
Photoshop y la densidad
El editor de imágenes "Photoshop" guarda una copia adicional de la resolución de las imágenes en un perfil separado (llamado '8BIM') en la imagen, que IM NO tocará. Por ello, si cambias la resolución de una imagen con IM, probablemente también deberías eliminar los perfiles de la imagen antes de volver a cargarla en "photoshop", o puede que no veas ningún cambio de densidad. Puedes eliminar solo ese perfil de una imagen usando "+profile 8bim". A partir de una Discusión del foro de IM, Jesper Nilsson (alias stroker) sugiere que uses el programa "[exiftool](http://www.sno.phy.queensu.ca/~phil/exiftool/)" para modificar directamente las Etiquetas de Photoshop de la imagen. Por ejemplo
exiftool -g -Photoshop:XResolution=300 -Photoshop:YResolution=300 file.tif
Pruebas de velocidad basadas en la calidad
Se enviaron algunas pruebas de velocidad a Foro de IM, velocidad de Q8 vs. Q16 (y HDRI). Resultados aproximados del artículo anterior
- La cantidad de memoria usada por píxel por canal es la que esperarías. Q8 - 1 byte, Q16 - 2 bytes, Q32 y cualquier HDRI - 4 bytes, Q64 (HDRI) - 8 bytes.
- 64 bits tiene mejoras significativas de precisión para operaciones de punto flotante, pero también las tiene cualquier otra versión HDRI de ImageMagick.
- En cuanto a velocidad, Q8, Q16 y HDRI son todos más o menos de la misma velocidad (suponiendo que la computadora tenga una MPU de punto flotante), Q32 alrededor de un 25 % más lento y Q64 (HDRI) alrededor de un 50 % más lento.
| Ten en cuenta que Q64 usa automáticamente "double long floats", en lugar de enteros de 64 bits. Es una especie de HDRI de doble precisión pero, aunque muy preciso, es el más lento de todos los ajustes de calidad en memoria, y el más intensivo en memoria.
---|---
| _La velocidad real dependerá de las especificaciones de tu computadora, y de si tienes o no un coprocesador matemático. Si no es importante, usar el Q16 por defecto, o el HDRI estándar, es probablemente lo mejor.
Si es importante, entonces deberías hacer pruebas similares de velocidad, en tu equipo, pero usando las operaciones que normalmente esperas usar en tu procesamiento de imágenes.
_
---|---
Controles especiales de ImageMagick
IM también tiene unas pocas opciones especiales que usa para controlar su funcionamiento operacional, el reporte de información, y con fines de depuración. -version | Produce qué versión de IM, la calidad de imagen que está usando, y cuándo fue compilado. IM saldrá implícitamente después de producir esta información. | | En IMv7, "[-version](https://imagemagick.org/command-line-options/#version)" saldrá si es la ÚNICA opción en la línea de comandos. Es decir, hará que el argumento final de 'escritura implícita' sea opcional. Si hay algún otro argumento presente, O fue leído desde un script (archivo o tubería), el comando magick no saldrá, sino que continuará.
---|---
-list | Esta es una opción meramente informativa y listará los elementos solicitados, luego saldrá. Es decir, no puedes usar esto con ninguna otra opción, ni con procesamiento de imágenes. Se proporciona puramente con fines informativos, especialmente en scripts para comprobar las opciones de entrada y si IM tiene ciertas opciones implementadas. El argumento dado define qué información quieres listar. Por ejemplo, una lista de nombres de 'color' que puedes usar (como los usados por "[-fill](https://imagemagick.org/command-line-options/#fill)", "[-background](https://imagemagick.org/command-line-options/#background)", "[-mattecolor](https://imagemagick.org/command-line-options/#mattecolor)", "[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)"). Mientras que 'font' lista las fuentes que IM conoce específicamente. Aquí hay solo algunas de las listas más interesantes... | list | ¡qué listas puede listar "[-list](https://imagemagick.org/command-line-options/#list)"!
---|---
font | Fuentes conocidas (IM también conoce las fuentes X y PS)
type | tipos de imagen de archivo ("[-type](https://imagemagick.org/command-line-options/#type)") (después de IM v6.3.5-7)
o la lista de fuentes (antes de esa versión de IM)
color | nombres de color conocidos para diversas opciones de color.
dispose | todos los ajustes de eliminación (disposal) de GIF ("[-dispose](https://imagemagick.org/command-line-options/#dispose)")
compose | composiciones alfa disponibles (incluye métodos internos)
layers | qué métodos multi-imagen "[-layers](https://imagemagick.org/command-line-options/#layers)" se han implementado
distort | Los métodos de distorsión de imagen disponibles.
morphology | Los métodos morfológicos de imagen disponibles.
kernel | Los núcleos morfológicos/de convolución que están disponibles.
command | qué opciones de la línea de comandos (tanto ajustes como operadores) están disponibles
configure | cuáles fueron los parámetros de configuración usados para compilar ImageMagick
Ese último ajuste 'list' 'Configure' es muy importante, ya que te dirá qué bibliotecas y delegados estaban disponibles cuando se compiló IM. También incluye el número de versión 'point', que faltaba en la salida normal de "[-version](https://imagemagick.org/command-line-options/#version)" de las versiones más antiguas. (Consulta Manejo de versiones en scripts para un ejemplo de uso de esta información. IM saldrá implícitamente después de producir esta información. | En IMv7, "[-list](https://imagemagick.org/command-line-options/#list)" saldrá si es la ÚNICA opción en la línea de comandos. Es decir, hará que el argumento final de 'escritura implícita' sea opcional. Si hay algún otro argumento presente, O fue leído desde un script (archivo o tubería), el comando magick no saldrá, sino que continuará.
---|---
-verbose | Reporta información extra sobre algunas de las operaciones más complejas.
Por ejemplo "[-segment](https://imagemagick.org/command-line-options/#segment)", que produce muchos detalles de cuantización de color.
Y "[-distort](https://imagemagick.org/command-line-options/#distort)", produciendo información extra y equivalentes 'FX' a la distorsión de imagen solicitada. También monitoreando el número de cambios al iterar una operación "[-morphology](https://imagemagick.org/command-line-options/#morphology)". Esto es especialmente útil para generar información de imagen más detallada a partir de las salidas de "[info:](files.html#info)" e "[-identify](https://imagemagick.org/command-line-options/#identify)". Puedes desactivar el ajuste usando la forma 'más' de la opción, "[+verbose](https://imagemagick.org/command-line-options/#verbose)".
-regard
-warnings | El '-regard-warnings' hará que algunas advertencias informativas sobre ciertos formatos de archivo de imagen sean fatales. También hace que IM devuelva un estado de salida adecuado según tales condiciones de error. Puede usarse en scripts para 'sanear' archivos de imagen provistos por fuentes no controladas. Es decir, esta opción hará que IM falle y salga, si cuando la imagen JPEG o TIFF no era correcta, no estaba completa o contenía perfiles 'desconocidos'.
-precision {number} | Controla el número de dígitos significativos.
Cuando IM produce valores de punto flotante en respuesta a diversas solicitudes de depuración, verbose o de formato, este ajuste establece qué tan precisa quieres esa salida. Por defecto, limitará tales números a 6 dígitos significativos, pero este operador aumentará o disminuirá este valor por defecto. El ajuste por defecto de 6 también puede modificarse usando la variable de entorno 'MAGICK_PRECISION'. Afecta a la salida de...
- El comando "
[identify](#identify)" verbose o los ajustes "[-identify](https://imagemagick.org/command-line-options/#identify)", "[-print](https://imagemagick.org/command-line-options/#print)" y "[-format](https://imagemagick.org/command-line-options/#format)". - La salida '
debug()' de un operador "[-fx](https://imagemagick.org/command-line-options/#fx)" y el escape de cadena '%[fx:...]'. (Consulta FX, operador de procesamiento de imágenes hazlo-tú-mismo - Los valores de punto flotante de un núcleo de "
[-morphology](https://imagemagick.org/command-line-options/#morphology)" cuando se ha habilitado "-set option:showkernel 1". Consulta Mostrar el núcleo.
-quiet | No reporta mensajes informativos de advertencia. Solo errores propios como errores de E/S, u opciones incorrectas, etc. Esto es especialmente útil para "[-crop](https://imagemagick.org/command-line-options/#crop)" o "[-trim](https://imagemagick.org/command-line-options/#trim)" y "[-layers](https://imagemagick.org/command-line-options/#layers) optimize", que normalmente reportan advertencias de 'imágenes perdidas', cuando el operador no produciría ninguna imagen 'real' como resultado. Esto también silenciará los codificadores de algunos formatos de archivo de imagen complejos que pueden contener 'fragmentos desconocidos' que IM normalmente ignoraría. Por ejemplo, cuando IM está leyendo imágenes TIFF, o formatos de video MPEG (AVI) extraños.
-respect
-parenthesis | Hace que los paréntesis no solo guarden y restauren la lista de imágenes actual, sino también todos los ajustes operacionales actuales. Eso significa que, cuando se da, cualquier ajuste establecido dentro de los paréntesis se restablecerá cuando terminen los paréntesis. Consulta los ejemplos en Paréntesis y ajustes más arriba.
-ping | Para el comando "identify". IM intentará evitar leer y decodificar completamente el formato de archivo de imagen completo para obtener información básica, como el tamaño de las imágenes.
-monitor | Reporta un porcentaje de procesamiento durante cada etapa del procesamiento de imágenes, especialmente para tareas de procesamiento de imágenes muy grandes o largas. En una API de más bajo nivel, usarías SetImageInfoProgressMonitor() o SetImageProgressMonitor()
-debug | Reporta de forma detallada exactamente lo que IM está haciendo, en diversas áreas. El argumento es una lista separada por comas de opciones, tales como... | exception | Qué es lo que IM no está entendiendo sobre el comando
---|---
cache | Ver cuánto espacio en disco está usando IM como caché
configure | Mostrar los intentos de búsqueda de IM para encontrar sus archivos de configuración.
trace | Reportar los puntos de traza al inicio de cada función de la biblioteca
annotate | Reportar sobre las métricas de fuente cuando se usa una fuente con "[-annotate](https://imagemagick.org/command-line-options/#annotate)".
command | IMv7 -- mostrar las opciones de la línea de comandos (o el script) a medida que se procesan. P. ej.: procesamiento de opciones.
all | Mostrar cada punto de traza durante el procesamiento
Esto es muy muy MUY detallado y no recomendado
Si se usa "[-debug](https://imagemagick.org/command-line-options/#debug)", la ubicación de la salida de registro está controlada por el archivo "log.xml". Por defecto, esto está establecido en "console". Para que se guarde en un archivo, cambia <log output="console"/> a <log output="file"/>. Para el uso en línea de comandos y en la API, también puedes definir una variable de entorno para establecer el nivel de depuración usando acciones por parte de IM.
export MAGICK_DEBUG=all
Limiting image size (quick note)
To prevent excess memory usage, set your memory limit to say 16GB. Now set
the disk limit to 4GB. ImageMagick will exit if the disk limit is exceeded,
with a "cache resource exhausted" exception.
![[Texto de IM]](../static/img/basics/gravity_error.txt.gif)
![[Texto de IM]](../static/img/basics/identify.txt.gif)
![[Texto de IM]](../static/img/basics/identify_colors.txt.gif)
![[Salida de IM]](../static/img/basics/rose.png)
![[Texto de IM]](../static/img/basics/identify_ping.txt.gif)
![[Texto de IM]](../static/img/basics/identify_no_ping.txt.gif)
![[Texto de IM]](../static/img/basics/identify_ping_off.txt.gif)
![[Texto de IM]](../static/img/basics/identify_maths.txt.gif)
![[Texto de IM]](../static/img/basics/output_info.txt.gif)
![[Texto de IM]](../static/img/basics/output_identify.txt.gif)
![[Texto de IM]](../static/img/basics/output_print.txt.gif)
![[Texto de IM]](../static/img/basics/output_html.txt.gif)
![[Salida de IM]](../static/img/basics/gold.gif)
![[Salida de IM]](../static/img/basics/orange.gif)
![[Salida de IM]](../static/img/basics/tomato.gif)
![[Salida de IM]](../static/img/images/eye.gif)
![[Salida de IM]](../static/img/images/news.gif)
![[Salida de IM]](../static/img/images/storm.gif)
![[Salida de IM]](../static/img/images/tree.gif)
![[Salida de IM]](../static/img/basics/circle.gif)
![[Salida de IM]](../static/img/basics/mogrify_eye.gif)
![[Salida de IM]](../static/img/basics/mogrify_news.gif)
![[Salida de IM]](../static/img/basics/mogrify_storm.gif)
![[Salida de IM]](../static/img/basics/mogrify_tree.gif)
![[Salida de IM]](../static/img/basics/cmd_settings_lots.gif)
![[Salida de IM]](../static/img/basics/seq_swap3.gif)
![[Salida de IM]](../static/img/basics/seq_clone_reversed.gif)
![[Salida de IM]](../static/img/basics/seq_dup_list.gif)
![[Texto de IM]](../static/img/basics/comments.txt.gif)
![[Texto de IM]](../static/img/basics/comment_change.txt.gif)
![[Texto de IM]](../static/img/basics/properties.txt.gif)
![[Salida de IM]](../static/img/basics/property_label.gif)
![[Texto de IM]](../static/img/basics/property_label.txt.gif)
![[Texto de IM]](../static/img/basics/artifact_verbose.txt.gif)
![[Texto de IM]](../static/img/basics/rose_properties.txt.gif)
![[Salida de IM]](../static/img/basics/level_rounding_pf.gif)
![[Salida de IM]](../static/img/basics/level_rounding.png)
![[Salida de IM]](../static/img/basics/level_clipping_pf.gif)
![[Salida de IM]](../static/img/basics/level_clipping.png)
![[Salida de IM]](../static/img/basics/level_rounding_hdri_pf.gif)
![[Salida de IM]](../static/img/basics/level_clipping_hdri_pf.gif)
![[Salida de IM]](../static/img/basics/level_hdri_clamp_pf.gif)