Ejemplos de ImageMagick -- Manejo de texto
Crear etiquetas de texto, o añadir texto a imágenes, es probablemente una de las operaciones más básicas y comunes para las que se usa ImageMagick. También es una de las más sencillas, pero con margen para resultados muy elaborados. Por ello este es un buen lugar para empezar nuestra exploración de las capacidades de IM.
Operadores de texto en ImageMagick
ImageMagick tiene muchas formas distintas de dibujar texto dentro de una imagen, lo que resalta la versatilidad de la biblioteca de procesamiento de imágenes. Esta página detalla métodos y estilos específicos para dibujar texto. Lo que debes tener en cuenta a medida que estudias estos ejemplos es que ImageMagick es ante todo un convertidor y modificador de imágenes. Por ello cada uno de los métodos proporcionados son simples operadores de dibujo de texto, como añadir etiquetas y mensajes de copyright a las imágenes. Consulta Anotación de imágenes. Todos los operadores de texto también entienden y usan un conjunto de ajustes estándar de procesamiento de texto como, por ejemplo, la "[-font](https://imagemagick.org/command-line-options/#font)" y el "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" a usar. También el ajuste de color "[-fill](https://imagemagick.org/command-line-options/#fill)" y, para dibujos de texto más complejos, los colores "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)", "[-stroke](https://imagemagick.org/command-line-options/#stroke)" y "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)". En los casos en que realmente creas una nueva imagen, como etiquetas y leyendas, también se usa el ajuste de color "[-background](https://imagemagick.org/command-line-options/#background)". Y por último, los modificadores más recientes "[-kerning](https://imagemagick.org/command-line-options/#kerning)" e "[-interword-spacing](https://imagemagick.org/command-line-options/#interword-spacing)". Lo que ImageMagick no es, es un procesador completo de texto formateado y documentos. Si quieres un procesamiento de texto intensivo, es mejor que uses un procesador de textos interactivo completo, o un formateador de texto por lotes como "TeX" (o alguna de sus variantes (consulta Un sistema completo de procesamiento de texto más abajo). La salida de estos programas (generalmente en formato postscript) puede luego convertirse en una imagen y modificarse aún más con ImageMagick. Es decir, usa la herramienta adecuada para cada trabajo. Dicho esto, se puede hacer algo de manejo de fuentes mixtas. Como punto de partida, mira Crear líneas con estilos de fuente mixtos, cerca del final de esta página. Ahora veamos las formas básicas en que puedes convertir texto en imágenes. Más adelante, en la siguiente sección (Fuentes compuestas) veremos cómo generar algunos efectos de fuente interesantes.
Label - Etiqueta de texto simple
Etiquetas básicas
Crear una imagen de fuente usando una imagen "label:" es la forma más típica de dibujar una fuente rápidamente en ImageMagick. La mayor ventaja es que genera su propio lienzo según los ajustes de color "[-background](https://imagemagick.org/command-line-options/#background)" y "[-fill](https://imagemagick.org/command-line-options/#fill)" actuales, cuyo tamaño se ajusta para coincidir con el texto dibujado. Por ejemplo, aquí hay una etiqueta generada típica.
magick -background lightblue -fill blue \
-font Candice -pointsize 72 label:Anthony \
label.gif
Lo anterior es probablemente el uso más típico de label, con una selección de fuente y un "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" que define los resultados. Pero es, con diferencia, la forma menos interesante de generar etiquetas de texto. |
La imagen 'label:' generada también tendrá los metadatos de la propiedad de imagen 'label' establecidos con la misma cadena. Algunos formatos de archivo, como MIFF y PNG, guardarán esa propiedad específica y pueden usarse en programas de procesamiento de imágenes posteriores. Para ver un ejemplo de uso de los metadatos 'label', consulta Montaje usando metadatos guardados. |
|---|---|
Si también especificas un "[-size](https://imagemagick.org/command-line-options/#size)", entonces la imagen de etiqueta generada se creará con ese tamaño. |
magick -background lightblue -fill blue -font Candice \
-size 165x70 -pointsize 24 label:Anthony label_size.gif
![[IM Output]](../static/img/text/label_size.gif)
También puedes usar "[-gravity](https://imagemagick.org/command-line-options/#gravity)" para establecer la posición de la etiqueta dentro de esa caja más grande. |
magick -background lightblue -fill blue -font Candice \
-size 165x70 -pointsize 24 -gravity center \
label:Anthony label_gravity.gif
![[IM Output]](../static/img/text/label_gravity.gif)
Por supuesto, si no estableces un "[-size](https://imagemagick.org/command-line-options/#size)" para la etiqueta, no habrá espacio adicional disponible en el "label:" generado para que lo use "[-gravity](https://imagemagick.org/command-line-options/#gravity)", haciéndolo bastante inútil. El problema de usar JUNTOS "[-size](https://imagemagick.org/command-line-options/#size)" y "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" es que el texto podría 'desbordar' el tamaño de imagen especificado. |
magick -background lightblue -fill blue -font Candice \
-size 165x70 -pointsize 72 -gravity center \
label:Anthony label_overflow.gif
![[IM Output]](../static/img/text/label_overflow.gif)
| Antes de la versión 6.5.2-4, IM ignoraba por completo el ajuste "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" si también se daba un ajuste "[-size](https://imagemagick.org/command-line-options/#size)". Esto hace que el texto de las imágenes anteriores se dimensione automáticamente según el manejo de 'mejor ajuste' (consulta el siguiente conjunto de ejemplos).
---|---
Mejor ajuste a la imagen
El mayor truco para usar etiquetas y generar imágenes de un "[-size](https://imagemagick.org/command-line-options/#size)" específico es NO especificar un "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" para la etiqueta. Cuando esto ocurre, IM tendrá la libertad de intentar seleccionar un tamaño de fuente que se ajuste mejor al tamaño de imagen solicitado. Es decir, ¡el texto dibujado se ajustará para encajar en el tamaño dado! |
magick -background lightblue -fill blue -font Candice \
-size 165x70 label:Anthony label_size_fit.gif
![[IM Output]](../static/img/text/label_size_fit.gif)
Como puedes ver, al establecer un ajuste "[-size](https://imagemagick.org/command-line-options/#size)", podrías terminar con algo de espacio adicional a la derecha o debajo de la imagen. | Cuando IM crea una etiqueta de 'mejor ajuste', el tamaño de punto real que usó también se guarda en la propiedad de imagen 'label:pointsize', lo que te permite usar esa información más adelante. Esto se añadió a IM v6.6.2-7, durante la discusión del foro Pointsize Reporting
---|---
Aún puedes ajustar la posición de la etiqueta en ese espacio adicional ajustando el ajuste "[-gravity](https://imagemagick.org/command-line-options/#gravity)". |
magick -background lightblue -fill blue -font Candice \
-size 165x70 -gravity center label:Anthony label_size_gravity.gif
![[IM Output]](../static/img/text/label_size_gravity.gif)
Por supuesto, si no estableces un "[-size](https://imagemagick.org/command-line-options/#size)" para la etiqueta, no habrá espacio adicional disponible en el "label:" generado para que lo use "[-gravity](https://imagemagick.org/command-line-options/#gravity)", por lo que solo tiene sentido cuando pides que la imagen tenga un tamaño específico. Ahora la mejor noticia. Si el ajuste "[-size](https://imagemagick.org/command-line-options/#size)" que das solo contiene el ancho o la altura de la etiqueta, la fuente se ajustará para encajar mejor en esa dimensión dada. ¡La otra dimensión no especificada se autoajustará entonces para encajar ese texto! |
magick -background lightblue -fill blue -font Candice \
-size 160x label:Anthony label_size_width.gif
![[IM Output]](../static/img/text/label_size_width.gif)
Básicamente eso significa que el "label:" anterior siempre tendrá 160 píxeles de ancho, con el mayor tamaño de fuente para ese ancho. La altura de la etiqueta se ajustará entonces en consecuencia. Lo mismo se hará si se especifica la altura pero no el ancho. |
magick -background lightblue -fill blue -font Candice \
-size x40 label:Anthony label_size_height.gif
![[IM Output]](../static/img/text/label_size_height.gif)
Esta etiqueta tiene 40 píxeles de alto, el tamaño de punto indefinido del texto se ajustó para encajar esa altura, y luego el ancho indefinido se estableció para encajar el texto dibujado. Exactamente como esperarías. Por supuesto, en este caso de nuevo habrá poco o ningún espacio adicional con el que el ajuste "[-gravity](https://imagemagick.org/command-line-options/#gravity)" pueda jugar.
Etiquetas en varias líneas
El generador "label:" puede (a partir de IM versión 6.2.5) generar etiquetas de varias líneas. |
magick -background lightblue -fill blue -font Ravie -pointsize 20 \
label:'ImageMagick\nRules - OK!' label_multiline.gif
![[IM Output]](../static/img/text/label_multiline.gif)
Como puedes ver, "label:" entiende el uso de '\n' como representación de saltos de línea. Esto significa que puede que tengas que preprocesar tu texto de entrada para asegurarte de que cualquier carácter especial se escape al colocar los datos en la línea de comandos. Consulta Caracteres de escape especiales en argumentos de texto más abajo para más detalles. Como "[-gravity](https://imagemagick.org/command-line-options/#gravity)" también afecta a la generación de "label:" (a partir de IM versión 6.2.6), puedes usarlo para 'justificar' etiquetas de varias líneas. |
magick -background lightblue -fill blue -font Corsiva -pointsize 24 \
-gravity center label:'ImageMagick\nExamples\nby Anthony' \
label_centered.gif
![[IM Output]](../static/img/text/label_centered.gif)
Una característica importante de IM es que puede leer los datos de texto a usar desde un archivo. Esto se hace prefijando el nombre del archivo con un carácter 'arroba' '@', y usando esto como argumento de cadena. Por ejemplo, aquí creamos una etiqueta a partir del archivo 'mensaje del día' de mi estación de trabajo...
magick -background lightblue -fill blue \
label:@/etc/motd label_file.gif
También puedes leer el texto de una etiqueta desde la canalización de entrada estándar. Por ejemplo, aquí convierto la salida de un generador de citas en una etiqueta de varias líneas.
mesgs ImageResolution |\
magick -background lightblue -fill blue \
label:@- label_file_multiline.gif
Observa que el nombre de archivo que usé fue solo un carácter '-'. Esto significa que el archivo se debe leer desde la entrada estándar. Recuerda que puedes usar '@_nombredearchivo_' para leer CUALQUIER argumento de cadena de la línea de comandos en IM. Esto incluye todos los demás métodos de entrada de texto que se dan a continuación. Sin embargo, solo puede usarse para reemplazar el argumento de cadena completo, no una parte de un argumento de cadena. Observa también que en los ejemplos anteriores se añadió una línea en blanco adicional a la imagen de etiqueta. Esta línea en blanco se debe a un salto de línea final en el archivo de texto de entrada. A menos que de alguna manera elimines el salto de línea final del archivo de entrada (consulta el ejemplo de caption: más abajo para ver un método de solucionar esto), "label:" siempre tendrá esta línea en blanco de los archivos de texto de entrada. |
La mayoría de las versiones antiguas de IM (anteriores a v6.2.5) no manejan etiquetas de varias líneas. En esas versiones, las líneas se habrían unido para formar una sola línea muy, muy larga. |
|---|---|
Etiquetas verticales
Por supuesto, también puedes añadir saltos de línea al texto de entrada. Por ejemplo, aquí tomo una palabra simple y añado un salto de línea entre cada letra, para crear un texto vertical centrado. |
echo -n "Vertical" | sed 's/./&@/g; s/@$//' | tr '@' '\012' |\
magick -background lightblue -fill blue -font Ravie -pointsize 24 \
-gravity center label:@- label_vertical.gif
Observa que el comando "sed" añade un carácter '@' después de cada carácter, excepto al final de la cadena. El "tr" luego reemplaza los caracteres '@' por saltos de línea. También asume que el texto de entrada no termina con un salto de línea, lo que causaría que se añadiera un espacio en blanco adicional al final de la imagen resultante. ![[IM Output]](../static/img/text/label_vertical.gif)
Los usuarios que ejecutan linux, y por tanto usan la versión GNU del comando "sed", pueden eliminar el "tr", y reemplazar el '@' por '\n' en el comando sed, de modo que inserte directamente los saltos de línea entre cada carácter. Consulta también el atributo especial Espaciado entre líneas que puede usarse para ajustar el espacio entre los caracteres.
Caption - Etiqueta con ajuste de línea por palabra
La imagen "caption:" del generador de entrada de texto es, en la mayoría de los aspectos, exactamente como "[label:](#label)" salvo que, en lugar de expandir el tamaño del texto para encajar en un ajuste "[-size](https://imagemagick.org/command-line-options/#size)" especificado, ajusta por palabras (word wrap) cualquier línea larga que no encaje en el ancho del "[-size](https://imagemagick.org/command-line-options/#size)" especificado. Sin embargo, el ajuste "[-size](https://imagemagick.org/command-line-options/#size)" no es opcional y debe especificar al menos un ancho máximo en píxeles. Por ejemplo, aquí hay una leyenda de una línea larga que no encajará en el ancho especificado.
magick -background lightblue -fill blue -font Corsiva -pointsize 36 \
-size 320x caption:'This is a very long caption line.' \
caption.gif
| La imagen 'caption:' generada también tendrá los metadatos de la propiedad de imagen "caption" 'establecidos' con la misma cadena, lo que te permite reutilizar esa información más adelante. Todos los formatos de archivo de imagen comunes guardarán esta información con la imagen. Consulta Montaje usando metadatos guardados para ver ejemplos.
---|---
Por defecto el texto está todo justificado a la izquierda, sin embargo, a partir de IM versión 6.2.0, "caption:" respeta "[-gravity](https://imagemagick.org/command-line-options/#gravity)" para fines de justificación del texto.
magick -background lightblue -fill blue -font Candice -pointsize 40 \
-size 320x -gravity Center caption:'ImageMagick Rules OK!' \
caption_centered.gif
Si proporcionas una altura además de un ancho al ajuste "[-size](https://imagemagick.org/command-line-options/#size)", entonces la altura de la imagen también se establecerá con esa altura. Luego también puedes usar el ajuste "[-gravity](https://imagemagick.org/command-line-options/#gravity)" para posicionar el texto verticalmente.
magick -background lightblue -fill blue -font Gecko -pointsize 32 \
-size 320x100 -gravity South caption:'Captions at their height!' \
caption_height.gif
Sin embargo, ten en cuenta que si el texto no encaja (en altura) en el "[-size](https://imagemagick.org/command-line-options/#size)" que especificaste con el "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" dado, entonces el texto desbordará la caja. El ajuste "[-gravity](https://imagemagick.org/command-line-options/#gravity)" actual determinará naturalmente qué parte del texto se recorta. Por ejemplo, esto es exactamente igual que el ejemplo anterior, pero con un "[-size](https://imagemagick.org/command-line-options/#size)" de imagen demasiado pequeño para el resultado.
magick -background lightblue -fill blue -font Gecko -pointsize 32 \
-size 320x60 -gravity South caption:'Captions at their height!' \
caption_height_toosmall.gif
Leyenda con mejor ajuste
A partir de IM v6.3.2, si proporcionas tanto el ancho como la altura de la imagen final, pero no defines el "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" de la fuente (o desactivas el tamaño de punto con "[+pointsize](https://imagemagick.org/command-line-options/#pointsize)"), IM intentará ajustar automáticamente el tamaño de la fuente para llenar lo mejor posible el "[-size](https://imagemagick.org/command-line-options/#size)" de la imagen que solicitaste. Por ejemplo, aquí le pido a ImageMagick que llene un área bastante grande...
magick -background lightblue -fill blue -font Candice -size 320x140 \
caption:'This text is resized to best fill the space given.' \
caption_filled.gif
Y ahora un área mucho más pequeña y delgada, para la misma fuente y cadena de texto. |
magick -background lightblue -fill blue -font Candice -size 80x110 \
caption:'This text is resized to best fill the space given.' \
caption_filled_sm.gif
![[IM Output]](../static/img/text/caption_filled_sm.gif)
Observa que la ÚNICA diferencia entre los dos últimos ejemplos es el "[-size](https://imagemagick.org/command-line-options/#size)" de la imagen generada. IM ajustó el texto y el ajuste por palabras para intentar llenar lo mejor posible el tamaño de imagen especificado. Esto es extremadamente útil para encajar un fragmento de texto desconocido en un espacio dado, sin que desborde los límites del área. Sin embargo, internamente equivale a ejecutar caption varias veces mientras IM busca el tamaño de punto correcto a usar para llenar mejor el espacio dado. En otras palabras, a menudo puede ser 10 veces o más lento que si proporcionaras un "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" específico a usar.
Leyendas con párrafos
El operador de imagen "caption:" (a partir de IM v6.2.5) entiende el uso del escape de shell '\n' (y por tanto necesitas duplicar la barra invertida '\\' para escapar las barras invertidas), como significado de nueva línea o párrafo. Antes de esta versión, los párrafos separados tenían que procesarse mediante operaciones "caption:" separadas.
magick -background lightblue -fill blue \
-font Ravie -pointsize 24 -size 360x \
caption:"Here I use caption to wordwrap.\nTwo separate lines." \
caption_multi_line.gif
Puedes leer el texto a dibujar desde un archivo, o desde la entrada estándar (de un comando de canalización anterior), usando el prefijo de nombre de archivo '@', igual que podemos hacer con "[label:](#label)".
mesgs FilePrivate |\
magick -background lightblue -fill blue -pointsize 12 \
-size 320x caption:@- caption_file.gif
Como puedes ver, los saltos de línea en el texto de entrada (a partir de IM v6.2.5) se tratarán como separadores de párrafo. Esto incluye cualquier salto de línea final en el archivo de entrada. Por supuesto, "[label:](#label)" no ajustará las líneas por palabras, sino que las preservará. Si realmente quieres que un archivo se trate como un solo párrafo, entonces necesitarás reemplazar los caracteres de salto de línea por un carácter de espacio, para que tu texto esté todo en una sola línea. Por ejemplo, aquí tomamos el mismo texto, pero reemplazamos los saltos de línea por espacios, y luego reemplazamos cualquier conjunto de espacios múltiples entre las palabras por un solo espacio...
mesgs FilePrivate | tr '\012' ' ' | sed 's/ */ /g' |\
magick -background lightblue -fill blue -pointsize 12 \
-size 320x caption:@- caption_one_line.gif
Como puedes ver, esto funciona mucho mejor. Sin embargo, a menudo lo que quieres es tratar una línea en blanco como un salto de párrafo. Eso significa que necesitas eliminar todos los saltos de línea, excepto los que forman parte de las líneas en blanco. Aquí hay un comando "sed" especial para convertir dicho texto al formato que necesita "caption:". En este caso el texto es la primera página de la página de manual de "magick".
man magick | col -b | expand | \
sed '/^$/d; :loop y/\n/ /; N; /\n$/! b loop; s/ */ /g; s/^ //' |\
head -n 7 | magick -size 400x caption:@- caption_manual.gif
| No hay una opción de texto 'justificado' en caption. Pero el formateador de texto pango: (que usa una biblioteca externa) sí tiene esa característica, y muchas más.
---|---
Atributos de texto
Originalmente los ajustes que afectan al manejo de texto incluían: "[-font](https://imagemagick.org/command-line-options/#font)", "[-fill](https://imagemagick.org/command-line-options/#fill)", "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)", "[-size](https://imagemagick.org/command-line-options/#size)" y "[-gravity](https://imagemagick.org/command-line-options/#gravity)". Ya hemos presentado muchos de estos controles de atributos arriba. Pero hay otros controles de atributos que no se usan tan a menudo, y que originalmente no afectaban a la generación de imágenes de texto "label:" o "caption:". A partir de IM v6.3.2 también puedes usar "[-stroke](https://imagemagick.org/command-line-options/#stroke)", "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)" y "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)" con "label:" o "caption:". Por ejemplo, aquí hago uso de muchos ajustes diferentes para controlar los atributos del renderizado de la imagen de texto de IM... |
magick -background white -fill dodgerblue -font Candice \
-strokewidth 2 -stroke blue -undercolor lightblue \
-size 165x70 -gravity center label:Anthony label_color.gif
![[IM Output]](../static/img/text/label_color.gif)
Para más detalles sobre estos ajustes consulta Caja de undercolor más abajo, y Stroke, StrokeWidth en la sección de dibujo. | En este momento, no puedes usar imágenes de mosaico definidas usando "[-tile](https://imagemagick.org/command-line-options/#tile)", "[-fill](https://imagemagick.org/command-line-options/#fill)", "[-background](https://imagemagick.org/command-line-options/#background)" y "[-origin](https://imagemagick.org/command-line-options/#origin)", con "label:" o "caption:". Solo pueden usarse colores sólidos. Intentar hacerlo simplemente producirá un color indefinido (negro).
---|---
Tamaño de punto, densidad y el tamaño real de la fuente
Los píxeles son puntos en la pantalla o en una imagen, y eso es con lo que trabaja IM. Por otro lado, las imágenes se imprimen a una resolución específica (especificada como 'puntos por pulgada' (dpi) o píxeles por pulgada (ppi)). Por ello, la resolución de una imagen afecta a cómo otros programas dimensionarán una imagen sobre un soporte específico. Es decir: afecta al tamaño físico de la imagen en el mundo real. La resolución (densidad o dpi) de una imagen es irrelevante para el tamaño en píxeles de una imagen, y para la cantidad de espacio que una imagen ocupa en memoria o en disco. También es, en general, irrelevante para la mayoría de las operaciones de imagen de IM. Por ello, para ImageMagick, la resolución es solo un conjunto de números almacenados con la imagen, y normalmente se ignora. El único momento en que la resolución o densidad de una imagen se vuelve relevante es para las fuentes y para convertir formatos vectoriales como postscript, pdf, MWF, a los formatos de imagen de trama que IM maneja. El ajuste "[-density](https://imagemagick.org/command-line-options/#density)" le dice a IM cuántos píxeles (puntos) por pulgada (ppi) hay presentes en el dispositivo de salida, que puede entonces usar para ajustar la generación de imagen y los tamaños de fuente para que coincidan. Por ejemplo, por defecto IM trabaja con un ajuste "[-density](https://imagemagick.org/command-line-options/#density)" de 72 ppi, que es un ajuste típico para mostrar imágenes en un monitor o página web. Como el tamaño de una fuente se especifica en 'puntos' (usando "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)") y, por definición, 1 punto es 1/72 de pulgada, entonces una fuente de 72 puntos debería producir texto dimensionado para tener aproximadamente 1 pulgada de alto... |
magick -pointsize 72 label:Hello pointsize.gif
![[IM Output]](../static/img/text/pointsize.gif)
Sin embargo, la mayoría de las pantallas modernas tienen una resolución mejor que esta, típicamente entre 90 y 120 píxeles por pulgada (ppi). Por ello... |
magick -density 90 -pointsize 72 label:Hello density.gif
![[IM Output]](../static/img/text/density.gif)
Debería producir una etiqueta de 1 pulgada de alto en una pantalla de 90 dpi. ¡Lo es en la mía! Puedes medir la altura de estas imágenes en tu pantalla, para comprobar la resolución de tu pantalla. Como el número de píxeles por pulgada es mayor, la fuente dibujada también es naturalmente mayor en términos del número de píxeles en la imagen, produciendo así una imagen más grande. Distintos programas de imagen a menudo tienen una densidad por defecto diferente, y esto puede hacer que las fuentes aparezcan de forma distinta cuando las dibujan diferentes programas, incluso con el mismo tamaño de punto. Observa que "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" en realidad significa la separación de líneas de una fuente (en realidad la altura de su área de dibujo), y NO se refiere a la altura real de las letras dibujadas. Por ello, una fuente puede parecer más grande o más pequeña que otra fuente, con el mismo tamaño de punto y densidad. Solo el interlineado de las fuentes será realmente el mismo; cualquier otra cosa depende de la fuente y de su diseñador. Por ello, con una "[-density](https://imagemagick.org/command-line-options/#density)" por defecto de 72 dpi (a la cual 1 punto = 1 píxel) una fuente de 12 puntos debería tener 12 píxeles de separación entre las líneas base de dos líneas de texto. | Observa que la altura de una imagen "[label:](#label)" generada se basa en el área de dibujo o caja delimitadora de la imagen, que a menudo es el interlineado de la fuente y el tamaño de punto. Esto no siempre es así, por lo que simplemente añadir líneas de texto verticalmente ¡es en realidad un manejo incorrecto de las fuentes!
---|---
Algunas fuentes pueden incluso extenderse mucho más allá de los límites normales de separación de líneas, extendiéndose mucho por encima o, más comúnmente, por debajo del interlineado. Esto es especialmente cierto en las fuentes de escritura a mano. El aspecto de una fuente también se ve afectado por el "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" y la "[-density](https://imagemagick.org/command-line-options/#density)" de la fuente. Duplicar el tamaño de punto de una fuente ("-pointsize 24") también producirá una fuente que parece aproximadamente del mismo tamaño que una con densidad o resolución duplicada. Sin embargo, debido a que una fuente está diseñada para verse de una forma particular, el grosor de las líneas en una fuente puede no cambiar mucho con un tamaño de punto mayor. Es decir, el tamaño de fuente más grande es ligeramente diferente. Pero si solo duplicas la densidad ("-density 144"), una fuente de 12 puntos se dibujará con sus dimensiones duplicadas, y aún debería parecer la fuente original de 12 puntos, solo que dibujada a mayor escala con un mejor suavizado de los bordes. Sin embargo, a resoluciones muy bajas, las limitaciones físicas de tamaño de los píxeles también pueden afectar al aspecto de una fuente. Esto significa que las líneas finas pueden engrosarse a densidades más bajas debido al gran tamaño de píxel que define la densidad. La relación entre 'densidad' y 'tamaño de punto' es un tema muy complejo, y uno que solo un diseñador gráfico de fuentes profesional puede comprender plenamente, y diseñar sus fuentes para manejarlo correctamente. Según Lithium de los Foros de IM...
Creo que es una característica del renderizador de fuentes TrueType. Un glifo TrueType no es solo un conjunto de curvas, puede contener múltiples niveles de detalle e instrucciones que ajustan las coordenadas de los puntos según el tamaño de salida en píxeles, lo cual es más visible para tamaños pequeños en píxeles. Debido a eso, el texto pequeño se ve diferente (y más claro, se puede notar) que el texto grande reducido.
EJEMPLO FUTURO: diferencia entre una fuente con el mismo tamaño en 'píxeles', pero diferente densidad y tamaño de punto. Básicamente, aumentar uno de estos factores mientras se disminuye el otro en la misma cantidad puede no producir el mismo resultado. Particularmente en lo que respecta al grosor de las líneas y al 'estilo' general de la fuente. Es mejor que ajustes el factor adecuado para lo que estás haciendo. Usa "[-density](https://imagemagick.org/command-line-options/#density)" al escalar una fuente para un dispositivo de salida, o para un redimensionado posterior de la fuente, y usa "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" para cambios normales de tamaño de fuente. Si quieres saber más sobre fuentes, entonces echa un vistazo al documento TrueType Fundamentals (PDF), que me pareció muy interesante.
Límites de la imagen de etiqueta
Al usar algunas fuentes exóticas, la fuente puede usar caracteres extendidos, y en el pasado IM tenía muchos problemas para crear etiquetas para estas fuentes. Es decir, el texto desborda el lienzo proporcionado. Por ejemplo, aquí hay dos letras mayúsculas en una fuente 'LokiCola' que recuerda a cierta famosa bebida refrescante. |
magick -background lightblue -fill blue -font LokiCola -pointsize 64 \
label:HC label_overflow_font.gif
![[IM Output]](../static/img/text/label_overflow_font.gif)
Como puedes ver, IM consigue contener esta fuente en una etiqueta sin recortar los gráficos de entrada o salida de la fuente. | Antes de IM v6.3.2, "[label:](#label)" habría recortado la entrada de la 'H' y partes de las colas de ambos caracteres, en el ejemplo anterior.
---|---
La razón por la que existía este problema es porque los 'glifos' de la fuente, o la descripción de los caracteres, dibujan fuera de los límites definidos de la fuente para letras específicas, permitiéndoles solaparse (generalmente por encima o por debajo) con los otros caracteres dentro de la fuente. Este es un problema de la forma en que la fuente misma está diseñada y definida, y no es culpa de IM, aunque IM ahora maneja estas situaciones extrañas en el mejor interés de los usuarios. En otras situaciones aún podría ser un problema, y uno que no puede resolverse simplemente debido a las interacciones del texto de varias líneas. Para más información consulta los ejemplos de Desbordamiento de la caja delimitadora más abajo, para una descripción más precisa.
Texto en formato Unicode o UTF8
Este método de suministrar argumentos de cadena a IM es muy importante, ya que te permite hacer cosas que normalmente podrían ser muy difíciles de hacer desde la línea de comandos. Específicamente, manejar 'texto unicode', o seleccionar caracteres específicos usando códigos de carácter. Ahora bien, si puedes teclear caracteres unicode en comandos o scripts, puedes usarlos directamente...
magick -background lightblue -fill blue -pointsize 32 \
label:' é è à ù ç Ö ÿ ‘ ’ “ ” ° ² ³ € x ÷ ' label_i8n.gif
Sin embargo, pocas personas tienen teclados o editores configurados correctamente para manejar la entrada de caracteres unicode. Incluso si no puedes teclear caracteres unicode directamente, una solución simple es simplemente 'copiar y pegar' los caracteres deseados de algún archivo de texto UTF-8 existente, o página web. ¡Yo lo hago! Si el texto UTF-8 que quieres dibujar ya está generado, puedes leerlo directamente desde un archivo usando '@nombredearchivo'. Por ejemplo, aquí creo una etiqueta en chino a partir de un archivo de texto chino codificado en UTF-8 (sin un salto de línea final en el archivo).
magick -background lightblue -fill blue -pointsize 48 \
-font ZenKaiUni label:@chinese_words.utf8 label_utf8.gif
| _La fuente usada en el ejemplo anterior es una especial, con el conjunto completo de glifos chinos definidos, como las fuentes de fedora linux 'SimSun' (o en el archivo de fuente "gkai00mp.ttf"), "ZenKaiUni" (en el archivo "ukai.ttf") o "ShanHeiSunUni" (en cualquiera de los archivos "uming.ttf" o "zysong.ttf" o "bsmi00lp.ttf").
Observa que la fuente de windows 'Mincho' (usada en un ejemplo posterior) también define muchos de los glifos chinos pero de forma incompleta. Si la usas con lo anterior obtendrás algunos signos de interrogación para los glifos indefinidos.
El script especial "[imagick_type_gen](../static/img/scripts/imagick_type_gen)" se usó para encontrar, extraer el nombre propio de las fuentes, y añadir la fuente a un archivo de configuración "type.xml" de ImageMagick.
_
---|---
También podemos generar cadenas UTF-8 a partir de códigos de carácter unicode usando el programa "printf" de 'GNU' (en sistemas linux) para convertir números unicode en la cadena específica codificada en UTF-8, en este caso comillas tipográficas de apertura y cierre adecuadas (de nuevo, sin salto de línea final en la entrada UTF-8). Aquí, por ejemplo, genero el texto UTF-8 usando códigos de carácter unicode, y lo alimento usando una canalización de comandos (leído desde 'stdin' usando "@-"), en lugar de desde un archivo real.
env LC_CTYPE=en_AU.utf8 \
printf "‘single’ - “double”" | \
magick -background lightblue -fill blue -pointsize 36 \
label:@- label_quotes.gif
En otros sistemas (como Mac OSX y Windows) puedes usar el "printf" de perl para producir una cadena de caracteres codificada en UTF-8 a partir de códigos de carácter unicode.
perl -e 'binmode(STDOUT, ":utf8"); \
print "\x{201C}Unicode \x{2018}\x{263A}\x{2019} Please\x{201D}";' |\
magick -background lightblue -fill blue -pointsize 36 \
label:@- label_unifun.gif
Para más información y para buscar los códigos de carácter unicode de varios idiomas y símbolos consulta Unicode Character Code Charts. No solo los caracteres unicode pueden contener caracteres internacionales, sino que con la fuente adecuada también puedes usar conjuntos especiales de 'símbolos' que define. El más famoso de estos es la fuente de símbolos 'DingBats'. Esta fuente se ha vuelto tan común que ahora forma parte del conjunto de fuentes Unicode estándar. Por ejemplo, aquí extraigo los primeros 24 caracteres del área de símbolos unicode 'DingBats' usando un script de shell especial "**[graphics_utf](../static/img/scripts/graphics_utf)**" que escribí para generar un 'bloque' de caracteres unicode como texto UTF-8.
graphics_utf -N 2701 2718 |\
magick -font Mincho -pointsize 32 label:@- label_dingbats.gif
Los signos de interrogación en lo anterior son caracteres específicos que no fueron definidos ni por unicode, ni en la fuente 'Mincho' de windows. Más concretamente, el símbolo que formaba parte de la fuente 'dingbat' original está presente en unicode, pero usando otro código de carácter unicode, distinto del código dingbat esperado. Consulta Dingbats Unicode Specification Chart para más detalle, y su referencia al carácter unicode correcto a usar para los caracteres 'dingbat' faltantes. En lugar de un signo de interrogación, muchas fuentes simplemente imprimirían una caja o un carácter en blanco para esos caracteres indefinidos. Si ves demasiados caracteres así, o caracteres faltantes en tu salida, probablemente deberías estar usando una fuente diferente. Otros conjuntos de símbolos también disponibles como parte de la enorme fuente de caracteres unicode incluyen: símbolos rúnicos tolkianos, símbolos matemáticos, números romanos, flechas, Braille y símbolos técnicos. Es un conjunto grande para explorar, y el script de shell "**[graphics_utf](../static/img/scripts/graphics_utf)**" puede ayudarte a explorarlo. Aquí hay otro ejemplo de caracteres unicode que la fuente 'Mincho' de Microsoft puede renderizar. En este caso de la sección "Miscellaneous Symbols"...
graphics_utf -N 2620 2630 |\
magick -font Mincho -pointsize 40 label:@- label_misc.gif
Usar unicode dentro de scripts DOS es mucho más difícil que en UNIX y LINUX. Wolfgang Hugemann ha proporcionado notas especiales sobre el uso de unicode desde ese entorno, en Codificación de caracteres en Windows.
Fuentes de símbolos
Más comúnmente usadas por las personas que buscan imágenes de texto especiales, son las 'fuentes de símbolos' especiales. Estas son mucho más pequeñas que la enorme fuente Unicode completa, ya que reemplazan solo los caracteres ASCII estándar normales (letras y números) con un conjunto diferente de formas e imágenes específicas, aunque a veces (raramente) también tienen más símbolos en el área de meta-caracteres latinos. Los símbolos de la fuente 'DingBat' empezaron de esta manera, pero como se mencionó arriba, ahora forman parte del conjunto de caracteres Unicode. Por ejemplo, un símbolo que me gusta bastante usar viene de la fuente "WebDings". Es un símbolo de 'corazón curvo' bastante bonito, que reemplaza el carácter 'Y' normal en la definición de esa fuente...
magick -size 20x20 -gravity center -font WebDings label:Y label_heart_20.gif
magick -size 40x40 -gravity center -font WebDings label:Y label_heart_40.gif
magick -size 60x60 -gravity center -font WebDings label:Y label_heart_60.gif
magick -size 80x80 -gravity center -font WebDings label:Y label_heart_80.gif
Lo importante a recordar es que todas las fuentes truetype son en realidad un tipo especial de formato de imagen vectorial. Con múltiples imágenes (una para cada carácter) en la fuente. Como son imágenes vectoriales, significa que la fuente debería permitirte 'dibujar' un carácter, forma o símbolo a casi cualquier tamaño (escala), usando los controles que proporcionan "[-size](https://imagemagick.org/command-line-options/#size)", "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" y "[-density](https://imagemagick.org/command-line-options/#density)". Como puedes ver arriba, el 'corazón curvo' puede 'renderizarse' a prácticamente cualquier tamaño que desee. Algunas fuentes son muy especializadas. Por ejemplo, puedes conseguir un archivo de fuente de IDAutomation llamado "IDAutomationHC39M.ttf" que puede usarse para generar códigos de barras. Por ejemplo...
![[IM Output]](../static/img/text/label_heart_80.gif)
|
magick -font IDAutomationHC39M -pointsize 16 label:'*314-76*' \
-bordercolor white -border 5x5 label_barcode.gif
![[IM Output]](../static/img/text/label_barcode.gif)
Aquí hay otros símbolos interesantes que he encontrado en varias fuentes de símbolos que he coleccionado por una razón u otra...
magick -pointsize 48 -font WebDings label:' " _ ~ ) - ' label_webdings.gif
magick -pointsize 48 -font LittleGidding label:' x o w ' label_ltgidding.gif
magick -pointsize 48 -font WingDings2 label:'ab' label_wingdings2.gif
magick -pointsize 48 -font Zymbols label:' ? , - I Z ' label_zymbols.gif
magick -pointsize 48 -font TattoEF label:' B Y D I H ' label_tatooef.gif
magick -pointsize 48 -font SoundFX label:' V 3 t f 9 ' label_soundfx.gif
Esto es solo una pequeña muestra de lo que hay disponible. Hay enormes bibliotecas de prácticamente cualquier símbolo, forma o imagen imaginable disponibles en la WWW para que las explores y descargues.
![[IM Output]](../static/img/text/label_soundfx.gif)
| Recuerda que cada carácter dibujado tiene dos partes separadas que se pueden dibujar: el área 'rellena' (que mostré arriba), y el 'trazo' o contorno, que puede verse muy diferente del área rellena. Cada una de estas áreas puede dibujarse por separado, o en colores diferentes, por lo que puede ser buena idea examinar un símbolo o forma prometedor más de cerca, de varias maneras. Puedes obtener un resultado muy sorprendente. Consulta Fuentes compuestas, Stroke para ver algunos ejemplos de cómo hacer esto.
| _Muchos creadores de fuentes de símbolos generan las formas usando un simple escáner y un convertidor de mapa de bits a vector, sin ningún diseño ni limpieza adecuados de la imagen o forma. Se recomienda precaución al observar dichas fuentes 'escaneadas'.
La última fuente mostrada arriba es uno de esos ejemplos de una fuente 'escaneada', dándole una pobre calidad 'punteada', en comparación con las otras fuentes diseñadas más adecuadamente._
---|---
Kerning entre caracteres
A partir de IM v6.4.7-8 puedes usar "[-kerning](https://imagemagick.org/command-line-options/#kerning)" para insertar espacio adicional entre caracteres entre cada letra en las cadenas de texto. Por ejemplo |
magick -pointsize 12 label:Anthony label_kerning_0.gif
magick -pointsize 12 -kerning 1 label:Anthony label_kerning_1.gif
magick -pointsize 12 -kerning 2.5 label:Anthony label_kerning_2.gif
magick -pointsize 12 -kerning 5 label:Anthony label_kerning_5.gif
magick -pointsize 12 -kerning -1 label:Anthony label_kerning-1.gif
![[IM Output]](../static/img/text/label_kerning-1.gif)
Observa que el valor de kerning puede ser un valor de punto flotante, o incluso un valor negativo. Para ver otro ejemplo de uso de un valor de "[-kerning](https://imagemagick.org/command-line-options/#kerning)" negativo, consulta el ejemplo de Fuente compuesta unida.
Espaciado entre palabras
También a partir de IM v 6.4.8-0 la opción "[-interword-spacing](https://imagemagick.org/command-line-options/#interword-spacing)" puede usarse para modificar el tamaño de un carácter de espacio usado entre palabras. Por ejemplo |
magick label:'I Love IM!' label_wspace_off.gif
magick -interword-spacing 1 label:'I Love IM!' label_wspace_1.gif
magick -interword-spacing 10 label:'I Love IM!' label_wspace_10.gif
magick -interword-spacing 25 label:'I Love IM!' label_wspace_25.gif
![[IM Output]](../static/img/text/label_wspace_25.gif)
Observa cómo no solo puedes aumentar el tamaño de un carácter de espacio entre las palabras, sino también disminuir el tamaño por defecto. Observa, sin embargo, que los espacios causarán que las palabras se realineen a los límites de píxel (a diferencia del Kerning entre caracteres anterior), por lo que la salida de una etiqueta con espacios establecidos a cero seguirá siendo distinta de una etiqueta que no contiene ningún espacio en absoluto. Tanto el Kerning entre caracteres como el Espaciado entre palabras también afectarán a los resultados de la capacidad de IM de ajustar automáticamente una cadena de texto a una imagen de tamaño específico. |
magick -size 150x label:'I Love IM!' label_wsize_of.gif
magick -size 150x -interword-spacing 25 label:'I Love IM!' label_wsize_25.gif
magick -size 150x -interword-spacing 50 label:'I Love IM!' label_wsize_50.gif
![[IM Output]](../static/img/text/label_wsize_50.gif)
Lo que sucede es que al establecer el "[-interword-spacing](https://imagemagick.org/command-line-options/#interword-spacing)", el tamaño del carácter 'espacio' ya no cambia con el resto del tamaño del texto. Así, cuando IM intenta calcular el mejor "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)", la cantidad de espacio entre cada palabra es fija, y por tanto no juega ningún papel en el ajuste del texto en el ancho fijo dado. En consecuencia, cuanto mayor sea el "[-interword-spacing](https://imagemagick.org/command-line-options/#interword-spacing)", menor será el tamaño de fuente necesario para ajustar realmente la línea de texto en el mismo ancho de imagen especificado. Se puede usar un valor negativo, y de hecho puede usarse para hacer que las palabras se solapen, o producir efectos inusuales usando caracteres y fuentes específicos. Pero hazlo demasiado negativo y pueden colarse comportamientos indefinidos. Se aconseja precaución si pruebas esto. Aunque lo anterior no es un ejemplo de justificación de texto (aunque lo parezca), puedes usar estas opciones como punto de partida para proporcionar una justificación de texto adecuada. Si realmente necesitas ese nivel de formateado y justificación de texto, entonces es mejor que mires otros métodos de generar texto preformateado o Postscript, como el software "TeX" o "LaTeX" basado en línea de comandos. Mejor aún, podrías usar SVG (versión de la biblioteca rsvg), o el Lenguaje de marcado Pango (consulta más abajo), para generar texto justificado.
Espaciado entre líneas
A partir de IM v6.5.5-8 se añadió otra opción "[-interline-spacing](https://imagemagick.org/command-line-options/#interword-spacing)". Esta fue muy solicitada por los usuarios a la luz de los ajustes anteriores, y en muchos sentidos es mucho más útil. Básicamente añadirá o restará esta cantidad de píxeles entre las líneas individuales de texto. Es decir, puedes usarla para expandir o comprimir las líneas individuales de texto. Por ejemplo...
magick label:'First\nSecond' label_lspace_off.gif
magick -interline-spacing 5 label:'First\nSecond' label_lspace_5.gif
magick -interline-spacing 10 label:'First\nSecond' label_lspace_10.gif
magick -interline-spacing 20 label:'First\nSecond' label_lspace_20.gif
magick -interline-spacing -5 label:'First\nSecond' label_lspace-5.gif
magick -interline-spacing -10 label:'First\nSecond' label_lspace-10.gif
Para sacar el mejor provecho de este ajuste necesitas ser capaz de calcular el interlineado normal para una fuente específica. Esta es la definición real de "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)", que con la resolución actual o el ajuste "[-density](https://imagemagick.org/command-line-options/#density)" define el interlineado de una fuente. En realidad no define la altura real de la fuente ni el grosor de las líneas, aunque afecta a estos aspectos de una fuente en particular. Así que tomando una "[-density](https://imagemagick.org/command-line-options/#density)" de '72' puntos por pulgada, y sabiendo que por definición hay 72 'puntos' por pulgada, puedes calcular que una fuente de 12 puntos tendrá un interlineado de 12 píxeles. Con esa información puedes hacer 'doble espaciado' de tus líneas de texto de 12 puntos usando un ajuste de "-interline-spacing 12". Esto añadirá 12 píxeles adicionales entre líneas. |
magick -density 72 -pointsize 12 -interline-spacing 12 -font Arial \
label:'First\nSecond\nThird' label_lspace_double.gif
![[IM Output]](../static/img/text/label_lspace_double.gif)
Por supuesto, como se vio antes para el tamaño entre palabras, añadir un número constante de píxeles entre elementos de texto tenderá a hacer el texto más pequeño cuando se usa el manejo automático del tamaño de punto. Es decir, cuando se proporciona un "[-size](https://imagemagick.org/command-line-options/#size)" de imagen final sin un ajuste "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)". |
magick -size x70 -interline-spacing 18 -font Arial \
label:'First\nSecond\nThird' label_lspace_size.gif
![[IM Output]](../static/img/text/label_lspace_size.gif)
Usar un espaciado entre líneas negativo también puede usarse como un método rápido y aproximado de 'poner en negrita' verticalmente una línea, simplemente repitiendo esa línea, y restando 1 píxel más que la separación de la línea base. |
magick -density 72 -pointsize 12 -interline-spacing -13 -font Arial \
label:'Bolded Word\nBolded' label_lspace_vbold.gif
![[IM Output]](../static/img/text/label_lspace_vbold.gif)
Por supuesto, esto no funcionará si realmente quieres dos líneas, y no solo poner texto en negrita. También funciona mejor con una fuente de ancho fijo.
Caracteres de escape especiales en argumentos de texto
Ya hemos presentado los caracteres de escape especiales usados en varios argumentos de texto, arriba. Específicamente, puedes escapar caracteres especiales como saltos de línea usando la barra invertida '\', o puedes insertar información adicional en la cadena usando escapes de porcentaje '%', tal como se define en la página Propiedades de imagen. También hay un escape especial '@' que, si se usa al inicio de una línea, usará el resto del argumento de texto como un nombre de archivo del que leer los datos del archivo especificado (o STDIN si se usa '-'). |
Algunos sistemas (como ubuntu) deshabilitan el uso del escape '@{file}' mediante una política de seguridad. Escribe magick -list policy para ver qué políticas hay presentes en tu sistema y desde dónde se establecen. |
|---|---|
Estos caracteres de escape no solo afectan a "[-format](https://imagemagick.org/command-line-options/#format)", para uso de "magick identify" (así como "[-identify](https://imagemagick.org/command-line-options/#identify)" y "[info:](files.html#info)"), sino que también afectan a los generadores de texto a imagen "[label:](#label)" y "[caption:](#caption)", y controlan las opciones de configuración de metadatos de imagen "[-label](https://imagemagick.org/command-line-options/#label)", "[-comment](https://imagemagick.org/command-line-options/#comment)", "[-caption](https://imagemagick.org/command-line-options/#caption)". Y por último, también los usa "[-annotate](https://imagemagick.org/command-line-options/#annotate)". |
_Aunque la barra invertida '\' la usa el método 'text' de "[-draw](https://imagemagick.org/command-line-options/#draw)", los escapes de porcentaje '%' no, ya que interfiere con el manejo de imágenes SVG de ImageMagick. Esta fue una de las razones por las que se creó el operador "[-annotate](https://imagemagick.org/command-line-options/#annotate)" para IM versión 6. |
---|---
El otro punto importante sobre los caracteres de escape es que, si bien se usan para argumentos de texto en la línea de comandos, en ningún momento se aplican dentro de los datos que se leen desde un archivo de texto (normalmente leídos usando el escape '@'). Esto significa que no necesitas preocuparte por escapar 'escapes' para los datos de archivos de texto, pero también significa que tienes que procesar tú mismo los datos del archivo, fuera de IM, si necesitas insertar información en el texto. | _La protección del archivo de texto de entrada del manejo de escapes se finalizó en IM versión 6.3.3.
---|---
Por ejemplo, aquí establezco y luego reporto los metadatos 'label' y 'comment' de una imagen usando los dos métodos para establecer esa información desde un archivo de texto de origen. El archivo "info.txt" contiene la cadena
, (sin salto de línea final). |
magick -label @info.txt rose: -format '%l label' info:
magick -comment @info.txt rose: -format '%c set "' info:
magick rose: -set label @info.txt -format '%l caption' info:
magick rose: -set comment @info.txt -format '%c set "' info:
| ![[IM Text]](../static/img/text/file.txt.gif)
Observa que IM no expandió ninguna de las secuencias de caracteres de escape que leyó usando el escape de lectura de archivo '@'. Esto es importante, ya que significa que cada vez que IM lee texto desde un archivo, nunca manejará ningún carácter especial que estuviera presente en ese archivo.
IM lee los archivos de texto como texto literal, sin ningún escape
Desafortunadamente, esto también incluye cualquier salto de línea final que pueda estar presente en el archivo (o flujo) que se está leyendo. Esto puede dar lugar a una línea 'en blanco' adicional en la imagen resultante, cuando el texto de entrada tiene un salto de línea al final (una práctica muy común). Por ejemplo... |
echo "Anthony" | magick label:@- label_stdin.gif
![[IM Output]](../static/img/text/label_stdin.gif)
Como puedes ver, la etiqueta no solo contenía la cadena de entrada sino también una línea en blanco adicional debido al carácter de salto de línea que el comando "echo" añadió al final. Si no quieres ese salto de línea final, necesitarás eliminarlo tú mismo. Sin embargo, esto podría ser un asunto delicado, dependiendo de dónde y cómo se obtiene o crea el texto, y desde qué API ejecutes IM. La mejor manera es intentar no generar ese salto de línea final desde el principio. Por ejemplo, usando una bandera '-n' en "echo". |
echo -n "Anthony" | magick label:@- label_stdin_2.gif
![[IM Output]](../static/img/text/label_stdin_2.gif)
O usando algo que no añada saltos de línea adicionales a menos que lo solicites específicamente. |
printf "Anthony" | magick label:@- label_stdin_3.gif
![[IM Output]](../static/img/text/label_stdin_3.gif)
O puedes 'descartar' ese salto de línea final usando un ingenioso comando perl de una sola línea... |
echo "Anthony" | perl -0777 -pe 's/\n$//' |\
magick label:@- label_stdin_4.gif
![[IM Output]](../static/img/text/label_stdin_4.gif)
En otras APIs puedes buscar ese salto de línea final antes de alimentar el texto a un comando de IM mediante una 'apertura canalizada'.
Escapes de opción definidos por el usuario
Un problema importante es intentar usar información escapada de una imagen, en alguna otra imagen, como al generar una imagen "[label:](#label)" o "[caption:](#caption)" separada. Este es un problema muy difícil, y la solución actual (para una sola imagen) es crear una 'opción de usuario' especial, que se adjunta a una imagen que se está procesando. Este 'ajuste' puede entonces ser consultado por "[label:](#label)", "[caption:](#caption)" o "[-annotate](https://imagemagick.org/command-line-options/#annotate)", como una secuencia de escape de porcentaje, cuando sea necesario. Por ejemplo, aquí creo una imagen de etiqueta completamente nueva usando información de la imagen rose incorporada. Esa imagen de origen de información se elimina luego, aunque podría igualmente fácilmente añadir la nueva etiqueta a la imagen original. |
magick rose: \
-set option:roseinfo 'rose image\nsize = %w x %h\nwith %k colors' \
label:'%[roseinfo]' -delete 0 label_escape.gif
![[IM Output]](../static/img/text/label_escape.gif)
Sí, lo anterior es complicado, pero eso se debe a algunas limitaciones internas de la biblioteca central de IM que están involucradas. Consulta Acceder a datos de otras imágenes para más detalles.
Escapar los escapes
Si debes alimentar una cadena como argumento a IM (especialmente como una llamada a una API), pero no quieres que IM expanda los escapes, simplemente puedes 'escapar' los tres escapes usando una barra invertida '\' adicional. Observa que el '@' solo necesita ser 'escapado' si es el primer carácter, y por compatibilidad hacia atrás, los escapes de porcentaje también pueden escaparse duplicándolos. Es decir, '%%' producirá un solo porcentaje. Por ejemplo... |
magick -background lightblue -fill blue -font Candice -pointsize 48 \
label:'\@ \\n \% 5%% ' label_escapes.gif
![[IM Output]](../static/img/text/label_escapes.gif)
| Antes de IM versión 6.3.2, no podías usar una barra invertida para escapar un '@' inicial y desactivar la función de 'leer desde un archivo'. En ese caso, la única forma de escapar un '@' inicial era leerlo desde un archivo. Esto no era muy práctico en las APIs.
---|---
Aquí hay un ejemplo similar de 'escapar los escapes' para "[-annotate](https://imagemagick.org/command-line-options/#annotate)"... |
magick rose: -fill white -stroke black -font Candice -pointsize 20 \
-gravity center -annotate 0 '\@ \\n 5%%' annotate_escapes.gif
![[IM Output]](../static/img/text/annotate_escapes.gif)
Por supuesto, como se mostró antes, leer el texto desde un archivo (usando el escape '@') siempre se tratará como literal, sin ningún significado especial. Esto evita la necesidad de cualquier preprocesamiento del texto, solo cuídate de cualquier salto de línea final. |
echo -n '@ \n 5%' |\
magick rose: -fill white -stroke black -font Candice -pointsize 20 \
-gravity center -annotate 0 '@-' annotate_escapes_file.gif
![[IM Output]](../static/img/text/annotate_escapes_file.gif)
En otras palabras, al leer desde un archivo no tienes que preocuparte por escapar cosas, sino que puedes escribir exactamente el texto que quieres que IM use.
Escapes en versiones antiguas de IM
Las definiciones anteriores solo se finalizaron en IM versión 6.3.3. Antes de esto, los escapes a veces se manejaban en algunas opciones, y a veces no, según las solicitudes, problemas y quejas enviadas por los usuarios de IM. Este era especialmente el caso con respecto a los escapes de porcentaje con "[label:](#label)" y "[caption:](#caption)", que durante un período se consideraron 'sin sentido'. Por ejemplo, ver o no un '%c' en la siguiente imagen de etiqueta depende mucho de la versión (al menos antes de IM v6.3.3). |
magick -background lightblue -fill blue -font Candice -pointsize 48 \
label:'ab%cde' label_percent.gif
![[IM Output]](../static/img/text/label_percent.gif)
Que veas un 'abde' (escape de porcentaje aplicado) o un 'ab%cde' (porcentaje no aplicado) depende exactamente de qué versión de IM estés usando. | _En IM v6.2.4, los escapes de porcentaje se eliminaron de "[label:](#label)" y "[caption:](#caption)" por considerarse sin sentido.
Sin embargo, volvieron en IM v6.3.2, como una nueva construcción '%[fx:...]', que puede hacer referencia a cualquier imagen, lo que hizo que los escapes de porcentaje en los generadores de texto a imagen volvieran a ser útiles. Consulta Escapes de expresión FX._
---|---
Este asunto de 'qué se escapa' también era un problema con respecto al manejo de escapes desde archivos. Antes de IM v6.3.3, lo siguiente habría producido dos líneas, en lugar de una sola línea. |
echo -n ' Love \n/ Hate ' |\
magick -background lightblue -fill blue -font Ravie -pointsize 18 \
label:@- label_escapes_file.gif
![[IM Output]](../static/img/text/label_escapes_file.gif)
Como los resultados del manejo de escapes varían mucho de una versión a otra, en versiones de IM anteriores a v6.3.3, recomiendo que los scripts prueben su manejo de escapes, y se ajusten si es importante para el correcto funcionamiento de los programas. Si a alguien le gustaría crear una prueba automática para scripts de IM, por favor contribuye. O si encuentras dicha prueba, házmelo saber por favor.
Pango - Texto formateado básico
El codificador de texto "pango:" (totalmente funcional a partir de IM v6.7.6-3) funciona de forma muy parecida a los codificadores Label y Caption. Proporciona un lenguaje de formateado de texto limitado en sistemas en los que "Pango" está instalado. En sistemas Linux y MacOSX, pango es estándar; en Windows es opcional. Aquí hay un ejemplo simple sin usar ningún formateado especial de pango... |
magick -background lightblue pango:"Anthony Thyssen" pango.gif
![[IM Output]](../static/img/text/pango.gif)
Sin embargo, debes tener en cuenta que algunos de los Atributos de texto anteriores no funcionarán con pango, básicamente debido a sus requisitos de formateado de texto. Por ejemplo, aunque puedes establecer un color "[-background](https://imagemagick.org/command-line-options/#background)", no puedes establecer el fill por defecto, ni el undercolor, ni la fuente específica a usar. Esto se debe a que estos atributos se seleccionan en su lugar mediante el Lenguaje de marcado Pango (consulta más abajo). Se recomienda que uses "[-size](https://imagemagick.org/command-line-options/#size)" para definir los límites de ancho y alto de la imagen de salida, a los cuales pango ajustará automáticamente por palabras (o por caracteres, para el chino) el texto de entrada. |
magick -background lightblue -size 150 \
pango:"Anthony Thyssen is the main author of IM Examples" \
pango_size.gif
![[IM Output]](../static/img/text/pango_size.gif)
E incluso puedes hacer que Pango 'justifique' el texto correctamente usando el Define, "pango:justify"... |
magick -background lightblue -size 150 -define pango:justify=true \
pango:"Contributions to IM Examples are welcome via the IM Forum." \
pango_justify.gif
![[IM Output]](../static/img/text/pango_justify.gif)
Observa, sin embargo, que aunque el texto puede justificarse, los espacios y saltos de línea siguen siendo tenidos en cuenta por el formateador de texto. Además, pango entiende el uso de TABs (a diferencia de label y caption). |
printf "col1\tcol2\nabc\txyz\n123\t789" |\
magick -background lightblue pango:@- pango_tabs.gif
![[IM Output]](../static/img/text/pango_tabs.gif)
| Observa que aunque el comando "printf" anterior puede generar caracteres de tabulación, usando el escape '\t', IM no entiende el uso de dicho escape. Sin embargo, sí entiende la secuencia de escape '\n' en las cadenas.
---|---
Sin embargo, generar columnas usando TABs no funciona muy bien, ya que no puedes definir fácilmente los 'tabuladores' fuera de la API. Por ello, usar TABs de esta manera no se recomienda, salvo como sangría de líneas y párrafos.
Lenguaje de marcado Pango
El verdadero poder de pango, sin embargo, está en el lenguaje "Pango Markup", que está habilitado por defecto. Puedes desactivar el marcado de pango usando "-define pango:markup=false", pero entonces bien podrías estar usando Caption en su lugar. El "Pango Markup" es muy parecido a HTML, en que usas un conjunto de etiquetas de marcado "<...>" ocultas en el texto, que se usan para controlar cómo se debe formatear el texto. Aquí hay algunas guías sobre el Lenguaje de marcado (sin la basura de la API)
- The Pango Markup Language
- Pango Text Attribute Markup Language (de Gnome)
- Pango Text Attribute Markup Language (de GTK)
- Pango Script Gallery (ejemplos)
Por ejemplo... |
magick -background lightblue -gravity center -size 180x \
pango:"The <b>bold</b> and <i>beautiful</i>" \
pango_formatting.gif
![[IM Output]](../static/img/text/pango_formatting.gif)
La etiqueta "<span ... >" es la etiqueta principal a usar en el marcado de pango. Te permite controlar el tamaño, color y posición exactos del texto contenido. Por ejemplo...
magick -background lightblue \
pango:' Some <span size="49152" rise="-20480"
foreground="red" background="blue"
> Big Red on Blue </span> Text ' \
pango_span.gif
Observa que la mayoría de los valores numéricos se multiplican por un factor de 1024, por lo que el valor de "size="49152"" en el ejemplo anterior significa un tamaño de punto de texto de 48 puntos. Mientras que el rise negativo ("rise="-20480") significa bajar la posición del texto 20 puntos (o píxeles a 72 dpi). Pero en lugar de especificar un tamaño de punto para el texto, también puedo usar una etiqueta de tamaño especial como "size="x-large"". Consulta el código fuente del siguiente ejemplo. Cuídate de las comillas dentro de comillas en lo anterior. Las comillas dentro de las etiquetas son obligatorias. Sin embargo, los saltos de línea y el espacio adicional dentro de las etiquetas no participarán en el formateado del texto. Por ello, ocultar saltos de línea adicionales en etiquetas de marcado, o en un comentario de marcado "<!-- ... -->", puede ser muy útil. De nuevo, consulta el texto fuente del siguiente ejemplo. Como ejemplo final del poder del formateado de pango, aquí lo uso para formatear un archivo pre-preparado "[pango_test.txt](../static/img/images/pango_test.txt)". Este contiene la mayoría de las etiquetas de marcado de pango comunes que probablemente uses. Compara este archivo de marcado con la imagen resultante de abajo.
magick -gravity center pango:@pango_test.txt pango_test.png
Notas y problemas de Pango
- Gravedad
- No he podido conseguir que pango centre selectivamente solo una sola línea de texto. Solo puedes centrar todo, o nada, mediante el ajuste "
[-gravity](https://imagemagick.org/command-line-options/#gravity)". La razón de esto parece ser que pango está diseñado para generar etiquetas de texto separadas para aplicaciones. Es decir, los títulos normalmente se generan por separado del cuerpo principal del texto mostrado. Pango no está pensado para ser un motor de formateado de páginas de texto a gran escala. - Fuentes
- Pango puede cambiar de fuente a mitad del renderizado. Ya lo hace fácilmente para texto en negrita y cursiva. Sin embargo, la especificación de fuente es de GTK, y por ello usa un sistema diferente al de ImageMagick en general. Puedes averiguar más sobre las fuentes usando GTK, ejecutando el programa "gtk-demo", y haciendo doble clic en "Pickers" y el "Text Widget".
- Defines
- Hay muchos Defines especiales que pueden usarse para controlar globalmente varios aspectos del formateado de texto de pango. Actualmente están listados en los Formatos de archivo pseudo, aunque yo mismo no los he explorado todos. Estos son los que he usado...
-define pango:markup=false- Desactiva las etiquetas del lenguaje de marcado. Cualquier etiqueta se incluye entonces en la salida. No es posible ningún formateado de pango dentro del texto. Esto es especialmente útil para depurar, permitiéndote ver exactamente qué ve pango como su entrada.
-define pango:justify=true- Justifica el texto a lo ancho del tamaño de la imagen. Es decir, añade espaciado adicional entre palabras para que tanto el borde izquierdo como el derecho de un bloque de líneas de texto queden alineados.
Más información sobre Pango
| Para ver justo lo que es posible, consulta Pango Script Gallery Si haces algo interesante con pango, por favor contribuye. O bien envíame un correo (la dirección está en el pie de página), o publícalo en el Foro de discusión de IM. | En sistemas con pango instalado también puedes usar el comando "pango-view" para generar imágenes formateadas con pango. Sin embargo, su ajuste por defecto de 'densidad' o 'dpi' es el de tu pantalla (IM usa 72 dpi por defecto), por lo que puede variar de un host a otro. |
|---|---|
Text - Páginas de texto plano
El formato de entrada "text:" está diseñado para convertir texto plano en imágenes que consisten en una imagen por página de texto. Es el operador de entrada de 'texto paginado' de ImageMagick. En otras palabras, su propósito es convertir los archivos de texto preformateado más grandes en páginas, de forma muy parecida a como las impresoras imprimen texto plano en hojas de papel separadas. | _No confundas el formato de entrada de archivo "text:" con el formato de entrada similar "[txt:](files.html#txt)". Este último primero intentará leer el archivo como un formato de imagen de 'enumeración de píxeles de IM'.
Eso no significa que un archivo de texto plano con un ".txt" vaya a fallar. De hecho, ese archivo probablemente se convertirá como esperarías, ya que el formato de archivo "[txt:](files.html#txt)" recurrirá automáticamente al formato "text:" si no se reconoce una imagen enumerada.
_
---|---
Sin embargo, manejar el texto de esta manera tenía varios problemas. Primero, el texto se dibuja sobre un lienzo grande, dejándote con el problema de eliminar el espacio no usado, si ese espacio no se desea. El otro es que las líneas no se ajustan por palabras, sino que desbordarán el lienzo y se truncarán si son demasiado largas. Y por último, para archivos de texto muy largos, se generarán múltiples páginas (imágenes) a menos que se tomen algunas precauciones adicionales. Por otro lado, "text:" manejará prácticamente cualquier archivo de texto, sin modificar el tamaño final de la imagen producida, ni ajustar por palabras las líneas muy largas. Tampoco necesitas preprocesar ningún carácter especial como tendrías que hacer si usaras el texto en la línea de comandos. Por último, y más importante, si se usa una fuente de ancho fijo (como Courier), los archivos con columnas de datos espaciadas seguirán teniendo esos datos en columnas espaciadas. Básicamente, "text:" convertirá el archivo de entrada 'TAL CUAL'. | _Los datos de texto de entrada leídos del archivo se pasan esencialmente de forma directa a la biblioteca de fuentes para dibujar el texto UTF. Como consecuencia de esto, algunos caracteres de control pueden dibujarse usando 'glifos' inusuales. Esto incluye los caracteres TAB y FORMFEED, que, en el momento de escribir esto, la biblioteca 'freetype' interpreta mal.
Si esto es una preocupación, puede que prefieras preprocesar tu archivo de texto usando un programa de filtro, como "expand", para convertir los caracteres TAB en el número apropiado de espacios._
---|---
Al dibujar texto, se crea una página grande de tamaño 'carta' (o el tamaño o tipo de página especificado con "[-page](https://imagemagick.org/command-line-options/#page)") a la resolución actual (establecida con "[-density](https://imagemagick.org/command-line-options/#density)"). Por defecto (a 72 dpi) esto será de '612x792' píxeles de tamaño, lo cual para la mayoría de los propósitos es muy grande. Por ejemplo, aquí hay una conversión directa del manual con formato de texto plano del comando "magick" en una imagen (es grande, así que para verla selecciona la imagen de 'página' de la derecha)... |
man magick | col -b | expand | \
magick -font CourierNew text:- -delete 1--1 text_manpage.gif
| _Sin embargo, la conversión de manual a imagen anterior genera múltiples páginas (imágenes), así que Eliminé la segunda y las posteriores para quedarme solo con la primera página, en lugar de una animación GIF de todas las páginas.
También podría haber añadido un Modificador de lectura, '[0]' al nombre de archivo de entrada, como "text:-'[0]'", para decirle a IM que solo leyera la primera imagen generada. Aunque en este momento toda la selección de páginas sigue manejándose generando todas las páginas y eliminando las no deseadas._
---|---
Usé a propósito la fuente de 'ancho fijo' 'CourierNew' en lo anterior para preservar el formateado espaciado de caracteres que está presente en la página impresa. Observa cómo esta salida varía de la de caption: anterior. El aspecto general de esta imagen también puede mejorarse usando las mismas técnicas dadas en la sección Postscript a continuación. Si solo quieres saber cuán grande es, por ejemplo, una página 'A5' a 100 dpi, entonces este comando genera una sola página en blanco, de ese tamaño y devuelve su tamaño en píxeles. El nombre de archivo, "/dev/null", es un archivo especial de UNIX que siempre está vacío.
magick -page A5 -density 100 -units PixelsPerInch text:/dev/null \
-format 'Page Size at %x = %w x %h pixels' info:
Recortar páginas de texto
Como el texto se está 'dibujando' sobre un lienzo grande, probablemente querrás eliminar todo el espacio no usado producido. Esto puede hacerse usando las operaciones de imagen "[-trim](https://imagemagick.org/command-line-options/#trim)", "[+repage](https://imagemagick.org/command-line-options/#repage)", y luego, para que se vea razonable, volver a añadir algo de espacio en los bordes usando "[-border](https://imagemagick.org/command-line-options/#border)". Por supuesto, también necesitarás hacer coincidir el color "[-background](https://imagemagick.org/command-line-options/#background)" que usaste con el "[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)" que estás volviendo a añadir. ¿Suena complejo? Realmente no lo es, por ejemplo...
echo " Hello Cruel World " |\
magick -background lightblue -fill blue -pointsize 18 \
text:- -trim +repage -bordercolor lightblue -border 3 \
text_trimmed.gif
En el ejemplo anterior, "[-trim](https://imagemagick.org/command-line-options/#trim)" se usa para eliminar la enorme cantidad de espacio en blanco adicional en la imagen de página "text:". Sin embargo, esto también eliminará cualquier espacio inicial delante de una línea. No obstante, hay una técnica interesante que te permitirá hacer "[-trim](https://imagemagick.org/command-line-options/#trim)" de la imagen hasta el tamaño del texto realmente dibujado en la página, incluyendo cualquier espacio inicial y final en la entrada. Esto usa un ajuste especial "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)" (visto en detalle más adelante).
echo " Hello Cruel World " |\
magick -background white -undercolor lightblue -fill blue \
-pointsize 18 text:- -trim +repage \
-bordercolor white -border 3 text_boxed.gif
El espacio adicional en la parte inferior del texto es resultado del último carácter de 'salto de línea' en la entrada de texto, que crea una línea en blanco adicional en la imagen. Pero como puedes ver, se preservaron los espacios iniciales y finales del texto de entrada. Si usas un color de fondo transparente en lo anterior, puedes entonces aplanar la imagen recortada para convertir las áreas no dibujadas en el mismo color que el 'undercolor' usado.
echo " Hello Cruel World " |\
magick -background none -undercolor lightblue -fill blue \
-pointsize 18 text:- -trim +repage \
-bordercolor lightblue -border 3 \
-background lightblue -flatten text_box_trimmed.gif
El resultado de lo anterior (excepto por el "[-border](https://imagemagick.org/command-line-options/#border)" añadido) es en realidad casi exactamente lo que IM ahora produce usando un "[label:](#label)" y leyendo desde un nombre de archivo con escape '@'. Sin embargo, "[label:](#label)" lo hace de una forma más rápida y mucho más limpia (mediante la biblioteca "freetype" en lugar de una conversión postscript). Puedes especificar un tamaño de "[-page](https://imagemagick.org/command-line-options/#page)" más pequeño, ya sea en píxeles (consulta el siguiente ejemplo), o usando un tamaño de página de medio (como 'A5'), usando el ajuste de "[-density](https://imagemagick.org/command-line-options/#density)" o de resolución de píxeles. También puedes especificar el desplazamiento en el que empezar a dibujar el texto en la página, relativo a la esquina superior izquierda. Por ejemplo...
echo "This is a long line that shows that 'text:' does not word wrap." |\
magick -background lightblue -pointsize 18 \
-fill blue -page 320x95+50+10 text:-'[0]' +repage text_page.gif
| _Casi todos los demás operadores de creación de imágenes usan el ajuste "[-page](https://imagemagick.org/command-line-options/#page)" para establecer un 'lienzo' virtual más grande y un 'desplazamiento' para la imagen sobre ese lienzo, generalmente con el propósito de superponer imágenes o generar animaciones. Por esto, probablemente sea buena idea restablecer tu ajuste de página usando "[+page](https://imagemagick.org/command-line-options/#page)" después de cualquier operación "text:" o "ps:", o podrías obtener resultados inesperados con cualquier imagen secundaria que leas posteriormente en la misma línea de comandos.
Esto también es por lo que añadí un operador "[+repage](https://imagemagick.org/command-line-options/#repage)" al ejemplo anterior; de lo contrario, el texto queda desplazado, ¡y la imagen generada también queda desplazada!
Para más detalles sobre el uso de este desplazamiento consulta Atributos de imagen de página.
---|---
Observa cómo en el último ejemplo, cualquier línea de texto que sea demasiado larga para encajar en el ancho de la página desbordará la página, y no se 'ajustará'. Esto efectivamente recortará y descartará el final de las líneas. Además, si hay demasiadas líneas, entonces "text:" generará _múltiples páginas y por tanto múltiples imágenes, una para cada página generada por la traducción postscript del archivo de texto. Si solo te interesa la primera página de texto, o simplemente quieres evitar la posibilidad de múltiples imágenes, añade un '[0]' al nombre de archivo "text:", para decirle a IM que solo lea la primera página generada después de que el texto se haya convertido en imágenes (consulta el ejemplo anterior).
Postscript/PDF - Entrada de texto y gráficos preformateados
(u otros formatos de imagen vectorial)
Lo siguiente da una técnica estándar de manejo de imágenes vectoriales que puede usarse no solo para imágenes "PS:" (postscript), sino para todas las demás imágenes manejadas mediante gráficos vectoriales. Esto incluye formatos de imagen como: "PDF:" (formato de documento portátil), "[TEXT:](#text)" (texto plano paginado), e incluso "[SVG:](draw.html#svg)" (gráfico vectorial escalado) y "[WMF:](formats.html#wmf)". Este método puede ampliarse para darte un control muy fino de exactamente cómo se verá el texto como imagen. Por ejemplo, con el filtro 'texto a postscript' adecuado, puedes controlar el ajuste por palabras, las justificaciones, el manejo de múltiples fuentes, la negrita, los bordes, los títulos, los nombres de archivo, las fechas y otros adornos en la imagen postscript. Sin embargo, como esta sección trata de texto a imagen, significa que primero necesitas convertir tu texto en un archivo postscript formateado. Hay muchos programas externos que pueden usarse para hacer esto. Por ejemplo "a2ps", "enscript" o "pstext". Esencialmente puedes usar un procesador de textos (como 'OpenOffice' o 'Word', o incluso 'Notepad'), O si quieres un sistema de procesamiento de texto por lotes podrías usar 'TeX' y 'LaTeX' para generar tu texto preformateado (consulta Un sistema completo de procesamiento de texto más abajo). Todos estos programas están diseñados para manejar la complejidad de mezclar texto plano, en negrita, de diferente tamaño y fuente, junto con controles de ajuste por palabras, justificación y maquetación de párrafos. La salida de estos programas puede luego pasarse a IM para convertirla en una imagen del tamaño y calidad que desees. Así que primero generemos algo de postscript (convirtiendo texto de un programa personal de fortunas). |
mesgs LN-ManKzinWars | \
a2ps -q -1 --rows=10 --prologue=bold \
--center-title="Postscript via 'a2ps'" \
--header='' --left-footer='' --right-footer='' \
-o ps_version.ps
Ahora podemos convertir eso en una imagen, recortando el resultado (como en los ejemplos de "text:" de arriba) para eliminar las áreas en blanco sobrantes de la página/lienzo por defecto generada.
magick ps_version.ps'[0]' \
-trim +repage -bordercolor white -border 3 ps_version_raw.gif
Observa el uso de '[0]' para limitar la entrada solo a la primera página. Si tu imagen postscript genera múltiples páginas, aún será procesada por completo por el delegado "ghostscript", pero IM solo leerá la primera imagen devuelta, en lugar de generar múltiples imágenes, una imagen por página. Si tu postscript es muy grande, puede que prefieras usar otras utilidades postscript para limitar el número de páginas antes de procesarlo con IM y "ghostscript". Como puedes ver, el postscript convertido a la "[-density](https://imagemagick.org/command-line-options/#density)" por defecto de 72 dpi a menudo no se ve tan bien como debería, con solo una cantidad mínima de antialiasing. Este es particularmente el caso al tratar con fuentes postscript, que no están diseñadas para funcionar a estas bajas resoluciones. Para mejorar esto, puedes usar una técnica de Supermuestreo para generar una mejor imagen. En este caso pides a "ghostscript" que dibuje la página a una resolución más alta (o "[-density](https://imagemagick.org/command-line-options/#density)" de imagen). Luego puedes hacer "[-resample](https://imagemagick.org/command-line-options/#resample)" (un redimensionado especializado) para llevar esta imagen más grande de vuelta a una densidad de resolución de pantalla más 'normal'.
magick -density 196 ps_version.ps'[0]' -resample 72 \
-trim +repage -bordercolor white -border 3 ps_version.gif
El valor '196' es 3 veces los 72 dpi finales, lo que significa que cuando se usa "[-resample](https://imagemagick.org/command-line-options/#resample)" se fusionan aproximadamente 3×3 píxeles en cada píxel. Esto produce mejores píxeles de antialiasing a lo largo de los bordes del texto, mejorando el aspecto general del resultado. Observa también que usar una densidad o resolución más grande no es exactamente lo mismo que simplemente ampliar una fuente. Las definiciones de la fuente podrían tener ajustes para manejar situaciones de baja resolución. Por ejemplo, compara el agujero en la letra 'e' en las dos imágenes. La versión original es más nítida debido al manejo especial dentro de la fuente, aunque en general la versión supermuestreada posterior es más clara. Para más información consulta Resolución, tamaño de punto y tamaño real de la fuente más abajo. No tienes que usar los valores anteriores, ya que a veces un valor ligeramente diferente puede producir un resultado mejor o más deseable. Por supuesto, que "ghostscript" genere una imagen 2, 3, o incluso 4 veces más grande también significa que IM tardará 4, 9 o 16 veces más en generar la imagen. ¡También usará mucha más memoria y espacio temporal en disco! Pero los resultados generalmente valen la pena. La mejor idea es simplemente probarlo con tu propio documento, y ver qué te da los mejores resultados. Además, si necesitas más antialiasing, en lugar de usar una resolución de entrada aún más grande, podrías intentar desenfocar la imagen una cantidad de sub-píxel (digamos '-blur 0x0.7') antes de reducir su tamaño. También a veces he encontrado que una cantidad muy pequeña de enfoque (unsharp) después del redimensionado (una técnica común de photoshop) puede mejorar el resultado final general.
magick -density 196 ps_version.ps'[0]' \
-blur 0x0.7 -resample 72 -unsharp 0x0.7 \
-trim +repage -bordercolor white -border 3 ps_unsharp.gif
Pero yo tendría cuidado con estos ajustes, ya que podría empeorar las cosas.
Si quieres tener un fondo transparente en lugar de blanco, puedes especificar un ajuste de "[-channel](https://imagemagick.org/command-line-options/#channel)" de 'RGBA', para incluir el canal alfa en la imagen. Por supuesto, necesitarás usar un formato de imagen que pueda manejar colores semitransparentes.
magick -channel RGBA -density 196 ps_version.ps'[0]' -resample 72 \
-trim +repage -bordercolor none -border 3 ps_transparent.png
Observa que el banner sigue usando un color blanco apagado para sus fondos, en lugar de hacerse también transparente o semitransparente. Esto se debe a que el postscript generado en realidad dibuja ese fondo, reemplazando el fondo por defecto de la página (sea blanco o transparente). Hacer el fondo transparente de esta manera te permitirá superponer tu imagen postscript sobre un color de fondo específico.
magick ps_transparent.png -background skyblue -flatten ps_bgnd_color.gif
Usando un Método de composición alfa puedes incluso superponerla sobre una imagen de fondo específica, o un fondo en mosaico.
magick composite -tile bg.gif ps_transparent.png -compose DstOver \
ps_bgnd_tiled.gif
Como casi todas las impresoras postscript solo pueden oscurecer el papel o una transparencia para retroproyector (esto incluye las impresoras a color), cuando lo anterior se imprima, el banner se haría semitransparente automáticamente. Si también quieres que IM haga lo mismo que haría una impresora, puedes usar una composición alfa especial '[Multiply](compose.html#multiply)', para superponer la imagen de 'fondo blanco' sobre el fondo de 'papel' deseado.
magick composite -tile bg.gif ps_version.gif -compose Multiply ps_multiply.gif
Si tienes una imagen postscript a color, también puedes simular una impresora puramente en blanco y negro sobre papel coloreado usando el método de composición especial '[BumpMap](compose.html#bumpmap)'. Esto pasará a escala de grises la imagen de superposición de origen, antes de usar multiply para componer las imágenes juntas. También puedes generar el equivalente en escala de grises de una transparencia de retroproyector. Esto básicamente usa la imagen opaca de fondo blanco (de arriba) como una 'máscara' con la que establecer una imagen transparente con forma usando el Operador alfa de forma
magick ps_version.gif -negate -background black -alpha shape ps_overhead.png
Al igual que el convertidor "[text:](#text)" de arriba, el convertidor "ps:" también hace uso del ajuste "[-page](https://imagemagick.org/command-line-options/#page)" para establecer el tamaño del lienzo del 'soporte' de imagen sobre el que se dibuja la página. Aunque el desplazamiento proporcionado se ignorará. Sin embargo, como la mayoría de los archivos postscript definen internamente el tamaño del soporte de dibujo, esto normalmente no es necesario. | _La mayoría de los demás operadores de creación de imágenes usan el ajuste "[-page](https://imagemagick.org/command-line-options/#page)" para establecer un 'lienzo virtual' y un desplazamiento sobre ese lienzo virtual (por ejemplo, para generar animaciones GIF). Por ello, probablemente sea buena idea restablecerlo usando "[+page](https://imagemagick.org/command-line-options/#page)" después de usarlo para una operación de lectura de imagen "text:" o "ps:", de lo contrario, podrías obtener resultados inesperados con las imágenes posteriores.
Para más detalles sobre el uso de este desplazamiento consulta Atributos de imagen de página._
---|---
Como ejemplo práctico final, echa un vistazo a mi imagen del Tetraedro trazado por rayos (Ray Traced Tetrahedron). Pueden verse otras imágenes similares en Estudios sobre poliedros. La página de fondo se generó a partir de los mismos datos usados para producir el objeto matemático 3D mostrado. Los datos de texto se convirtieron usando "a2ps", luego se usó IM para convertir esto en una imagen. Sobre esta imagen se añadieron a la página otros dibujos lineales pre-preparados del mismo objeto matemático. Esta imagen final (guardada en formato 'targa' o TGA) se pasó luego al trazador de rayos "[PovRay](http://www.povray.org/)" para su inclusión en la imagen final o escena trazada por rayos.
Usar GhostScript directamente
Aunque esto no es estrictamente IM, Richard Bollinger ha informado de que ejecutar el delegado "ghostscript" directamente es mucho más eficiente, produciendo un procesamiento un orden de magnitud más rápido debido al menor manejo de archivos por parte de IM. Por ejemplo, en lugar de ejecutar...
magick -density 300x300 -compress Group4 file.ps file.tif
Puedes hacer que GhostScript lo haga directamente.
gs -dBATCH -dNOPAUSE -sDEVICE=tiffg4 -r300x300 \
-sOutputFile=file.tif file.ps
Esto evita la necesidad de que IM genere un archivo temporal grande (por seguridad y manejo de imágenes en canalización). Como resultado de esto, el uso directo de GhostScript puede ahorrar bastante manejo de archivos y procesamiento de E/S, y puede producir una mejora importante del rendimiento al procesar archivos postscript y PDF. Sin embargo, "ghostscript" no puede redimensionar imágenes (más allá de ajustar la densidad o resolución de salida) y probablemente no podrá producir la imagen en el formato de archivo de imagen que necesitas, o con la calidad que quieres. Pero siempre puedes pasar luego la salida de GhostScript a ImageMagick para terminar la tarea. Es decir, especialmente si quieres supermuestrear los resultados (entrada de mayor resolución, a salida redimensionada más pequeña). GhostScript puede ser un programa difícil de averiguar cómo usar, o de arreglar para tipos específicos de postscript. Cristy lucha constantemente con estos problemas en nombre de los usuarios de IM, y en esto ha hecho un esfuerzo soberbio. Desafortunadamente, al lidiar con las muchas cosas que pueden ocurrir (y ocurren), IM no puede proporcionar un método simplificado para postscript/PDF mediante GhostScript.
Draw - Dibujar texto sobre un lienzo existente
Al usar el operador de bajo nivel "[-draw](https://imagemagick.org/command-line-options/#draw)" para dibujar la fuente, obtenemos mucho más control, especialmente en cuanto a la posición exacta de la fuente, y el tamaño de la imagen en la que se dibuja.
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
-fill blue -draw "text 25,65 'Anthony'" text_draw.gif
Sin embargo, para usarlo necesitamos generar una imagen de fondo del tamaño apropiado para dibujar la fuente, lo que puede ser complicado al dibujar texto desconocido. Consulta Autodimensionado de imágenes de fuente para ver formas de resolver este problema. Muchas opciones adicionales, más allá de las opciones de texto estándar, también afectan a cómo "[-draw](https://imagemagick.org/command-line-options/#draw)" dibuja realmente el texto sobre una imagen. No solo puedes especificar un color "[-fill](https://imagemagick.org/command-line-options/#fill)", sino que también puedes especificar un "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)", así como un color de borde o "[-stroke](https://imagemagick.org/command-line-options/#stroke)", ambos desactivados por defecto (establecidos a un color de 'none'). El color "[-fill](https://imagemagick.org/command-line-options/#fill)" también puede reemplazarse por un patrón de imagen "[-tile](https://imagemagick.org/command-line-options/#tile)", mientras que el ancho del borde del trazo puede cambiarse usando "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)". Luego, la posición relativa del texto dibujado puede cambiarse con un ajuste "[-gravity](https://imagemagick.org/command-line-options/#gravity)". Por ejemplo, aquí usé muchas de las características adicionales que acabo de mencionar.
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
-tile bg.gif -undercolor dodgerblue -stroke navy -strokewidth 2 \
-gravity center -draw "text 0,0 'Anthony'" text_options.gif
| _A partir de IM versión 6.2.4, la operación "[-draw](https://imagemagick.org/command-line-options/#draw) text" ya no entiende el uso de '\n' como significado de salto de línea, ni el uso de los escapes de información de imagen de porcentaje '%'. (Consulta Drawing a Percent Bug).
Estas capacidades, y problemas, sin embargo, siguen disponibles en el nuevo operador de IM v6 "[-annotate](https://imagemagick.org/command-line-options/#annotate)". Consulta Operador de dibujo de texto Annotate más abajo._
---|---
Todas las opciones anteriores también pueden usarse dentro de la cadena "[-draw](https://imagemagick.org/command-line-options/#draw)" (MVG - Magick Vector Graphic). Sin embargo, si estableces la opción anterior dentro del argumento draw, esa opción solo se aplicará a esa cadena MVG draw específica. Además de esto, el formato MVG draw puede hacer mucho, mucho más, como rotación de texto y 'decoración' de fuentes, y por supuesto también puedes dibujar varias formas como círculos sobre la imagen. Por ejemplo, aquí dibujamos texto subrayado y rotado, superpuesto sobre un par de círculos de fondo.
magick -size 320x120 xc:lightblue \
-draw "fill tomato circle 250,30 310,30 \
fill limegreen circle 55,75 15,80 \
font Candice font-size 72 decorate UnderLine \
fill dodgerblue stroke navy stroke-width 2 \
translate 10,110 rotate -15 text 0,0 ' Anthony '" \
draw_mvg.gif
Si realmente quieres hacer el máximo uso de "[-draw](https://imagemagick.org/command-line-options/#draw)" para crear tu imagen, te sugiero que mires la Página de ejemplos de dibujo.
Caja de undercolor
El ajuste de color "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)", como se demostró arriba, y más abajo, coloreará el área de dibujo definida para ese carácter y fuente. Generalmente solo encaja el carácter dibujado. Este es particularmente el caso en los bordes izquierdo y derecho de la fuente dibujada, ya que los bordes superior e inferior suelen ser lo suficientemente grandes como para acomodar todos los caracteres. El área de dibujo básicamente representa los límites de la 'celda' del carácter que rodean el área en la que se dibuja la fuente. El uso principal de la opción "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)" es como una forma simple y rápida de limpiar un fondo 'ruidoso' alrededor del texto. Por ejemplo, mira Anotar sobre imágenes. Sin embargo, se recomienda que en ese caso también añadas un carácter de espacio adicional al inicio y al final de la cadena que se dibuja.
Desbordamiento de la caja delimitadora
Uno de los mayores problemas con los que probablemente te encontrarás al dibujar texto, o al manejar fuentes en general, es que no todas las fuentes obedecen las reglas normales. Un diseñador de fuentes puede 'dibujar' caracteres individuales (o 'glifos') en cualquier lugar relativo a la posición actual del texto (conocida como el carácter de inserción o caret). La posición de la fuente ni siquiera tiene que avanzar, y en algunas fuentes internacionales ¡incluso podría moverse hacia atrás! El resultado de esta libertad de diseño es que algunos 'glifos' no encajan dentro del área de dibujo definida que la fuente declara que el carácter ocupa, especialmente en fuentes inclinadas o de tipo escritura, donde algunas partes de las letras se extienden mucho más allá de los límites y dentro de las áreas usadas por los caracteres posteriores (o anteriores). La peor fuente que he visto en este sentido es la fuente 'LokiCola', que dibuja alrededor de la mitad de sus letras mayúsculas con largas colas onduladas, mucho más allá de los límites de las celdas de carácter individuales. La fuente básicamente asume que cada letra mayúscula irá seguida de 3 o más letras minúsculas. Para mostrar esto, dibujaré por separado varias de las letras mayúsculas de la fuente, permitiéndote ver cuán lejos podrían extenderse las letras más allá de los límites de 'undercolor' o de dibujo de la celda. También uso un par de ellas para formar el nombre de la fuente, para que puedas verlas tal como fueron diseñadas para usarse, y por qué desbordan sus cajas delimitadoras.
magick -size 500x200 xc:lightblue \
-font LokiCola -pointsize 72 -undercolor dodgerblue \
-draw "text 15,65 'L'" -draw "text 130,65 'C'" \
-draw "text 245,65 '1'" -draw "text 360,65 'H'" \
-gravity South -draw "text 0,10 'Loki Cola'" draw_undercolor.gif
Annotate - Operador de dibujo de texto
Con IM versión 6, se hizo disponible un nuevo operador de dibujo de fuentes, "[-annotate](https://imagemagick.org/command-line-options/#annotate)". Este operador es en muchos sentidos mucho más simple que usar una operación "[-draw](https://imagemagick.org/command-line-options/#draw) text", pero como usa la API (Interfaz de Programación de Aplicaciones) 'annotate()', también es más potente. Aunque el operador sí hace uso de las primitivas de "[-draw](https://imagemagick.org/command-line-options/#draw)", lo hace de una forma más compleja, como expandir caracteres de escape especiales para añadir información de imagen adicional e incluso múltiples líneas, y aplicar una transformación de sistema de coordenadas al texto dibujado para producir inclinaciones y rotaciones. Por esto, el operador es ahora el operador de dibujo de texto preferido para todo el dibujo de texto y anotación de imágenes de ImageMagick, y esto se refleja ahora en estas páginas de ejemplos. Aquí hay un ejemplo básico usando este operador.
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
-fill blue -annotate +25+70 'Anthony' annotate.gif
Una de las características adicionales del operador "[-annotate](https://imagemagick.org/command-line-options/#annotate)" es que puede rotar los ejes X e Y del texto dibujado completamente por separado entre sí. Esto se hace proporcionando el ángulo en el que rotar cada eje como un 'tamaño de imagen' en el argumento del operador. Solo para mostrar cuán compleja puede ser una sola operación "[-annotate](https://imagemagick.org/command-line-options/#annotate)", aquí hay una imagen enmarcada, con trazo e inclinada...
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
-tile bg.gif -undercolor dodgerblue -stroke navy -strokewidth 2 \
-annotate 0x20+20+67 'Anthony' annotate_opts.gif
En este ejemplo se dan los cuatro argumentos de annotate: rotación del eje X, rotación del eje Y, y la posición X e Y de la fuente sobre la imagen de fondo. Observa también que el patrón de relleno (establecido con "[-tile](https://imagemagick.org/command-line-options/#tile)") también está inclinado con la fuente. Esto se debe a que se dibuja usando un sistema de coordenadas sesgado/rotado, lo que también sesga el patrón de relleno con mosaico dentro del texto dibujado. Un ejemplo adicional de esta capacidad de sesgado es el ejemplo de Fuente con sombra sesgada. Compáralo con la Fuente inclinada creada con la cadena MVG "[-draw](https://imagemagick.org/command-line-options/#draw)" equivalente. Para ver una tabla que resume los efectos de la operación de sesgado de "[-annotate](https://imagemagick.org/command-line-options/#annotate)", consulta Uso del argumento de Annotate. Por ejemplo, aquí hay un texto ligeramente rotado...
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
-annotate 350x350+20+90 'Anthony' annotate_rotated.gif
| Observa que el ángulo dado a "[-annotate](https://imagemagick.org/command-line-options/#annotate)" debe ser positivo para que IM lo entienda correctamente). La excepción a esto es si se usa una forma de Argumento de geometría de 4 números separados por comas. Por ejemplo "-annotate '-10,-10,20,90' 'Anthony'", podría haberse usado en el último ejemplo.
---|---
Esto puede usarse para generar etiquetado condensado en ángulo. Por ejemplo... |
magick -size 100x60 xc:skyblue \
-annotate 300x300+20+50 "First" \
-annotate 300x300+35+50 "Second" \
-annotate 300x300+50+50 "Third" \
-annotate 300x300+65+50 "Fourth" \
-annotate 300x300+80+50 "Fifth" \
annotated_labels.jpg
![[IM Output]](../static/img/text/annotated_labels.jpg)
También puedes añadir otra información sobre la imagen actual a la cadena anotada usando caracteres de escape. Por ejemplo, sobrescribamos la imagen incorporada "rose:" con información sobre el tamaño de la imagen. Para centrar el texto en la imagen usamos un ajuste "[-gravity](https://imagemagick.org/command-line-options/#gravity)", y desactivamos todas y cada una de las rotaciones y desplazamientos usando un argumento "[-annotate](https://imagemagick.org/command-line-options/#annotate)" de '0'. |
magick rose: -fill white -stroke black -font Candice -pointsize 20 \
-gravity center -annotate 0 '%wx%h\nPixels' annotate_rose.gif
![[IM Output]](../static/img/text/annotate_rose.gif)
Para más información consulta Caracteres de escape especiales en argumentos de texto más abajo. Para ver otros ejemplos de anotar texto sobre una imagen más grande de varias maneras (como centrado en el lado, o rotado en la esquina inferior derecha) consulta Ejemplos prácticos de anotación de texto.
Lienzos de texto anotado dimensionados automáticamente
A menudo necesitas mucho más control del que "[label:](#label)" puede proporcionar. Por ejemplo, quieres usar una imagen de mosaico o degradado, lo que te obliga a Anotar el texto. Desafortunadamente, entonces necesitas saber de antemano el tamaño del lienzo que necesitas para tu Texto anotado. Aquí hay un ejemplo típico del problema. Cuando configuré por primera vez este comando, establecí mi tamaño con los resultados que quería, y al principio funcionó bastante bien. Pero luego obtuve esto...
magick -size 480x80 gradient:yellow-green \
-font ArialBkI -pointsize 70 -tile gradient:blue-red \
-annotate +10+65 'Gradient Fun' funfont_gradients.jpg
Desafortunadamente, al adivinar el tamaño del lienzo había escrito mal la palabra 'Gradient' en lo anterior (faltando la letra 'i'). Por supuesto, cuando corregí esa ortografía, el tamaño de mi imagen quedó ahora incorrecto, produciendo el resultado incorrecto mostrado arriba. Lo que necesitamos es ser capaces de usar el operador "[-annotate](https://imagemagick.org/command-line-options/#annotate)", pero con el lienzo dimensionado para encajar el Texto anotado. Una solución es usar un lienzo mucho más grande, y luego hacer "[Trim](crop.html#trim)" del fondo al tamaño correcto. También añadí un "[Border](crop.html#border)" para añadir un poco de espacio adicional alrededor de la fuente y el borde final de la imagen, para un mejor aspecto.
magick -size 800x120 xc:black -font Corsiva -pointsize 100 \
-tile tile_disks.jpg -annotate +20+80 'Psychedelic!' \
-trim +repage -bordercolor black -border 10 funfont_groovy.jpg
Este método es mucho mejor que intentar adivinar cuán grande debería ser tu imagen final, sin embargo, "[Canvas Trim](crop.html#trim)" no recortará un fondo de varios colores con mosaico. La mejor solución es crear el lienzo usando "[label:](#label)", para generar el lienzo del tamaño correcto. Luego se usa un Relleno de color con Draw para hacer un mosaico de una imagen sobre el lienzo (y el texto de la etiqueta), y por último Anotamos nuestro texto usando otra imagen de mosaico.
magick -font Ravie -pointsize 72 label:'Get Wet!' -border 10 \
-tile tile_aqua.jpg -draw "color 0,0 reset" \
-tile tile_water.jpg -gravity center -annotate +0+0 'Get Wet!' \
autosize_wet.jpg
| Observa que la posición del texto en una imagen "[label:](#label)" centrada puede no coincidir exactamente con la posición de una operación "[-annotate](https://imagemagick.org/command-line-options/#annotate)" centrada. Los dos métodos siguen algoritmos de procesamiento completamente diferentes, y por ello pueden no coincidir, especialmente cuando hay fuentes inusuales involucradas.
---|---
Autodimensionado usando una 'caja de undercolor'
En lugar de usar una imagen "[label:](#label)", puedes dibujar la fuente sobre un lienzo grande usando una Caja de undercolor y un ancho de trazo grande, antes de recortar el lienzo para que encaje. Por ejemplo
magick -size 500x100 xc:lightblue -font SheerBeauty -pointsize 72 \
-gravity center -undercolor white -stroke none -strokewidth 3 \
-annotate +0+0 ' Invitation ' -trim +repage -shave 1x1 \
invitation_box.jpg
La cantidad de espacio alrededor de la fuente puede ajustarse usando el ajuste "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)". El único requisito importante es que el lienzo inicial sea de un color diferente al color de fondo ('lightblue' en este caso) y sea más grande que el resultado final. Solo una advertencia, algunas fuentes dibujan caracteres muy fuera del área de dibujo del carácter individual. (Por ejemplo, consulta Caja de undercolor arriba). En este caso el resultado anterior funcionará, pero puede requerir que uses un lienzo transparente, y luego superpongas el resultado sobre blanco (usando una operación como "-background white -flatten", por ejemplo), para convertir las áreas no usadas y aún transparentes en blanco. Sin embargo, ese carácter probablemente estará tocando un borde de la imagen resultante. Básicamente, no puedes ganar en todas las situaciones, así que simplemente haz lo mejor que puedas.
Colorear una imagen de texto en escala de grises
Generé a propósito la imagen anterior como una imagen en blanco y negro en escala de grises, ya que esto puede usarse como una plantilla de enmascarado. A partir de una imagen pura como esta, puedes entonces colorear el fondo y el primer plano de la imagen ya sea por separado o ambos al mismo tiempo. Aquí, por ejemplo, uso el Operador Level by Colors, "[+level-color](https://imagemagick.org/command-line-options/#level-color)", para modificar globalmente los colores de la imagen y asignar al primer plano y al fondo colores con valores específicos.
magick invitation_box.jpg -colorspace sRGB \
+level-colors navy,lightblue invitation_colored.jpg
Por ejemplo, aquí uso Enmascarado por composición para reemplazar el fondo y el primer plano con imágenes de patrón.
magick invitation_box.jpg -colorspace sRGB \
\( +clone -size 300x150 -tile gradient:LightYellow \
-draw "color 0,0 reset" \) \
\( +clone -size 300x150 -tile plasma:tomato \
-draw "color 0,0 reset" \) \
-reverse -composite invitation_rose.jpg
El Operador Reverse en lo anterior se usa para reordenar las imágenes, de modo que la primera imagen se convierte en la tercera imagen de 'enmascarado' de la composición. La imagen de primer plano ("plasma:") se convierte entonces en la primera, y el fondo en la del medio. Para ver otras técnicas de coloreado de una imagen en escala de grises como esta, consulta Usar una máscara para limitar el área compuesta. De forma más general, consulta Usar máscaras con imágenes. Para ver otros métodos de generar degradados para mosaico, consulta Degradados de color, Puntos dispersos de color y Lienzos aleatorios.
Fuentes
En construcción
En cuanto a ordenar las rutas de fuentes, eso es simplemente ordenar las fuentes especificadas en
los archivos XML.
El punto de partida son las fuentes del sistema, seguidas del
archivo "type.xml" instalado en el sistema; en mi sistema este es "/etc/ImageMagick-6/type.xml".
Este archivo "type.xml" instalado en el sistema es típicamente solo una lista de 'include' de
otros archivos type-*. Y el orden de los includes especificará el orden de
las fuentes extra del sistema, frente a las fuentes de Ghostscript.
Después de ese archivo se buscan otros archivos "type.xml", como en directorios
'home', o incluso el directorio actual.
Las fuentes posteriores NO reemplazarán a las anteriores, por lo que si dos fuentes tienen ese
mismo nombre, solo la primera será tenida en cuenta por IM. (una medida de seguridad).
Para ver las fuentes cargadas usa
magick -list font
Lista la "Path:" del archivo type en el que se encontró cada lista de fuentes, pero las
rutas se listan en orden INVERSO, con las fuentes del sistema al final.
Tengo, por ejemplo, una fuente personal llamada "Courier", pero no aparece en
la lista anterior, ya que se definió después de la "Courier" que se encontró en el
área de "Fuentes del sistema", (que aparece al final de la salida anterior).
Por otro lado, mi propia fuente personal "CourierNew", sí aparece, ya que no
choca con ninguna fuente del sistema o definida en la configuración del sistema.
Para ver qué archivo de glifos de fuente se selecciona para alguna petición específica
usa...
magick -debug annotate xc: -font Courier \
-annotate 0 'Test' null: 2>&1 |
grep '^ *Font '
Determinar las métricas de fuente, sin usar una API
Una fuente en particular y sus caracteres individuales contienen mucha información. Dicha información puede ser muy útil de tener, especialmente si quieres usar IM para ensamblar el texto de muchas fuentes diferentes. También es importante recordar que la mayoría de las fuentes son fuentes proporcionales, lo que significa que cada carácter individual tendrá un ancho diferente, y un 'avance' natural diferente del carácter de inserción (o caret). Por ello, cada 'cadena' específica de caracteres se renderizará (dibujará) con una longitud diferente sin ninguna relación real con el número real de caracteres usados en la cadena. La excepción a esto son las fuentes de 'ancho fijo', como las fuentes "Courier", "Typewriter" o "Terminal", en las que todos los caracteres tienen el mismo ancho, permitiéndote generar columnas de texto fácilmente. El Ajuste de depuración "[-debug](https://imagemagick.org/command-line-options/#debug) annotate" puede usarse para hacer que IM reporte directamente las métricas de una fuente TTF, para una cadena específica. Por ejemplo...
magick -debug annotate xc: -font Candice -pointsize 24 \
-annotate 0 'Test' null: 2>&1 |\
grep Metrics: | fmt -w80
| Como puedes ver, obtienes una mezcla de información que puedes usar: desde los límites declarados de la cadena dibujada (que no son necesariamente los límites reales de la cadena), relativos al origen; hasta la cantidad que el 'caret' (origen) debería avanzar antes de dibujar la siguiente cadena. La salida de depuración completa (que es bastante verbosa, y no se muestra en lo anterior) también reporta el archivo de fuente realmente usado (dos veces), así que también puedes usarla para comprobar que tienes la fuente correcta. | El método "[-debug](https://imagemagick.org/command-line-options/#debug) annotate" se añadió a IM v6.3.9-2 |
|---|---|
Técnicas más antiguas
Esta salida de depuración, sin embargo, puede no ser conveniente, o puede que tengas que manejar versiones de IM más antiguas que esta versión. Los siguientes son ejemplos más antiguos en los que el texto se dibuja realmente de varias maneras y colores, y luego la información (como enteros) se extrae de la imagen resultante. Por ejemplo, averigüemos las dimensiones de la fuente 'Ravie' relativas a una línea base fija, a 72 puntos. Aquí está la imagen que vamos a estudiar, como referencia. En realidad no necesitas dibujarla y guardarla como imagen, ya que solo estamos extrayendo datos, no una imagen. Los colores de esta imagen se modificarán para que podamos mirar las partes blancas y negras por separado usando "[-trim](https://imagemagick.org/command-line-options/#trim)" para extraer las métricas usadas. |
magick -size 100x150 xc:lightblue -font Ravie -pointsize 72 \
-fill black -undercolor white -annotate +20+100 'A' font_drawn.gif
![[IM Output]](../static/img/text/font_drawn.gif)
Para las métricas básicas de la fuente, primero dibujamos la fuente con un color transparente ('None'), de modo que podamos medir y encontrar el tamaño y la ubicación de la caja delimitadora o área de dibujo de este carácter específico, para esta fuente. Observa que para la información de altura puedes simplemente dibujar cualquier cosa.
magick -size 100x150 xc:lightblue -font Ravie -pointsize 72 \
-fill none -undercolor white -annotate +20+100 'A' -trim info:
A partir de los resultados anteriores podemos ver que una fuente 'Ravie' a 72 puntos tendrá una altura total de caja delimitadora de 74 píxeles. La parte superior de la caja está a 42 píxeles de la parte superior de la imagen, ya que la línea base, que se posicionó en una coordenada y de 100 píxeles, hace que la caja empiece a 100 - 42 o 58 píxeles por encima de la línea base. Eso deja 74 - 58 o 16 píxeles para la caja delimitadora por debajo de la línea base, para los descendentes. |
Observa que no todas las fuentes limitan su dibujo a dentro de su caja delimitadora de dibujo definida. Sin embargo, algunas letras pueden extenderse muy fuera de esos límites. Esa es la razón por la que el ejemplo anterior establece un color "[-fill](https://imagemagick.org/command-line-options/#fill)" de 'none'. De esa manera, las fuentes mal comportadas no afectarán a las mediciones anteriores. |
|---|---|
Observa también que la distancia que separa las líneas (en realidad las líneas base) debería estar determinada puramente por el tamaño de punto de la fuente, y no tiene nada que ver con cómo se dibuja la fuente. En nuestro ejemplo, como la fuente tiene un tamaño de punto de 72 puntos, y un punto se define como 1/72 de pulgada, entonces las líneas base deberían estar separadas 1 pulgada. Con una resolución (densidad) de salida actual de 72 píxeles por pulgada, eso significa que las líneas base estarán separadas 72 píxeles. Curiosamente, eso significa que para esta fuente, con una caja delimitadora de 74 píxeles, la fuente tiene un solapamiento de dos píxeles para el área de dibujo entre las líneas de texto con interlineado simple adecuado. También a partir de las mediciones anteriores podemos ver que al dibujar la cadena "A" en esta fuente a este tamaño de punto, el siguiente carácter debería dibujarse 66 píxeles a la derecha del punto de inicio (conocido como el caret). Esta es la longitud 'lógica' de la cadena. Es decir, el 'caret' o punto de inicio para el siguiente carácter debería empezar en 20 + 66, o en '+86+100' (la línea base no cambia verticalmente). Ten en cuenta que algunas fuentes árabes pueden de hecho dibujar de derecha a izquierda, por lo que el desplazamiento del 'caret' será negativo. Eso nos da las métricas de fuente para el carácter 'A', pero ¿qué hay de las dimensiones físicas de la 'A' dibujada relativas al 'caret' o punto de inicio? Bueno, simplemente intercambia los dos ajustes de color... |
magick -size 100x150 xc:lightblue -font Ravie -pointsize 72 \
-fill black -undercolor none -annotate +20+100 'A' -trim info:
| En cuanto a la altura, el carácter estaba dentro de sus límites de dibujo definidos, con su altura yendo desde 100 - 43 o 57 píxeles por encima de la línea base (pegado contra su caja delimitadora) hasta 60 - 57 o solo 3 píxeles por debajo de la línea base de la fuente. En otras palabras, esta letra no tiene un 'descendente' dibujado en el área por debajo de la línea base. De esto podemos ver que la 'A' se dibuja desde 3 píxeles antes del caret (posicionado en +20, pero la imagen final está en +17), hasta 70 - 3 o 67 píxeles después de la posición del caret. En otras palabras, esta fuente es ligeramente más ancha que su caja delimitadora horizontal cuando se dibuja. Observa que aunque esto te da la longitud real de la cadena dibujada, esto es diferente del desplazamiento del caret necesario al concatenar texto (que está definido por la caja delimitadora de la cadena, y no por su longitud dibujada). En otras palabras, el texto debería concatenarse usando sus cajas delimitadoras, y no su tamaño de longitud realmente dibujado, como hemos hecho en otros ejemplos. Por supuesto, si obtienes una fuente muy mal comportada, puede que quieras comprobar cuán lejos se dibuja una cadena específica más allá de sus límites para que aún puedas proporcionar espacio para ella, digamos al final de una línea. | Las dimensiones extraídas de una fuente también variarán con el "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)" actual usado para dibujar la fuente. Si aumentas el tamaño del trazo del contorno, entonces las dimensiones (y el tamaño de la caja delimitadora) necesarias para dibujar la fuente también se expanden en la misma cantidad para acomodar el contorno más grueso. |
|---|---|
| Las dimensiones también varían con el sistema operativo (tipo y versión) y la versión de la biblioteca delegada de dibujo de fuentes que IM está usando en ese sistema, incluso cuando la misma biblioteca de fuentes y versión de IM no han cambiado. Se recomienda precaución cuando podrían usarse diferentes computadoras para el dibujo de texto, ya que los resultados pueden variar incluso para la misma fuente. | |
| --- | --- |
| Para más información consulta el documento TrueType Fundamentals (PDF). Esto muestra que incluso mis generalizaciones anteriores pueden no ser siempre ciertas, aunque generalmente es el caso. Observa que los ejemplos anteriores solo devolverán dimensiones en píxeles enteros, mientras que todas las dimensiones usadas por las fuentes son números de punto flotante. De hecho, si una fuente se dibuja siquiera desde un punto de inicio (caret) de píxel entero, puede depender de la aplicación, y afectar al aspecto resultante de la fuente. |
Crear líneas con estilos de fuente mixtos
Crear una sola línea usando múltiples fuentes, tamaños de punto y estilos no es algo para lo que IM esté realmente diseñado. Se vuelve aún peor cuando también empiezas a considerar cosas como la justificación de texto, el ajuste por palabras, y el ajuste alrededor de imágenes y otras cosas. Este es el tipo de cosa que programas como los procesadores de textos, navegadores web, e impresoras de documentos hacen muy bien, normalmente bajo interacción del usuario, pero pocos pueden hacerlo tan bien bajo control de programa. Una excepción a esto es "TeX", y su familia de programas (consulta Un sistema completo de procesamiento de texto más abajo), así que si te tomas en serio el procesamiento gráfico de texto, te sugiero que mires esta familia de programas. Otra alternativa es mirar varios programas de impresión 'bonita' de documentos, como un convertidor HTML. Puedes usarlos para convertir documentos generados por programas en postscript, que IM puede luego post-procesar felizmente en cualquier formato de imagen o estilo que quieras. "El Supremo" (de los foros de discusión de IM) ha creado una solución de API (usando la interfaz de la API C MagickWand) en su programa FontMetrics. y aquí hay un Ejemplo de salida de "FontMetrics".
Ahora bien, aunque la línea de comandos de IM no está diseñada para el 'procesamiento de textos', no significa que no puedas usarla para ello. Solo es más difícil. Aquí daré algunos ejemplos de mezcla de texto en diferentes fuentes y estilos, para dar a la gente un punto de partida. La solución más simple que la gente normalmente piensa es simplemente concatenar imágenes "[label:](fonts.html#label)" juntas...
magick -font LokiCola -pointsize 36 label:'LokiCola ' \
-font Candice -pointsize 24 label:'Candice ' \
-font SheerBeauty -pointsize 48 label:'SheerBeauty' \
+append wp_label_append.jpg
Sin embargo, como puedes ver, todas las imágenes están alineadas verticalmente a la parte superior de la imagen, y a menos que uses fuentes similares, no se verá muy bien. Alternativamente, puedes usar un truco de justificación al concatenar para alinearlas a lo largo de la parte inferior.
magick -size 1x50 xc:none +size \
\( -background white -font LokiCola -pointsize 36 \
label:'LokiCola ' \
-clone 0 +swap -background none -append \) \
\( -background white -font Candice -pointsize 24 \
label:'Candice ' \
-clone 0 +swap -background none -append \) \
\( -background white -font SheerBeauty -pointsize 48 \
label:'SheerBeauty' \
-clone 0 +swap -background none -append \) \
-delete 0 -gravity South -crop 0x50+0+0 +append \
-bordercolor none -border 1 -trim +repage \
-background white -flatten wp_label_bottom.jpg
Lo que esto hizo fue añadir algo de relleno adicional en la parte superior de cada etiqueta, y recortarlas todas a la misma altura antes de concatenarlas horizontalmente. Después de eso se usaron un simple "[-trim](https://imagemagick.org/command-line-options/#trim)" y un "[-flatten](https://imagemagick.org/command-line-options/#flatten)" para establecer la altura de la línea a la etiqueta más alta, y rellenar el fondo. Como puedes ver, esto produce un mejor trabajo, pero una fuente pequeña tiende a producir un comportamiento similar a subíndice, en lugar de texto correctamente alineado. Lo que realmente necesitamos hacer es alinear todas las cadenas de texto por sus 'líneas base', y eso es muy difícil sin acceso a más información textual. Esta información se obtiene fácilmente bajo una API de programa, pero es mucho más difícil desde la línea de comandos. Un método se muestra en la sección del ejemplo anterior. Sin embargo, es posible alinear las palabras por su línea base sin recopilar realmente la información de la línea base. Aunque las imágenes de texto "[label:](fonts.html#label)" no proporcionan ninguna pista sobre la línea base de la imagen, puedes dibujar específicamente las imágenes en una línea base fija. Sin una API tampoco puedes averiguar directamente cuán largo o alto es el texto dibujado, así que primero necesitas usar un lienzo que sea lo suficientemente grande para asegurarte de que no perdemos ninguna información sobre la imagen de texto. Luego, para preservar los espacios finales y la altura del texto, también tienes que hacer buen uso de la característica ("[-undercolor](https://imagemagick.org/command-line-options/#undercolor)") disponible para la anotación de texto y proporcionar un límite para el recorte de la imagen. Así que veamos cómo puedes hacerlo desde la línea de comandos.
magick -size 500x100 xc:none -fill blue -draw 'line 15,0 15,99' \
-undercolor white -fill black \
\( -clone 0 -font LokiCola -pointsize 36 \
-annotate +5+60 'Loki Cola ' \) \
\( -clone 0 -font Candice -pointsize 24 \
-annotate +5+60 'Candice ' \) \
\( -clone 0 -font SheerBeauty -pointsize 48 \
-annotate +5+60 'Sheer Beauty' \) \
-delete 0 -trim +repage +append \
-transparent blue -trim +repage \
-background white -flatten wp_draw_baseline.jpg
Como antes, el recorte de las imágenes se hace en dos pasos. Primero dibuja el texto sobre una imagen base que contiene una línea azul vertical. Así, cuando recortamos el texto, solo se recortará el ancho de la imagen de texto, dejando todas las palabras a la misma altura de línea base. Después de concatenarlas juntas, ahora podemos eliminar la línea de construcción azul haciéndola completamente transparente. Si estás generando solo una imagen en blanco y negro, la mejor manera sería simplemente extraer uno de los canales no azules en su lugar, lo que asegura que realmente obtengas toda la línea de construcción. Un segundo recorte recortará entonces las secciones superior e inferior, encogiéndola hasta la caja delimitadora más grande. Un aplanado final al mismo color que la caja delimitadora elimina entonces toda evidencia de su uso en la construcción de la línea. Como puedes ver, todo el texto está ahora correctamente alineado por línea base, independientemente de la fuente o el tamaño de punto usado. Por supuesto, en estos ejemplos solo usé texto negro sobre blanco. Pueden usarse otros colores, siempre que no interfieran con la línea de construcción y el fondo transparente usados para la alineación del texto. Con esta técnica ahora puedes generar líneas de texto con fuentes mixtas, y también concatenarlas todas verticalmente juntas en un documento más grande. También puedes ver que hacer todo esto es mucho trabajo, trabajo que normalmente está oculto al usuario por los procesadores de textos y navegadores web. Si planeas hacer mucho de este tipo de cosas, te sugiero que mires las alternativas que mencioné anteriormente.
Rellenar formularios
Tienes una imagen de algún formulario estándar para rellenar y quieres rellenar los campos que están en posiciones bien conocidas. Así que tienes un archivo de datos como "[text_data.txt](../static/img/images/text_data.txt)" mostrado aquí...
Los campos son: ancho del texto, gravedad (justificación), color, posición x, y y el texto real a colocar para este campo. Ahora puedes usar un simple script de shell en bucle para generar una etiqueta de texto como se describe arriba, asignando el texto apropiado en las posiciones de texto definidas en una imagen (de fondo) de formulario.
cat text_data.txt |
while read width gravity color pointsize x y text
do
magick -size ${width}x -gravity $gravity -fill $color -background wheat \
-pointsize $pointsize -page +${x}+${y} label:"${text}" miff:-
done |
magick -size 200x100 xc: - -flatten text_layered.jpg
La 'imagen de formulario' en este caso es solo una imagen en blanco, pero realmente podría ser cualquier cosa. También establecí el color de fondo de las etiquetas a 'wheat' para que el área rellenada sea visible, pero normalmente lo establecerías a none. Lo anterior no usa archivos temporales, sino que en su lugar usa una canalización de imágenes en formato MIFF. Este es un ejemplo de uso de un Formato de streaming de imágenes, en el que las imágenes individuales simplemente se concatenan juntas, una tras otra en un archivo o canalización. Esto es solo un punto de partida. Los campos del formulario pueden venir de algún archivo de definición, mientras que el texto a rellenar de una base de datos u otra fuente de datos. También pueden establecerse otros atributos como la fuente a usar, las rotaciones de texto, etc. También podrías incluir tanto ancho como alto, o si el texto debería ajustarse por palabras usando Caption en lugar de un Label. Consulta también Pins en un mapa para ver otro ejemplo de esta técnica, muy parecido al anterior.
Alternativas de procesamiento de texto
| La forma ideal de generar archivos de texto y documentos completamente formateados es usar ImageMagick como parte de un sistema más grande de procesamiento de imágenes y texto. Herramienta | se usa para... |
|---|---|
| ImageMagick | Procesamiento por lotes de imágenes y preparaciones |
| Gimp | Edición de imágenes con GUI para arreglar problemas puntuales |
| LyX | Procesamiento de textos con GUI, construido para generar... |
| LaTeX | Procesador de texto para documentos, y libros... |
| TeX | Formato de texto subyacente |
| (posiciona símbolos y fuentes en las páginas) | |
| Metafont | Generador de fuentes de TeX |
| Básicamente, ImageMagick puede hacer muchas cosas, eso no significa que sea la mejor herramienta para esas cosas. Para preparaciones de documentos más grandes, es mejor tratarlo solo como una parte de un todo más grande. Las distintas herramientas 'TeX' dadas arriba suelen ser una instalación estándar en la mayoría de los sistemas Linux, y pueden combinar texto e imágenes en un todo unificado. Más importante aún, mantiene el texto como texto, y formatea el texto apropiadamente, tal como especifiques, haciendo casi todo el trabajo duro de ajuste de palabras y páginas, y disposición con las imágenes. Pero sin llenar un archivo 'doc' con basura de formateado inútil. Tienes control total, o puedes dejar que tome las decisiones. Proporcionan una forma de generar cualquier tipo de documento, desde una simple página, boletín o incluso un libro completo. Si te tomas en serio la generación de documentos, entonces estas herramientas bien valen la pena de mirar y aprender. | |
| Pango (solo Linux y MacOSX) también proporciona una alternativa. Proporciona muchas características de procesamiento de texto a imagen no disponibles en ImageMagick. Por ejemplo, TABs, justificación, márgenes, encabezados, etc. Incluso tiene un lenguaje de marcado de algún tipo para permitir cambios de fuente en medio del texto. | |
| Otras soluciones también incluyen los muchos programas de conversión de texto a postscript, como "a2ps" que demuestro al generar un archivo postscript de ejemplo en Manejo de Postscript arriba. Este convierte y formatea muchos tipos diferentes de archivos de texto, con ajuste por palabras, negrita y control de tabulación, así como un encabezado, pie de página, borde y opciones de múltiples páginas razonablemente agradables. Por supuesto, esto es procesamiento de imágenes indirecto mediante un lenguaje intermedio Postscript o PDF. Otra es maquetar el texto usando SVG, o el Comando de dibujo de ImageMagick, aunque entonces necesitarás lidiar con la maquetación. Hay muchas herramientas por ahí para convertir texto en imágenes, y la mayoría pueden combinarse con ImageMagick para post-procesar la imagen de texto y fusionarla en tu imagen. Esto deja que ImageMagick siga con lo que mejor hace, el procesamiento de imágenes. |
![[IM Output]](../static/img/text/label.gif)
![[IM Output]](../static/img/text/label_file.gif)
![[IM Output]](../static/img/text/label_file_multiline.gif)
![[IM Output]](../static/img/text/caption.gif)
![[IM Output]](../static/img/text/caption_centered.gif)
![[IM Output]](../static/img/text/caption_height.gif)
![[IM Output]](../static/img/text/caption_height_toosmall.gif)
![[IM Output]](../static/img/text/caption_filled.gif)
![[IM Output]](../static/img/text/caption_multi_line.gif)
![[IM Output]](../static/img/text/caption_file.gif)
![[IM Output]](../static/img/text/caption_one_line.gif)
![[IM Output]](../static/img/text/caption_manual.gif)
![[IM Output]](../static/img/text/label_i8n.gif)
![[IM Output]](../static/img/text/label_utf8.gif)
![[IM Output]](../static/img/text/label_quotes.gif)
![[IM Output]](../static/img/text/label_unifun.gif)
![[IM Output]](../static/img/text/label_dingbats.gif)
![[IM Output]](../static/img/text/label_misc.gif)
![[IM Output]](../static/img/text/label_lspace_off.gif)
![[IM Output]](../static/img/text/label_lspace_5.gif)
![[IM Output]](../static/img/text/label_lspace_10.gif)
![[IM Output]](../static/img/text/label_lspace_20.gif)
![[IM Output]](../static/img/text/label_lspace-5.gif)
![[IM Output]](../static/img/text/label_lspace-10.gif)
![[IM Output]](../static/img/text/pango_span.gif)
![[IM Output]](../static/img/text/pango_test.png)
![[IM Text]](../static/img/text/page_size.txt.gif)
![[IM Output]](../static/img/text/text_trimmed.gif)
![[IM Output]](../static/img/text/text_boxed.gif)
![[IM Output]](../static/img/text/text_box_trimmed.gif)
![[IM Output]](../static/img/text/text_page.gif)
![[IM Output]](../static/img/text/ps_version_raw.gif)
![[IM Output]](../static/img/text/ps_version.gif)
![[IM Output]](../static/img/text/ps_unsharp.gif)
![[IM Output]](../static/img/text/ps_transparent.png)
![[IM Output]](../static/img/text/ps_bgnd_color.gif)
![[IM Output]](../static/img/text/ps_bgnd_tiled.gif)
![[IM Output]](../static/img/text/ps_multiply.gif)
![[IM Output]](../static/img/text/ps_overhead.png)
![[IM Output]](../static/img/text/text_draw.gif)
![[IM Output]](../static/img/text/text_options.gif)
![[IM Output]](../static/img/text/draw_mvg.gif)
![[IM Output]](../static/img/text/draw_undercolor.gif)
![[IM Output]](../static/img/text/annotate.gif)
![[IM Output]](../static/img/text/annotate_opts.gif)
![[IM Output]](../static/img/text/annotate_rotated.gif)
![[IM Output]](../static/img/text/funfont_gradients.jpg)
![[IM Output]](../static/img/text/funfont_groovy.jpg)
![[IM Output]](../static/img/text/autosize_wet.jpg)
![[IM Output]](../static/img/text/invitation_box.jpg)
![[IM Output]](../static/img/text/invitation_colored.jpg)
![[IM Output]](../static/img/text/invitation_rose.jpg)
![[IM Text]](../static/img/text/font_metrics.txt.gif)
![[IM Text]](../static/img/text/font_boxinfo.txt.gif)
![[IM Text]](../static/img/text/font_drawn.txt.gif)
![[IM Output]](../static/img/text/wp_label_append.jpg)
![[IM Output]](../static/img/text/wp_label_bottom.jpg)
![[IM Output]](../static/img/text/wp_draw_baseline.jpg)
![[IM Text]](../static/img/text/text_data.txt.gif)
![[IM Output]](../static/img/text/text_layered.jpg)