⚠️ Este es un sitio de traducción no oficial, sin relación con ImageMagick Studio LLC. Para información autorizada, consulte la página original (https://usage.imagemagick.org/annotating/index.html).

Ejemplos de ImageMagick -- Anotación de imágenes

Ejemplos de ImageMagick: prefacio e índice
Etiquetado de imágenes (técnicas para etiquetar imágenes)

Este documento presenta varias formas de anotar una imagen grande, ya sea con texto o con otra imagen. La anotación puede ser llamativa y muy visible, o sutil y discreta. Las razones para anotar imágenes son variadas, pero por lo general son una de estas:

  • Marcar la imagen con información sobre de qué trata.
  • Señalar o resaltar algún aspecto de la imagen.
  • Añadir derechos de autor o logotipos a la imagen como forma de protección contra copia.

ImageMagick ofrece muchas maneras de hacer estas cosas, pero no todas son fáciles de descubrir por uno mismo en los manuales. Esta página intenta presentar los métodos más habituales. Muchos de los métodos concretos se explican con más detalle en otras páginas de ejemplos. Si te interesa anotar o marcar con agua una animación GIF, te sugiero que primero leas este documento y luego saltes a Anotar animaciones GIF para empezar.


Anotación de imágenes

El problema básico al etiquetar una imagen es hacerlo de modo que el texto sea legible sea cual sea la imagen. A continuación se muestran muchos métodos, algunos de los cuales pueden ampliarse para tareas más complejas. En estos ejemplos me limito a la fuente predeterminada de ImageMagick. Te animo a usar distintas fuentes y tamaños de punto apropiados para lo que quieras conseguir.

Etiquetar debajo (o encima) de una imagen

Añadir una etiqueta con centrado ya es posible desde IM v6.4.7-1, ya que la concatenación de imágenes ahora respeta el ajuste de gravity a efectos de alineación. |

  magick dragon.gif   -background Khaki  label:'Faerie Dragon' \
          -gravity Center -append    anno_label.jpg

[IM Output]
Si reordenas las imágenes, puedes concatenar la etiqueta encima de la imagen. |

  magick dragon.gif   -background Orange  label:'Faerie Dragon' \
          +swap  -gravity Center -append    anno_label2.jpg

[IM Output]
Splice y Draw es una forma muy sencilla de añadir espacio extra a una imagen para poder dibujar o anotar la etiqueta en ella. |

  magick dragon.gif \
          -gravity South   -background Plum   -splice 0x18 \
          -annotate +0+2 'Faerie Dragon'   anno_splice.gif

[IM Output]
El mismo método sirve para dibujar una etiqueta encima de la imagen: basta con sustituir el ajuste de gravity 'South' por 'North'. ¡Fácil! |

  magick dragon.gif \
          -gravity North   -background YellowGreen  -splice 0x18 \
          -annotate +0+2 'Faerie Dragon'   anno_splice2.gif

[IM Output]
El operador "[-draw](https://imagemagick.org/command-line-options/#draw)" ya no se recomienda para dibujar directamente sobre las imágenes, salvo como parte de funciones de dibujo más complejas. Consulta la sección Tratamiento de texto a imagen para más detalles sobre otros métodos y técnicas de dibujo de texto. Etiquetar con Montage Los usuarios suelen pasar por alto el comando montage de ImageMagick, considerándolo útil solo para crear una presentación de todo un directorio de imágenes. En realidad ofrece una forma muy sencilla de añadir etiquetas a una imagen. |

  montage -label "Faerie Dragon"  dragon.gif \
          -geometry +0+0 -background Gold anno_montage.jpg

[IM Output]
montage también puede añadir un marco y otros elementos a la imagen, así que esta forma de etiquetado ofrece muchas posibilidades adicionales más allá del simple etiquetado de la imagen. |

  montage -label "Faerie Dragon" dragon.gif \
          -font Candice -pointsize 15 \
          -frame 5  -geometry +0+0 anno_montage2.jpg

Para más información sobre el uso de montage, consulta Montage, matrices de imágenes. [IM Output]
Etiquetar con Polaroid Una alternativa a montage es usar la transformación de imagen Polaroid para generar una imagen comentada de aspecto bastante elegante. |

  magick -caption "Faerie Dragon" dragon.gif -gravity center \
           -background black +polaroid anno_polaroid.png

Atención: esta imagen está distorsionada (curvada y rotada) con cierta aleatoriedad, por lo que el tamaño final de la imagen puede variar, salvo que se desactive la rotación. También contiene efectos complejos de sombra y transparencia, así que se usó un formato PNG para guardar la imagen resultante. [IM Output]
Puedes reducir el «desenfoque» de la imagen resultante provocado por la rotación usando una técnica de «supermuestreo». Consulta Transformación de imagen Polaroid para ver un ejemplo.

Etiquetar sobre la propia imagen...

El problema de escribir texto directamente sobre una imagen es que no puedes estar seguro de que el texto sea legible en el color que hayas elegido. La imagen sobre la que dibujas podría ser negra, blanca o un arcoíris de colores. Etiqueta con contorno: el método más sencillo es dibujar la cadena con un contorno para separar el texto de la imagen. Sin embargo, como el ajuste de fuente "[-stroke](https://imagemagick.org/command-line-options/#stoke)" añade grosor a la fuente tanto hacia dentro como hacia fuera, reduce su eficacia (consulta Stroke y StrokeWidth para más información). La mejor forma de dibujar una fuente con un contorno de fondo es dibujar el texto dos veces. |

  magick dragon.gif -gravity south \
          -stroke '#000C' -strokewidth 2 -annotate 0 'Faerie Dragon' \
          -stroke  none   -fill white    -annotate 0 'Faerie Dragon' \
          anno_outline.jpg

[IM Output]
Como ves, funciona, pero no demasiado bien. Funciona mejor con una fuente más gruesa que las predeterminadas 'Times' o 'Arial'. Para más detalles sobre esta técnica, consulta Fuente compuesta de trazo grueso. Dibujar una caja atenuada: el método más clásico para hacer más visible el texto anotado es «atenuar» la imagen en la zona donde se añadirá el texto y luego dibujar el texto en el color opuesto. Por ejemplo... |

  magick dragon.gif \
          -fill '#0008' -draw 'rectangle 5,128,114,145' \
          -fill white   -annotate +10+141 'Faerie Dragon' \
          anno_dim_draw.jpg

[IM Output]
Este método funciona bien, pero, como ves, en este ejemplo decidí no usar "[-gravity](https://imagemagick.org/command-line-options/#gravity)" para situar el texto, ya que el rectángulo oscurecido no puede posicionarse con gravity (esto podría cambiar en el futuro). Además, su tamaño y posición pueden depender de la imagen y del tamaño final del texto, lo que puede requerir algunos cálculos matemáticos adicionales. Caja de undercolor: en lugar de intentar dibujar tú mismo la caja de fondo, puedes hacer que ImageMagick use un «undercolor» en la caja. Consulta Caja de undercolor del texto. El «undercolor» del texto (tal como se usa en la API de la biblioteca) puede especificarse en la línea de comandos con la opción "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)". |

  magick dragon.gif  -fill white  -undercolor '#00000080'  -gravity South \
          -annotate +0+5 ' Faerie Dragon '     anno_undercolor.jpg

[IM Output]
Como ves, es mucho más sencillo que dibujar tú mismo la caja atenuada, aunque se recomienda añadir un espacio extra al principio y al final del texto dibujado para ensanchar un poco la caja. Etiqueta compuesta: la solución más ideal es preparar de antemano una imagen de texto y luego superponerla como imagen. Aquí creamos una etiqueta sencilla sobre un fondo semitransparente y la superponemos. |

  magick -background '#00000080' -fill white label:'Faerie Dragon' miff:- |\
    magick composite -gravity south -geometry +0+3 \
              -   dragon.gif   anno_composite.jpg

[IM Output]
Esta última técnica tiene algunas ventajas claras. La caja atenuada puede ajustarse al tamaño de la etiqueta y posicionarse con "[-gravity](https://imagemagick.org/command-line-options/#gravity)" para colocarla correctamente, sin necesidad de conocer nada concreto sobre la imagen a la que se añade ni sobre la fuente que se está dibujando.
Además, no te limitas a usar una simple caja atenuada. En su lugar, puedes preparar una imagen de fuente muy compleja, ya sea de antemano (para aplicarla muchas veces) o sobre la marcha imagen por imagen. Tienes a tu disposición prácticamente todos los estilos de efectos de fuentes compuestas, lo que te permite hacer que tus añadidos de texto resulten muy llamativos y de aspecto profesional. Caption de tamaño automático: con la publicación de IM v6.3.2, "[caption:](text.html#caption)" puede ahora ajustar automáticamente el tamaño del texto para encajar lo mejor posible en una caja de un tamaño determinado. Pero, para aprovecharlo correctamente en una superposición, en realidad necesitas saber el ancho de la imagen que se va a anotar. Aquí obtengo esa información y luego creo y superpongo un caption de modo que el texto se ajuste automáticamente para encajar lo mejor posible en el espacio disponible, con ajuste de línea. |

  width=`identify -format %w dragon.gif`; \
  magick -background '#0008' -fill white -gravity center -size ${width}x30 \
          caption:"Faerie Dragons love hot apple pies\!" \
          dragon.gif +swap -gravity south -composite  anno_caption.jpg

[IM Output]
Esta técnica es ideal para superponer comentarios sobre una imagen, aunque hacerlo en la línea de comandos tiene sus propios problemas, ya que estás creando una imagen nueva en lugar de anotar una imagen antigua. Consulta Escapes de opción definidos por el usuario para una solución a este problema. Etiqueta elegante: como ejemplo final, superpondré una cadena de texto creada con una elegante fuente de contorno suave para asegurar que siga siendo visible, pero sin crear una caja rectangular para la anotación. |

  magick -size 100x14 xc:none -gravity center \
          -stroke black -strokewidth 2 -annotate 0 'Faerie Dragon' \
          -background none -shadow 100x3+0+0 +repage \
          -stroke none -fill white     -annotate 0 'Faerie Dragon' \
          dragon.gif  +swap -gravity south -geometry +0-3 \
          -composite  anno_fancy.jpg

[IM Output]
Si tienes previsto componer la misma etiqueta (por ejemplo, un mensaje de derechos de autor) sobre muchas imágenes, probablemente sea mejor generar tu etiqueta por separado y componer esa etiqueta sobre cada imagen con el comando "mogrify". El desplazamiento "-geometry +0-3" del ejemplo anterior se usa para situar la superposición compuesta más cerca del borde, ya que el contorno suave y difuso de esta imagen suele ser mayor de lo necesario.
Todos los ejemplos anteriores deberían, por supuesto, ajustarse a tus propias necesidades. No seas borrego ni sigas lo que hacen todos los demás. Experimenta y dale a tu propio sitio web o programa un sabor distinto al de los demás. Y, más importante aún, cuéntaselo a la comunidad de IM.

FUTURE: select the black or white color based on the images relative
intensity.  This uses a number if very advanced techniques.

  magick input.jpg  -font myfont -pointsize 25 \
      \( +clone -resize 1x1  -fx 1-intensity -threshold 50% \
         -scale 32x32 -write mpr:color +delete \)  -tile mpr:color \
       -annotate +10+26 'My Text'              output.jpg

Explanation:  Copy of image is resized to 1 pixel to find the images
average color.  This is then inverted and greyscaled using -fx, then
thresholded to either black or white, (as appropriate).
This single color pixel is now scaled to a larger tiling image, and
saved into a named memory register (mpr:).

The image is then used to set the fill tile, for the annotated text.
Their is however no simple method (at this time) to set the outline -stroke
color of the draw text to its inverse.

Other techniques are to use some text as a 'negate image' mask, or even a color
burn or color dodge compose operation, to distort the image with the text.

Superposición de imágenes El comando "magick composite" y el operador de imagen "[-composite](https://imagemagick.org/command-line-options/#composite)" de ImageMagick proporcionan el medio principal para colocar una imagen encima de otras de diversas maneras. Los detalles de estos métodos se dan en la página de ejemplos Composición alfa. Sin embargo, hay operadores de más alto nivel que también hacen uso de la composición alfa de imágenes. Entre ellos están las capas de imágenes, así como Posicionar imágenes con Gravity, más abajo en esta página de ejemplos. El método de composición predeterminado de compose es "Over", que simplemente superpone la imagen superpuesta sobre la imagen de fondo, gestionando las transparencias justo como cabría esperar. La imagen de fondo también determina el tamaño final del resultado, sin importar dónde se coloque la superposición (con la opción "[-geometry](https://imagemagick.org/command-line-options/#geometry)"). No importa si la superposición está en el centro, a medias fuera de la imagen de fondo o muy muy lejos: la imagen de salida tiene el mismo tamaño que la imagen de fondo. La posición de geometry de la imagen también se ve afectada por "[-gravity](https://imagemagick.org/command-line-options/#gravity)", de modo que la posición de la imagen superpuesta puede definirse en relación con cualquiera de nueve (9) ubicaciones distintas. Consulta "Posicionar imágenes y texto" más abajo. Además del "[-geometry](https://imagemagick.org/command-line-options/#geometry)" de la superposición de compose, las imágenes individuales también pueden tener información de página o lienzo (establecida con las opciones "[-page](https://imagemagick.org/command-line-options/#page)" y "[-repage](https://imagemagick.org/command-line-options/#repage)"), que puede afectar a la posición final de las imágenes. No obstante, esta información específica de la imagen no se ve afectada por "[-gravity](https://imagemagick.org/command-line-options/#gravity)". Vamos con los ejemplos...Superponer es probablemente la forma más común de anotación de imágenes y es muy fácil de hacer. Aquí superpongo un icono de castillo de 32x32 en el centro de un marco de botón preparado.

  magick composite -gravity center  castle.gif  frame.gif  castle_button.gif

[IM Output] [IM Output] [IM Output]

También puedes posicionar las subimágenes con exactitud. Aquí colocamos una mano para señalar las pequeñas garras del dragón de las hadas.

  magick composite -geometry +31+105  hand_point.gif dragon.gif \
            dragon_claw_pointed.jpg

[IM Output] [IM Output] [IM Output]

La forma exacta en que se dibuja una imagen sobre el fondo se controla con el ajuste "[-compose](https://imagemagick.org/command-line-options/#compose)". El predeterminado, usado más arriba, es "-compose over", que simplemente superpone la imagen sobre el fondo. La mayoría de los demás métodos de compose disponibles no son muy útiles salvo en situaciones muy concretas, pero aquí van algunos de ellos. Para más detalles sobre este ajuste y sus efectos, consulta Composición alfa. Bumpmap es un método de compose delicado que, básicamente, oscurece la imagen de fondo según el brillo de la imagen superpuesta. Cualquier cosa que sea blanca en la superposición se trata como si fuera transparente, mientras que lo negro se vuelve negro en la imagen de salida. Es un poco como usar la superposición a modo de sello de tinta, y esa es una buena manera de imaginar esta operación. Como pista, superponer con un bumpmap funciona mejor con imágenes de colores claros. Así que quizá tengas que preparar la imagen de bumpmap antes de usarla. Aquí redimensionamos nuestra imagen de dragón antes de usar "-compose bumpmap" para dibujarla sobre una imagen de pergamino de papel.

  magick composite \( dragon.gif -resize 50% \) scroll.gif \
            -compose bumpmap -gravity center   dragon_scroll.gif

[IM Output] [IM Output] [IM Output]

Los bumpmaps también pueden usarse para aplicar un efecto global a una imagen; en este caso, mosaiqueamos un patrón de fondo de color claro sobre nuestro dragón. Recuerda que una imagen de bumpmap se trata como una imagen en escala de grises, así que cualquier color de nuestra imagen superpuesta se pierde.

  magick composite -compose bumpmap  -tile rings.jpg \
            dragon.gif  dragon_rings.jpg

[IM Output] [IM Output] [IM Output]

| La opción "[-tile](https://imagemagick.org/command-line-options/#tile)" anterior solo funciona en operaciones de compose que usan el comando "magick composite". En "magick" tendrás que usar el generador de imágenes "[tile:](canvas.html#tile)" con un "[-size](https://imagemagick.org/command-line-options/#size)" para especificar la extensión. Por supuesto, puedes hacer que tu imagen de superposición de origen sea más grande que la imagen de fondo sobre la que la superpones, ya que el resultado tendrá el tamaño de la imagen de fondo o destino.
---|---
Multiply es el método de compose más conocido por su capacidad de fusionar dos imágenes con fondos blancos (como sobre una página de texto). A diferencia del método de compose 'bumpmap', no convierte previamente la imagen superpuesta a escala de grises.

  mesgs PictureWords |\
      magick -pointsize 18 text:-  -trim +repage \
              -bordercolor white -border 10x5   text.gif
  magick composite -compose multiply -geometry +400+3 \
            paint_brush.gif  text.gif  text_multiply.gif

[IM Output] [IM Output] [IM Output]

NOTA: el complejo comando que genera "text.gif" más arriba solo sirve para crear una imagen típica de solo texto; el comando "mesgs" simplemente muestra una cita concreta, como hace "fortune", pero con más control. Este método funciona muy bien en muchas situaciones, pero por lo general solo si una (cualquiera) de las imágenes es básicamente negra (o en escala de grises) sobre un fondo mayoritariamente blanco. Si ambas imágenes contienen zonas de color, puedes obtener resultados inusuales. En otras palabras, esta técnica es perfecta para superponer dibujos lineales, diagramas o imágenes de texto sobre imágenes blancas (o de colores razonablemente claros), como imágenes de páginas impresas o escaneadas.


Marcas de agua

Marcar con agua es una tarea importante, pues ofrece una forma de señalar que una imagen pertenece a una empresa o sitio web. Por desgracia, esto implica estropear la imagen de algún modo, en detrimento de la propia imagen. Los objetivos básicos de una marca de agua son:

  • La marca debe ser claramente visible tanto si la imagen es de color claro como oscuro.
  • Debe ser difícil de borrar.
  • Y no debe resultar demasiado molesta para quien la mira.

Todos estos factores están en conflicto, y esa es una de las razones por las que resulta tan difícil marcar bien una imagen con agua.

Marca de agua con símbolos

Una de las formas más sencillas, y más molestas, de marca de agua es colocar simplemente una imagen muy pequeña pero específica en algún lugar de la imagen que se va a marcar. Aquí generamos una imagen (con "logo:") que queremos marcar, usando un pequeño símbolo de «ojos».

  magick logo: -resize x180  -gravity center  -crop 180x180+0+0  logo.jpg
  magick composite -geometry +160+13 eyes.gif   logo.jpg  wmark_symbol.jpg

[IM Output] [IM Output] [IM Output]

La mejor idea para colocar la imagen pequeña es añadirla de modo que parezca formar parte realmente de la imagen original. Arriba añadí la imagen de «ojos» de manera que casi parece parte del sombrero del mago (tampoco conviene que se integre demasiado en la imagen). En consecuencia, esta técnica requiere el toque humano, lo que hace imposible automatizarla por completo. La imagen pequeña también puede ser muy difícil de quitar, ya que destruye por completo la parte de la imagen que cubrió. Y, si se hace bien, apenas se nota, a menos que la estés buscando específicamente. La he visto usada con buen resultado en muchos sitios de la web. Un sitio web usaba un pequeño símbolo en forma de daga. Las imágenes robadas de ese sitio web se volvían muy evidentes cuando localicé ese mismo símbolo de daga en imágenes que encontré en otros sitios web. Marca de agua con texto Dibujar texto sobre una imagen también es una forma sencilla de marcar con agua, y cualquiera de los ejemplos de etiqueta sobre la imagen anteriores puede usarse como un tipo de marca de agua. Sin embargo, para hacerlo correctamente, deberías usar dos colores distintos para evitar que el texto desaparezca al dibujarlo sobre fondos de distinto color. Por ello, debería usarse algún tipo de efectos de fuentes compuestas. |

  magick logo.jpg  -font Arial -pointsize 20 \
          -draw "gravity south \
                 fill black  text 0,12 'Copyright' \
                 fill white  text 1,11 'Copyright' " \
          wmark_text_drawn.jpg

Esto funciona bien y puede automatizarse, pero tal cual está es demasiado llamativo para ser una buena marca de agua, ya que destaca demasiado de la imagen. [IM Output]
Pero, con algo de preparación, se puede crear una imagen con fondo transparente que resulte menos invasiva. Para más detalles de los pasos usados para generar el texto de la marca de agua, consulta Enmascarado de fuentes. También los ejemplos de máscaras de Enmascarar imágenes pueden serte útiles para entenderlo.

  magick -size 300x50 xc:grey30 -font Arial -pointsize 20 -gravity center \
          -draw "fill grey70  text 0,0  'Copyright'" \
          stamp_fgnd.png
  magick -size 300x50 xc:black -font Arial -pointsize 20 -gravity center \
          -draw "fill white  text  1,1  'Copyright'  \
                             text  0,0  'Copyright'  \
                 fill black  text -1,-1 'Copyright'" \
          -alpha off stamp_mask.png
  magick composite -compose CopyOpacity  stamp_mask.png  stamp_fgnd.png  stamp.png
  magick mogrify -trim +repage stamp.png

[IM Output]

Ahora que tenemos una fuente de marca de agua, podemos aplicarla a nuestra imagen... |

  magick composite -gravity south -geometry +0+10 stamp.png  logo.jpg \
            wmark_text_stamped.jpg

Como ves, la marca de agua no es tan llamativa como antes, e incluso usa tonos de gris en lugar de blanco y negro puros. Aun así, sigue siendo muy visible sea cual sea el fondo. La página efectos de fuentes compuestas detalla muchos estilos de fuente que pueden usarse de este modo sin saturar la imagen que se está marcando. [IM Output]
También puedes mosaiquear el texto sobre toda la imagen. Aquí, además, evitamos la necesidad de una imagen intermedia usando una «tubería» (pipeline) de comandos, donde la salida de uno alimenta al siguiente. |

  magick -size 140x80 xc:none -fill grey \
          -gravity NorthWest -draw "text 10,10 'Copyright'" \
          -gravity SouthEast -draw "text 5,15 'Copyright'" \
          miff:- |\
    magick composite -tile - logo.jpg  wmark_text_tiled.jpg

Esto aprovecha el hecho de que una imagen (como una fotografía, no un diagrama) generalmente tendrá algunas zonas en las que la cadena de texto mosaiqueada será visible. Quizá quieras hacer el texto semitransparente para tus propias marcas de agua (usando, por ejemplo, un gris medio transparente como "'#80808080'"). También te conviene tener en cuenta esta técnica de mosaiqueo con las técnicas de marca de agua propiamente dichas que siguen. [IM Output]

Marca de agua con imágenes

ImageMagick también ofrece una serie de opciones especialmente útiles para marcas de agua más sutiles, sobre un área más amplia. Esto es, por lo general, a lo que se suele referir uno cuando «marca con agua» una imagen. A la derecha hay una imagen de «dragón de agua» que usaré en estas demostraciones. Tiene algo de transparencia, que aproveché para comprobar que IM hace lo correcto respecto a la transparencia, evitando cualquier horrible aspecto «cuadrado» en los resultados. [IM Output]
Antes de la versión 6 de IM, las opciones "-watermark" y "-dissolve" tenían roto el manejo del canal alfa (transparencia) de la imagen superpuesta, produciendo efectos muy extraños.
--- ---
La composición Watermark estaba pensada para marcar imágenes con agua y, aunque funciona, tiende a hacerlo solo con imágenes de superposición de blanco y negro puros, produciendo feos artefactos en los bordes.
  magick composite -watermark 30% -gravity south \
            wmark_image.png  logo.jpg    wmark_watermark.jpg

Para información más detallada sobre esta opción, consulta la página Uso de la opción Watermark. [IM Output]
Dissolve descubrí, junto con otros, que funciona mejor. |

  magick composite -dissolve 25% -gravity south \
            wmark_image.png   logo.jpg  wmark_dissolve.jpg

Esto funciona muy bien, pero partes de la marca de agua desaparecerán en imágenes con píxeles de blanco y negro puros. Es decir, disolver blanco sobre blanco y negro sobre negro no será visible en la imagen final. Como estos dos colores son muy comunes, conviene hacer algo de preprocesado adicional de la marca de agua para que use diversos tonos de gris en lugar de blanco y negro puros. (Consulta «Dissolve agrisado» más abajo). [IM Output]
Para información más detallada sobre esta opción, consulta la página Uso de la opción Dissolve. Mosaiqueada: también puedes mosaiquear la marca de agua por toda la imagen de fondo en lugar de añadirla en una sola ubicación. Basta con sustituir tu posición de gravity por "[-tile](https://imagemagick.org/command-line-options/#tile)". Por supuesto, en ese caso quizá quieras hacer la marca de agua aún menos intrusiva. |

  magick composite -dissolve 15 -tile \
            wmark_image.png   logo.jpg  wmark_tiled.jpg

[IM Output]
Bumpmap agrisado: para usar bumpmap correctamente como marca de agua, la imagen necesita algo de preparación para llevar tanto el blanco como el negro a un rango de gris más claro, usando una técnica de ajuste a escala de grises. Si no se hace, el resultado sería muy, muy llamativo. |

  magick wmark_image.png  -fill Gray91 -colorize 80  miff:- |\
  magick composite -compose bumpmap -gravity south \
            -  logo.jpg    wmark_bumpmap.jpg

[IM Output]
El mayor problema de bumpmap como marca de agua es que la operación solo oscurece una imagen. Por ello, esta técnica resulta bastante inútil para imágenes muy oscuras. Dissolve agrisado: la misma técnica de preprocesado también puede ser útil con el método dissolve, de modo que las partes blancas de la imagen de marca de agua se oscurezcan ligeramente sobre fondo blanco, y, de igual modo, las zonas negras de la marca de agua se aclaren sobre las partes negras de la imagen. |

  magick wmark_image.png  -fill grey50 -colorize 40  miff:- |\
  magick composite -dissolve 30 -gravity south -  logo.jpg wmark_dissolve_grey.jpg

[IM Output]
Yo diría que esto es prácticamente lo ideal como marca de agua, ya que satisface todos los requisitos. No obstante, yo ajustaría aún más el dissolve final para hacer la marca de agua todavía menos perceptible. Dissolve agrisado y mosaiqueado: esto es exactamente igual que lo anterior, pero mosaiqueado por toda la imagen con un valor de dissolve aún más bajo. |

  magick wmark_image.png  -fill grey50 -colorize 40  miff:- |\
  magick composite -dissolve 15 -tile  -  logo.jpg wmark_dissolve_tile.jpg

[IM Output]
| El comando "magick composite" no sabe manejar archivos de varias imágenes, como las animaciones. Sin embargo, otros métodos sí te permiten hacerlo. Consulta Modificar animaciones, anotar para ver ejemplos de anotación y superposición de archivos de varias imágenes.
---|---


Posicionar imágenes y texto con Gravity

La «Gravity» del asunto

Como has visto más arriba, poder situar imágenes y texto dentro de una imagen mayor puede ser tan importante como cualquier otra cosa. Naturalmente, el ajuste "[-gravity](https://imagemagick.org/command-line-options/#gravity)" es uno de los aspectos más importantes de esto.

En la lista de correo de ImageMagick, Tim Hunter declaró:
« Gravity te volverá loco hasta que le cojas el truco. »

Es una opinión con la que coincido de corazón. Gravity solo se aplica en las siguientes situaciones...

  • Cualquier operación que implique un ajuste de tipo 'geometry', como el posicionamiento "[-crop](https://imagemagick.org/command-line-options/#crop)" y "[-geometry](https://imagemagick.org/command-line-options/#geometry)" de imágenes para la composición alfa, incluida la composición en capas de varias imágenes.
  • También se usa como medio de especificar la justificación del texto por parte de los distintos generadores de texto a imagen como "[label:](text.html#label)", y la justificación del texto por parte de los distintos generadores de texto a imagen como "[caption:](text.html#caption)".
  • El operador de dibujo de texto "[-annotate](https://imagemagick.org/command-line-options/#annotate)" también lo usa tanto para posicionar el texto como para justificarlo.
  • Y, por último, lo usa el método "[-draw](https://imagemagick.org/command-line-options/#draw)" para sus métodos 'text' e 'image', y ÚNICAMENTE para esos métodos.

Sin embargo, "[-gravity](https://imagemagick.org/command-line-options/#gravity)" NO se usa para

  • Ningún operador de lista de imágenes o de capas, como "[-mosaic](https://imagemagick.org/command-line-options/#mosaic)", "[-flatten](https://imagemagick.org/command-line-options/#flatten)" y la mayoría de los métodos "[-layers](https://imagemagick.org/command-line-options/#layers)", y especialmente no en animaciones GIF. Todas estas operaciones usan desplazamientos de imagen sobre un lienzo virtual mayor (establecido con los ajustes de metadatos "[-page](https://imagemagick.org/command-line-options/#page)" y "[-repage](https://imagemagick.org/command-line-options/#repage)") para posicionar las imágenes. Dichos desplazamientos son siempre relativos a la esquina superior izquierda del lienzo virtual de las imágenes. En esta metodología no se usa noción alguna de "[-gravity](https://imagemagick.org/command-line-options/#gravity)".
  • Cualquier otro método "[-draw](https://imagemagick.org/command-line-options/#draw)" no usa "[-gravity](https://imagemagick.org/command-line-options/#gravity)" para el posicionamiento. Además, es poco probable que lo haga, ya que "[-gravity](https://imagemagick.org/command-line-options/#gravity)" no está definido en el borrador de SVG que IM sigue para estas funciones de bajo nivel.

¿Qué significa todo esto? Lo primero y más importante: define el punto de origen que "[-geometry](https://imagemagick.org/command-line-options/#geometry)" usa para posicionar el texto y las imágenes superpuestos respecto a los bordes, lados y centro de la imagen, sin que el usuario necesite conocer el tamaño real de la imagen. Esta es su función principal. En segundo lugar, define la justificación horizontal y vertical del objeto superpuesto (texto o imagen) respecto a ese punto de gravity definido. Por ejemplo, con gravity 'East' el texto o la imagen se colocará a la derecha (justificación a la derecha) del punto definido. Técnicamente, la justificación debería ser un ajuste independiente de "[-gravity](https://imagemagick.org/command-line-options/#gravity)", aunque estrechamente relacionado; sin embargo, IM combina actualmente ambos en un único ajuste. Hay un impulso por separar los dos aspectos, de modo que, si un ajuste de "justification" está sin definir, recurra al ajuste "[-gravity](https://imagemagick.org/command-line-options/#gravity)" actual. Si descubres que lo necesitas, solicítaselo a Cristy (a través de la lista de correo). Si suficientes usuarios lo piden, seguro que con el tiempo se implementa.

Posicionar imágenes con Gravity

Aquí tienes un ejemplo del uso de gravity para situar imágenes sobre un fondo.

  magick composite label:Default                      rings.jpg gravity_default.jpg
  magick composite label:Center    -gravity center    rings.jpg gravity_center.jpg
  magick composite label:South     -gravity south     rings.jpg gravity_south.jpg
  magick composite label:East      -gravity east      rings.jpg gravity_east.jpg
  magick composite label:NorthEast -gravity northeast rings.jpg gravity_northeast.jpg

[IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

Ten en cuenta que la posición real de la imagen también se justifica según el ajuste "[-gravity](https://imagemagick.org/command-line-options/#gravity)". Es decir, un gravity de "South" centrará la imagen en la parte inferior de la imagen mayor, pero por encima de ese punto de gravity. Esto cobrará más importancia más adelante con la rotación de texto. Lo otro que hay que recordar es que la posición especificada por cualquier ajuste "[-geometry](https://imagemagick.org/command-line-options/#geometry)" es relativa a la posición en la que gravity coloca la imagen. No solo eso: la dirección de la posición también se modifica de modo que una dirección de posición apunte hacia dentro. Por ejemplo, "-gravity South -geometry +10+10" moverá la imagen de etiqueta más hacia dentro del fondo. Es decir, la dirección Y de la posición de geometry se ha invertido, mientras que la dirección X se ha dejado igual.

  magick composite label:Default   -geometry +10+10 \
            rings.jpg gravity_default_pos.jpg
  magick composite label:South     -geometry +10+10 -gravity south \
            rings.jpg gravity_south_pos.jpg
  magick composite label:NorthEast -geometry +10+10 -gravity northeast \
            rings.jpg gravity_northeast_pos.jpg

[IM Output] [IM Output] [IM Output]

También puedes usar "[-gravity](https://imagemagick.org/command-line-options/#gravity)" con "-draw image" para colocar varias imágenes con un solo comando. |

  magick rings.jpg \
          -gravity Center     -draw "image Over     0,0 0,0 'castle.gif'" \
          -gravity NorthEast  -draw "image Bumpmap  0,0 0,0 'castle.gif'" \
          -gravity SouthWest  -draw "image Multiply 0,0 0,0 'castle.gif'" \
          gravity_image.jpg

[IM Output]
Y ahora también puedes usar "[-composite](https://imagemagick.org/command-line-options/#composite)" para superponer imágenes sobre el fondo... |

  magick rings.jpg \
          -gravity Center     castle.gif  -compose Over     -composite \
          -gravity NorthWest  castle.gif  -compose Bumpmap  -composite \
          -gravity SouthEast  castle.gif  -compose Multiply -composite \
          gravity_image2.jpg

[IM Output]
Para más detalles sobre los ajustes "[-compose](https://imagemagick.org/command-line-options/#compose)" usados arriba, consulta Composición alfa. Para otros métodos de superponer, combinar y fusionar varias imágenes en una sola, consulta la sección de ejemplos de IM Capas de varias imágenes.

Posicionar texto con Gravity

Eso está muy bien para las imágenes, pero ¿qué pasa con dibujar texto directamente sobre las imágenes? Pues bien, se aplican los mismos efectos básicos que para las imágenes. Como se mencionó antes, gravity también afecta al posicionamiento del texto usando el método 'text' de "[-draw](https://imagemagick.org/command-line-options/#draw)" o el mejor operador de dibujo de texto "[-annotate](https://imagemagick.org/command-line-options/#annotate)". |

  magick rings.jpg -resize 120x120  \
          -gravity northwest  -annotate 0 'NorthWest' \
          -gravity east       -annotate 0 'East' \
          -gravity center     -annotate 0 'Center' \
          -gravity south      -annotate 0 'South' \
          -gravity northeast  -annotate 0 'NorthEast' \
          gravity_text.jpg

[IM Output]
Hay una diferencia muy importante entre posicionar imágenes y texto. Si dibujas una cadena de texto sin definir ninguna forma de "[-gravity](https://imagemagick.org/command-line-options/#gravity)", la cadena se dibujará respecto a la 'línea de base' de la fuente. Por ejemplo, hagámoslo de verdad... |

  magick rings.jpg -annotate 0 'String' gravity_text_none.jpg

[IM Output]
Si te fijas bien, solo verás la pequeña cola en forma de bucle de la 'g' de 'String' asomando por el borde superior de la imagen resultante. El resto de la cadena se ha dibujado fuera de la imagen de fondo. Sin embargo, si ajustas "[-gravity](https://imagemagick.org/command-line-options/#gravity)" a 'NorthWest', el texto se posicionará como si fuera una imagen. Es decir, respecto a su caja delimitadora o caja de undercolor tal como la define la fuente. Por ejemplo... |

  magick rings.jpg -gravity NorthWest -annotate 0 'String'  gravity_text_nw.jpg

[IM Output]
La razón de esta distinción es asegurar que el dibujo de texto de IM siga siendo compatible con otros formatos de imagen de dibujo vectorial como "SVG". Esos formatos no usan gravity, así que activar gravity le indica a IM que siga las mismas reglas que el posicionamiento de imágenes al dibujar texto, en vez de las reglas de los gráficos vectoriales, que implican la 'línea de base' de la fuente y el punto de 'inicio' del texto. Si activas gravity y luego quieres desactivarlo, puedes usar "[-gravity](https://imagemagick.org/command-line-options/#gravity) none" o "[+gravity](https://imagemagick.org/command-line-options/#gravity)" para restablecerlo al ajuste predeterminado 'sin gravity'. Apliquemos un desplazamiento de texto y dibujemos tanto el argumento predeterminado 'None' como 'NorthWest' de "[-gravity](https://imagemagick.org/command-line-options/#gravity)", solo para que veas lo estrechamente relacionadas que están las dos formas. |

  magick rings.jpg \
          -gravity NorthWest -annotate +10+20 'NorthWest' \
          -gravity None      -annotate +10+20 'None' \
          gravity_text_pos.jpg

[IM Output]
Aunque en este ejemplo no lo parezca, estas dos cadenas pueden solaparse, sobre todo en lo relativo a los descendentes de letras como 'g' y 'p'. Es decir, las dos cadenas no están separadas correctamente por unidades de 'pointsize', sino solo por la altura de la línea de base de la fuente. Lo mejor es no mezclar los dos modos en tu propio procesamiento de imágenes. O usas gravity, o no lo usas. La elección es tuya. Texto en el borde izquierdo con Gravity Como ejemplo final, esta es la forma de anotar de verdad, centrado a lo largo del borde izquierdo de una imagen. El problema aquí es que, cuando rotas texto, este rota alrededor de su 'asa'. Por desgracia, esta asa la fija gravity ANTES de que el texto se rote, y por eso no funciona muy bien, salvo que te limites a 'texto centrado'. [IM Output] Por ejemplo, este es un típico 'primer intento' de posicionar el texto de modo que quede a lo largo del centro del borde izquierdo de la imagen. ¡Por supuesto, falla de forma bastante inesperada! |

  magick rings.jpg \
          -gravity West -annotate 90x90+10+0 'String' \
          gravity_text_left_fail.jpg

Como ves, el texto se colocó en el borde izquierdo, pero solo de modo que el inicio (donde está el 'asa' previa a la rotación) queda centrado. La causa de este problema es que en IMv7 el ajuste "-gravity" también se usa directamente para establecer la 'justificación' del texto (que fija el 'asa' usada para posicionar el texto). Hay algunas demostraciones animadas de los efectos de gravity sobre texto rotado escritas con la API de PerlMagick (descarga "[**im_annotation.pl**](../static/img/scripts/im_annotation.pl)"). También creé una versión en script de shell del mismo programa, "[**im_annotation**](../static/img/scripts/im_annotation)", e "[**im_annotation_2**](../static/img/scripts/im_annotation_2)". ¡Un truco para que esto funcione es rotar primero toda la imagen y luego usar center south! Es una solución sin sentido, pero funciona. |

  magick rings.jpg -rotate -90 \
          -gravity South -annotate +0+2 'String' \
          -rotate 90  gravity_text_left.jpg

[IM Output]
Más abajo, en Posicionar texto con Distort, se muestra un método alternativo.

Posicionar texto con Draw

Aunque arriba usé un 'desplazamiento de texto' para posicionar el texto respecto al punto "[-gravity](https://imagemagick.org/command-line-options/#gravity)", no es la única forma de hacerlo. El otro método es usar una opción "-draw translate" para posicionar el texto. Esto tiene la ventaja de que puedes disponer el texto sin los efectos de gravity, sin dejar de usar gravity para 'justificar' el 'asa' de posicionamiento dentro del texto. En estos ejemplos añadí algunas líneas de construcción adicionales (que tampoco se ven afectadas por gravity) para mostrar cómo se aplica la posición desde el punto central de la imagen. Texto con un desplazamiento... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan  -draw 'line 50,50 70,70' \
          -fill red   -draw 'line 68,70 72,70 line 70,68 70,72' \
          -fill blue  -draw "text 20,20 'Offset'" \
          text_offset.jpg

[IM Output]
Texto con una traslación... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -draw "translate 20,20 text 0,0 'Translate'" \
          text_translate.jpg

[IM Output]
Como ves, ambos producen el mismo resultado efectivo. Pero, como "-draw text" exige que indiques un desplazamiento que forma parte de sus argumentos, se usa más comúnmente para posicionar el texto dibujado desde la línea de comandos. Sin embargo, aunque estos dos métodos producen el mismo resultado, producirán resultados completamente distintos cuando también se aplica rotación al texto. Básicamente, por el orden en que se aplican las acciones.

Dibujar texto rotado

Hay dos formas distintas de posicionar el texto dibujado: usar un 'desplazamiento de texto', o 'trasladar' (translate) el texto a la posición final. Los efectos de estos dos métodos de posicionamiento producen resultados muy distintos cuando también se aplica rotación. La razón es compleja, pero esencialmente tiene que ver con cómo realiza IM las deformaciones de la superficie de dibujo. Dicho esto, veamos qué ocurre si rotas algo de texto usando las dos posiciones distintas. Solo un desplazamiento, sin rotación... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -draw "text 20,20 'None'" \
          rotate_none.jpg

[IM Output]
Rotar texto con un desplazamiento... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 50,78' \
          -fill red  -draw 'line 48,78 52,78  line 50,76 50,80' \
          -fill blue -draw "rotate 45 text 20,20 'Offset'" \
          rotate_offset.jpg

[IM Output]
Rotar texto con traslación... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -draw "translate 20,20 rotate 45 text 0,0 'Translate'" \
          rotate_translate.jpg

[IM Output]
Esto es, en realidad, lo que la mayoría de la gente quiere. Aunque la rotación con desplazamiento puede ser útil para algunos efectos especiales. Fíjate en cómo el orden de estas deformaciones de la superficie de dibujo está invertido respecto al orden en que se dan. La rotación se realiza primero, y la traslación se realiza después. Si inviertes los métodos 'rotate' y 'translate', obtendrás el mismo resultado que un 'desplazamiento de texto' ordinario: un desplazamiento rotado. El operador "[-annotate](https://imagemagick.org/command-line-options/#annotate)" se diseñó específicamente para facilitar el posicionamiento de texto rotado, pidiéndole expresamente a IM que dibuje el texto con rotación en lugar de 'deformar la superficie'. Annotate con rotación y desplazamiento... |

  magick -size 100x100 xc:white -gravity Center \
          -fill cyan -draw 'line 50,50 70,70' \
          -fill red  -draw 'line 68,70 72,70  line 70,68 70,72' \
          -fill blue -annotate 45x45+20+20 'Annotate' \
          rotate_annotate.jpg

[IM Output]
El problema de los ejemplos anteriores es que el ajuste "[-gravity](https://imagemagick.org/command-line-options/#gravity)" de IMv7 no solo se refiere a la posición en la imagen de fondo, sino también a la posición en la imagen superpuesta que se va a dibujar. IMv7 añadirá la 'justificación de texto' (Text Justification), que se refiere a la posición de la superposición, como un ajuste independiente (pero relacionado) de gravity (posición del fondo).

Posicionar texto con Distort

Usar la distorsión SRT junto con las capas de imágenes es un método especialmente bueno para colocar imágenes (o texto en imágenes). Básicamente, te da control completo de bajo nivel tanto sobre el punto en el que se coloca la imagen como sobre cómo se dispone la imagen respecto a ese punto. Para empezar, aquí creamos una 'imagen de texto' con fondo transparente y simplemente 'apilamos en capas' la imagen sobre la imagen de fondo. |

  magick rings.jpg -background none label:'Some Text' \
          -flatten  layer_simple.jpg

[IM Output]
Como ves, el texto simplemente se añadió a la imagen en la esquina superior izquierda. Rotémoslo usando distort (la variante de capas): ¡fíjate en el uso de los paréntesis para limitar qué imagen distorsionamos! |

  magick rings.jpg \( -background none label:'Some Text' \
             +distort SRT 70 \
          \) -flatten  layer_rotate.jpg

[IM Output]
¡Fíjate en que la posición del texto NO cambió! Lo único que ocurrió fue que el distort rotó el texto alrededor del punto central (el asa), pero de modo que, respecto al 'lienzo virtual', ese punto no se movió. Así, cuando la imagen, ahora más grande, se aplana, su punto de rotación —'el centro de la imagen de texto'— no se movió. El siguiente paso es mover esa asa, pero para ello necesitamos usar casi todo el conjunto de argumentos de la distorsión SRT. Como queremos seguir usando también el 'asa central', necesitamos usar algunos escapes de porcentaje de propiedad de imagen, o más concretamente, escapes de porcentaje FX. Así que coloquemos el centro en '+60+60' en la imagen de fondo. |

  magick rings.jpg \( -background none label:'Some Text' \
             +distort SRT '%[fx:w/2],%[fx:h/2] 1 70 60,60' \
          \) -flatten  layer_translate.jpg

[IM Output]
Otra forma de mover una 'imagen de capa' es usar el operador Repage. En especial, un movimiento relativo usando un indicador '!'. Por la propia naturaleza de las imágenes de capa, el 'asa' para esto es la esquina superior izquierda. El operador de distorsión SRT no solo traslada la imagen usando el asa especificada, sino que puede usar posiciones de subpíxel (en coma flotante) para ambas asas. Es decir, puede distorsionar el texto en incrementos de subpíxel hasta cualquier ubicación, sin las restricciones de enteros que tienen la mayoría de las demás operaciones. El ejemplo final consiste en colocar el texto rotado 90 grados en el borde izquierdo. El asa del texto alrededor de la cual rotar y posicionar será esta vez el centro inferior del texto, antes de rotarlo. Es decir, una posición calculada de '%[fx:w/2],%h'. La posición en la imagen de fondo también debe calcularse ahora para que sea el centro del borde izquierdo ('0,%[fx:h/2]'). El problema es que el operador de distorsión SRT no tiene acceso a la imagen de fondo mientras distorsiona la imagen de texto. La solución es hacer este cálculo de posición cuando la imagen de fondo está disponible, y guardarlo en algún 'ajuste personal' que luego pueda añadirse a los argumentos de distort. Esta técnica se examina más de cerca en Extraer información de otras imágenes. Así que aquí está el resultado. Primero calculamos la posición en la imagen de fondo. Luego distorsionamos la imagen de texto de modo que su 'asa' se mueva también a esa posición precalculada. |

  magick rings.jpg -set option:my:left_edge '0,%[fx:h/2]' \
          \( -background none label:'Some Text' \
             +distort SRT '%[fx:w/2],%h 1 90 %[my:left_edge]' \
          \) -flatten  layer_on_left.jpg

[IM Output]
La cadena 'my:' puede ser cualquier cosa que no choque con los prefijos existentes. Es decir, la uso para guardar MIS (my) ajustes, separados de cualquier otro ajuste que ImageMagick pueda usar para los codificadores u opciones específicas. Prefijar 'my:' es una buena elección para esto. Los escapes de porcentaje se tratan puramente como sustituciones de cadenas y, de hecho, podríamos generar toda la opción Distort como una cadena. El único problema es que no puedes hacer cálculos sobre tus ajustes 'my:' después de haberlos establecido. Por eso, cualquier operación matemática debe hacerse de antemano. Esto es algo que se estudiará para IMv7, de modo que las expresiones FX usen variables de escape %.