Exemples ImageMagick -- Gestion du texte
Créer des étiquettes de texte, ou ajouter du texte à des images, est probablement l'une des opérations les plus élémentaires et les plus courantes pour lesquelles ImageMagick est utilisé. C'est aussi l'une des plus simples, tout en laissant la place à des résultats très élaborés. À ce titre, c'est un bon point de départ pour explorer les capacités d'IM.
Les opérateurs de texte dans ImageMagick
ImageMagick offre un grand nombre de façons différentes de dessiner du texte à l'intérieur d'une image, ce qui illustre la polyvalence de cette bibliothèque de traitement d'images. Cette page détaille des méthodes et des styles précis pour dessiner du texte. Ce qu'il faut garder à l'esprit en étudiant ces exemples, c'est qu'ImageMagick est avant tout un convertisseur et un modificateur d'images. À ce titre, chacune des méthodes proposées n'est qu'un simple opérateur de dessin de texte, servant par exemple à ajouter des étiquettes et des mentions de copyright aux images. Voir Annoter des images. Tous les opérateurs de texte comprennent et utilisent aussi un ensemble de réglages standard de traitement du texte, tels que la "[-font](https://imagemagick.org/command-line-options/#font)" et la "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" à employer. Il y a également le réglage de couleur "[-fill](https://imagemagick.org/command-line-options/#fill)" et, pour un dessin de texte plus complexe, les couleurs "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)", "[-stroke](https://imagemagick.org/command-line-options/#stroke)" et "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)". Dans les cas où l'on crée réellement une nouvelle image, comme pour les étiquettes et les légendes, le réglage de couleur "[-background](https://imagemagick.org/command-line-options/#background)" est aussi utilisé. Enfin, il y a les modificateurs plus récents "[-kerning](https://imagemagick.org/command-line-options/#kerning)" et "[-interword-spacing](https://imagemagick.org/command-line-options/#interword-spacing)". Ce qu'ImageMagick n'est pas , c'est un processeur complet de texte et de documents mis en forme. Si vous voulez un traitement de texte poussé, mieux vaut recourir à un traitement de texte interactif complet, ou à un metteur en forme de texte par lot comme "TeX" (ou l'une de ses variantes ; voir Un système complet de traitement de texte plus bas). La sortie de ces programmes (généralement au format PostScript) peut ensuite être convertie en image, puis modifiée davantage par ImageMagick. Autrement dit, utilisez le bon outil pour le bon travail. Cela dit, une certaine gestion mixte des polices reste possible. Pour commencer, jetez un œil à Créer des lignes mêlant plusieurs styles de police, près du bas de cette page. Voyons maintenant les moyens de base pour transformer par magie du texte en images. Plus loin, dans la section suivante (Polices composées), nous verrons comment produire des effets de police intéressants.
Label - Étiquette de texte simple
Étiquettes de base
Créer une image de police à l'aide d'une image "label:" est la manière la plus courante de dessiner rapidement une police dans ImageMagick. Le plus grand avantage est qu'elle génère sa propre toile selon les réglages de couleur "[-background](https://imagemagick.org/command-line-options/#background)" et "[-fill](https://imagemagick.org/command-line-options/#fill)" en vigueur, avec une taille ajustée au texte dessiné. Par exemple, voici une étiquette générée typique.
magick -background lightblue -fill blue \
-font Candice -pointsize 72 label:Anthony \
label.gif
Ce qui précède est probablement l'usage le plus typique de label, avec un choix de police et une "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" qui définissent le résultat. Mais c'est de loin la façon la moins intéressante de générer des étiquettes de texte. |
L'image 'label:' générée aura aussi sa méta-donnée Propriété d'image 'label' fixée à la même chaîne. Certains formats de fichier, comme MIFF et PNG, enregistrent cette propriété particulière, qui peut ensuite être exploitée par d'autres programmes de traitement d'images. Pour un exemple d'utilisation de la méta-donnée 'label', voir Montage utilisant des méta-données enregistrées. |
|---|---|
Si vous précisez également une "[-size](https://imagemagick.org/command-line-options/#size)", l'image d'étiquette générée sera créée à cette taille. |
magick -background lightblue -fill blue -font Candice \
-size 165x70 -pointsize 24 label:Anthony label_size.gif
![[IM Output]](../static/img/text/label_size.gif)
Vous pouvez aussi utiliser "[-gravity](https://imagemagick.org/command-line-options/#gravity)" pour définir la position de l'étiquette à l'intérieur de cette boîte plus 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)
Bien sûr, si vous ne définissez pas de "[-size](https://imagemagick.org/command-line-options/#size)" pour l'étiquette, aucun espace supplémentaire ne sera disponible dans le "label:" généré pour que "[-gravity](https://imagemagick.org/command-line-options/#gravity)" puisse s'en servir, ce qui la rend plutôt inutile. Le problème d'utiliser À LA FOIS "[-size](https://imagemagick.org/command-line-options/#size)" et "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" ensemble, c'est que le texte pourrait « déborder » de la taille d'image spécifiée. |
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)
| Avant la version 6.5.2-4, IM ignorait complètement le réglage "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" si un réglage "[-size](https://imagemagick.org/command-line-options/#size)" était également fourni. C'est ce qui fait que le texte des images ci-dessus est dimensionné automatiquement selon la gestion du « meilleur ajustement » (voir la série d'exemples suivante).
---|---
Meilleur ajustement à l'image
La plus grande astuce pour utiliser les étiquettes afin de générer des images d'une "[-size](https://imagemagick.org/command-line-options/#size)" précise est de NE PAS spécifier de "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" pour l'étiquette. Quand c'est le cas, IM a toute latitude pour tenter de choisir une taille de police qui ajuste au mieux la taille d'image demandée. Autrement dit, le texte dessiné sera adapté pour tenir dans la taille donnée ! |
magick -background lightblue -fill blue -font Candice \
-size 165x70 label:Anthony label_size_fit.gif
![[IM Output]](../static/img/text/label_size_fit.gif)
Comme vous pouvez le constater, en fixant un réglage "[-size](https://imagemagick.org/command-line-options/#size)", vous pouvez vous retrouver avec un peu d'espace en trop à droite ou en dessous de l'image. | Lorsqu'IM crée une étiquette en « meilleur ajustement », la taille de police réellement employée est également enregistrée dans la Propriété d'image 'label:pointsize', ce qui vous permet de réutiliser cette information par la suite. Cela a été ajouté à IM v6.6.2-7, lors de la discussion sur le forum Pointsize Reporting
---|---
Vous pouvez toujours ajuster la position de l'étiquette dans cet espace supplémentaire en modifiant le réglage "[-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)
Bien entendu, si vous ne définissez pas de "[-size](https://imagemagick.org/command-line-options/#size)" pour l'étiquette, aucun espace supplémentaire ne sera disponible dans le "label:" généré pour que "[-gravity](https://imagemagick.org/command-line-options/#gravity)" s'en serve ; cela n'a donc de sens que lorsque vous demandez une taille d'image précise. Et maintenant la meilleure nouvelle. Si le réglage "[-size](https://imagemagick.org/command-line-options/#size)" que vous donnez ne contient que la largeur ou la hauteur de l'étiquette, la police sera ajustée pour tenir au mieux cette dimension donnée. L'autre dimension non spécifiée sera alors ajustée automatiquement pour s'adapter au texte ! |
magick -background lightblue -fill blue -font Candice \
-size 160x label:Anthony label_size_width.gif
![[IM Output]](../static/img/text/label_size_width.gif)
Concrètement, cela signifie que le "label:" ci-dessus fera toujours 160 pixels de large, avec la plus grande taille de police possible pour cette largeur. La hauteur de l'étiquette sera alors ajustée en conséquence. La même chose se produit si l'on spécifie la hauteur mais pas la largeur. |
magick -background lightblue -fill blue -font Candice \
-size x40 label:Anthony label_size_height.gif
![[IM Output]](../static/img/text/label_size_height.gif)
Cette étiquette fait 40 pixels de haut : la pointsize non définie du texte a été ajustée pour tenir cette hauteur, puis la largeur non définie a été fixée pour s'adapter au texte dessiné. Exactement comme on pouvait s'y attendre. Bien sûr, dans ce cas il n'y aura là encore que peu ou pas d'espace supplémentaire avec lequel un réglage "[-gravity](https://imagemagick.org/command-line-options/#gravity)" pourrait jouer.
Étiquettes sur plusieurs lignes
Le générateur "label:" peut (depuis IM version 6.2.5) produire des étiquettes multilignes. |
magick -background lightblue -fill blue -font Ravie -pointsize 20 \
label:'ImageMagick\nRules - OK!' label_multiline.gif
![[IM Output]](../static/img/text/label_multiline.gif)
Comme vous pouvez le voir, "label:" comprend l'usage de '\n' pour représenter des sauts de ligne. Cela veut dire qu'il vous faudra peut-être prétraiter votre texte d'entrée pour vous assurer que les éventuels caractères spéciaux sont échappés lorsque vous placez les données sur la ligne de commande. Voir Caractères d'échappement spéciaux dans les arguments de texte plus bas pour plus de détails. Comme "[-gravity](https://imagemagick.org/command-line-options/#gravity)" affecte aussi la génération de "label:" (depuis IM version 6.2.6), vous pouvez l'utiliser pour « justifier » des étiquettes multilignes. |
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)
Une caractéristique importante d'IM est qu'il peut lire les données de texte à utiliser depuis un fichier. Cela se fait en préfixant le nom de fichier par un caractère arobase '@', et en l'utilisant comme argument de chaîne. Par exemple, ici nous créons une étiquette à partir du fichier « message du jour » de ma station de travail...
magick -background lightblue -fill blue \
label:@/etc/motd label_file.gif
Vous pouvez aussi lire le texte d'une étiquette depuis le flux d'entrée standard. Par exemple, ici je transforme par magie la sortie d'un générateur de citations en une étiquette multiligne.
mesgs ImageResolution |\
magick -background lightblue -fill blue \
label:@- label_file_multiline.gif
Remarquez que le nom de fichier que j'ai utilisé était simplement un caractère '-'. Cela signifie que le fichier doit être lu depuis l'entrée standard. Rappelez-vous que vous pouvez utiliser '@_nomdefichier_' pour lire N'IMPORTE QUEL argument de chaîne de la ligne de commande dans IM. Cela inclut toutes les autres méthodes d'entrée de texte présentées plus bas. Toutefois, cela ne peut servir qu'à remplacer l'argument de chaîne dans son ensemble, et non une partie d'un argument de chaîne. Notez aussi que, dans les exemples ci-dessus, une ligne vide supplémentaire a été ajoutée à l'image d'étiquette. Cette ligne vide provient d'un saut de ligne final dans le fichier texte d'entrée. À moins de supprimer d'une manière ou d'une autre ce saut de ligne final du fichier d'entrée (voir l'exemple caption: ci-dessous pour une méthode qui corrige cela), "label:" aura toujours cette ligne vide issue des fichiers texte d'entrée. |
La plupart des versions plus anciennes d'IM (avant la v6.2.5) ne gèrent pas les étiquettes sur plusieurs lignes. Dans ces versions, les lignes auraient été mises bout à bout pour former une seule ligne, très très longue. |
|---|---|
Étiquettes verticales
Bien sûr, vous pouvez aussi ajouter vous-même des sauts de ligne dans le texte d'entrée. Par exemple, ici je prends un mot simple et j'ajoute un saut de ligne entre chaque lettre, pour créer un texte vertical centré. |
echo -n "Vertical" | sed 's/./&@/g; s/@$//' | tr '@' '\012' |\
magick -background lightblue -fill blue -font Ravie -pointsize 24 \
-gravity center label:@- label_vertical.gif
Notez que la commande "sed" ajoute un caractère '@' après chaque caractère, sauf à la fin de la chaîne. Le "tr" remplace ensuite les caractères '@' par des sauts de ligne. Cela suppose aussi que le texte d'entrée ne se termine pas par un saut de ligne, ce qui ajouterait un espace vide supplémentaire en bas de l'image obtenue. ![[IM Output]](../static/img/text/label_vertical.gif)
Les utilisateurs sous Linux, et donc de la version GNU de la commande "sed", peuvent supprimer le "tr" et remplacer le '@' par '\n' dans la commande sed, pour qu'elle insère directement les sauts de ligne entre chaque caractère. Voir aussi l'attribut spécial Espacement inter-lignes, qui peut servir à ajuster l'espace entre les caractères.
Caption - Étiquette avec retour à la ligne automatique
L'image "caption:" issue d'un texte d'entrée est en tout point semblable à "[label:](#label)", si ce n'est qu'au lieu d'agrandir la taille du texte pour l'adapter à un réglage "[-size](https://imagemagick.org/command-line-options/#size)" donné, elle renvoie automatiquement à la ligne les lignes longues qui ne tiennent pas dans la largeur "[-size](https://imagemagick.org/command-line-options/#size)" spécifiée. Le réglage "[-size](https://imagemagick.org/command-line-options/#size)" n'est toutefois pas facultatif : il doit au moins indiquer une largeur maximale en pixels. Par exemple, voici une légende à partir d'une longue ligne qui ne tiendra pas dans la largeur spécifiée.
magick -background lightblue -fill blue -font Corsiva -pointsize 36 \
-size 320x caption:'This is a very long caption line.' \
caption.gif
| L'image 'caption:' générée aura aussi sa méta-donnée Propriété d'image "caption" fixée à la même chaîne, ce qui vous permet de réutiliser cette information par la suite. Tous les formats de fichier image courants enregistreront cette information avec l'image. Voir Montage utilisant des méta-données enregistrées.
---|---
Par défaut, le texte est entièrement justifié à gauche ; cependant, depuis IM version 6.2.0, "caption:" respecte "[-gravity](https://imagemagick.org/command-line-options/#gravity)" à des fins de justification du texte.
magick -background lightblue -fill blue -font Candice -pointsize 40 \
-size 320x -gravity Center caption:'ImageMagick Rules OK!' \
caption_centered.gif
Si vous fournissez à la fois une hauteur et une largeur au réglage "[-size](https://imagemagick.org/command-line-options/#size)", la hauteur de l'image sera également fixée à cette valeur. Vous pouvez alors aussi utiliser le réglage "[-gravity](https://imagemagick.org/command-line-options/#gravity)" pour positionner le texte verticalement.
magick -background lightblue -fill blue -font Gecko -pointsize 32 \
-size 320x100 -gravity South caption:'Captions at their height!' \
caption_height.gif
Notez toutefois que si le texte ne tient pas (en hauteur) dans la "[-size](https://imagemagick.org/command-line-options/#size)" que vous avez spécifiée avec la "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" donnée, le texte débordera de la boîte. Le réglage "[-gravity](https://imagemagick.org/command-line-options/#gravity)" en vigueur déterminera naturellement quelle partie du texte est coupée. Par exemple, ceci est exactement identique à l'exemple précédent, mais avec une "[-size](https://imagemagick.org/command-line-options/#size)" d'image trop petite pour le résultat.
magick -background lightblue -fill blue -font Gecko -pointsize 32 \
-size 320x60 -gravity South caption:'Captions at their height!' \
caption_height_toosmall.gif
Légende en meilleur ajustement
Depuis IM v6.3.2, si vous fournissez à la fois la largeur et la hauteur de l'image finale, mais sans définir la "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" de la police (ou en désactivant la pointsize avec "[+pointsize](https://imagemagick.org/command-line-options/#pointsize)"), IM tentera d'ajuster automatiquement la taille de la police afin de remplir au mieux la "[-size](https://imagemagick.org/command-line-options/#size)" de l'image demandée. Par exemple, ici je demande à ImageMagick de remplir une zone assez grande...
magick -background lightblue -fill blue -font Candice -size 320x140 \
caption:'This text is resized to best fill the space given.' \
caption_filled.gif
Et maintenant une zone bien plus petite et plus étroite, pour la même police et la même chaîne de texte. |
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)
Notez que la SEULE différence entre les deux derniers exemples est la "[-size](https://imagemagick.org/command-line-options/#size)" de l'image générée. IM a adapté le texte et le retour à la ligne pour tenter de remplir au mieux la taille d'image spécifiée. C'est extrêmement utile pour faire tenir un morceau de texte inconnu dans un espace donné, sans qu'il déborde des limites de la zone. En interne, cela équivaut toutefois à exécuter caption plusieurs fois, IM cherchant la bonne taille de point pour remplir au mieux l'espace donné. En d'autres termes, cela peut souvent être 10 fois plus lent, voire davantage, que si vous fournissiez une "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" précise à utiliser.
Légendes avec paragraphes
L'opérateur d'image "caption:" (depuis IM v6.2.5) comprend l'usage de l'échappement shell '\n' (et il vous faut donc doubler l'antislash '\\' pour échapper les antislashs), qui signifie une nouvelle ligne ou un nouveau paragraphe. Avant cette version, les paragraphes distincts devaient être traités par des opérations "caption:" séparées.
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
Vous pouvez lire le texte à dessiner depuis un fichier, ou depuis l'entrée standard (issue d'une commande précédente dans un pipeline), à l'aide du préfixe de nom de fichier '@', tout comme nous pouvons le faire avec "[label:](#label)".
mesgs FilePrivate |\
magick -background lightblue -fill blue -pointsize 12 \
-size 320x caption:@- caption_file.gif
Comme vous pouvez le voir, les sauts de ligne dans le texte d'entrée seront (depuis IM v6.2.5) traités comme des séparateurs de paragraphe. Cela inclut les éventuels sauts de ligne finaux du fichier d'entrée. Bien sûr, "[label:](#label)" ne renverra pas les lignes à la ligne, mais les préservera. Si vous voulez vraiment qu'un fichier soit traité comme un seul paragraphe, il vous faudra remplacer les caractères de saut de ligne par un espace, afin que tout votre texte tienne sur une seule ligne. Par exemple, ici nous prenons le même texte, mais nous remplaçons les sauts de ligne par des espaces, puis nous réduisons toute suite d'espaces multiples entre les mots à un seul espace...
mesgs FilePrivate | tr '\012' ' ' | sed 's/ */ /g' |\
magick -background lightblue -fill blue -pointsize 12 \
-size 320x caption:@- caption_one_line.gif
Comme vous pouvez le voir, cela fonctionne bien mieux. Cependant, ce que l'on souhaite souvent, c'est traiter une ligne vide comme une rupture de paragraphe. Cela signifie qu'il faut supprimer tous les sauts de ligne, sauf ceux qui correspondent aux lignes vides. Voici une commande "sed" spéciale pour transformer par magie un tel texte dans le format requis par "caption:". Dans ce cas, le texte est la première page du manuel 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
| Il n'y a pas d'option de texte « justifié » pour caption. Mais le metteur en forme de textepango: (qui utilise une bibliothèque externe) dispose de cette fonctionnalité, et de bien d'autres encore.
---|---
Attributs du texte
À l'origine, les réglages qui affectaient la gestion du texte comprenaient : "[-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)" et "[-gravity](https://imagemagick.org/command-line-options/#gravity)". Nous avons déjà présenté plus haut bon nombre de ces contrôles d'attributs. Mais il existe d'autres contrôles d'attributs, moins souvent employés, et qui à l'origine n'affectaient pas la génération d'images de texte "label:" ou "caption:". Depuis IM v6.3.2, vous pouvez également utiliser "[-stroke](https://imagemagick.org/command-line-options/#stroke)", "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)" et "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)" avec "label:" ou "caption:". Par exemple, ici j'exploite quantité de réglages différents pour contrôler les attributs du rendu d'image de texte d'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)
Pour plus de détails sur ces réglages, voir Boîte de sous-couleur ci-dessous, et Stroke, StrokeWidth dans la section sur le dessin. | À l'heure actuelle, vous ne pouvez pas utiliser d'images de mosaïque définies avec "[-tile](https://imagemagick.org/command-line-options/#tile)", "[-fill](https://imagemagick.org/command-line-options/#fill)", "[-background](https://imagemagick.org/command-line-options/#background)" et "[-origin](https://imagemagick.org/command-line-options/#origin)", avec "label:" ou "caption:". Seules des couleurs unies peuvent être employées. Toute tentative en ce sens produira simplement une couleur indéfinie (noire).
---|---
Pointsize, densité et taille réelle de la police
Les pixels sont des points sur l'affichage ou dans une image, et c'est en cela qu'IM travaille. En revanche, les images sont imprimées à une résolution précise (indiquée en « points par pouce » (dpi) ou pixels par pouce (ppi)). Ainsi, la résolution d'une image influe sur la façon dont d'autres programmes la dimensionnent sur un support donné. Par exemple, elle affecte la taille physique de l'image dans le monde réel. La résolution (densité ou dpi) d'une image est sans rapport avec sa taille en pixels, ni avec la quantité de place qu'elle occupe en mémoire ou sur le disque. Elle est aussi, en général, sans rapport avec la plupart des opérations d'image d'IM. Ainsi, pour ImageMagick, la résolution n'est qu'un ensemble de nombres stockés avec l'image, et elle est normalement ignorée. Le seul moment où la résolution ou la densité d'une image devient pertinente, c'est pour les polices et pour la conversion des formats vectoriels comme PostScript, PDF, MWF, vers les formats d'images matricielles qu'IM gère. Le réglage "[-density](https://imagemagick.org/command-line-options/#density)" indique à IM combien de pixels (points) par pouce (ppi) sont présents sur le périphérique de sortie, ce qui lui permet ensuite d'ajuster la génération d'image et la taille des polices en conséquence. Par exemple, par défaut IM travaille avec un réglage "[-density](https://imagemagick.org/command-line-options/#density)" de 72 ppi, valeur typique pour l'affichage d'images sur un moniteur ou une page web. Comme la taille d'une police est spécifiée en « points » (via "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)") et que, par définition, 1 point vaut 1/72 de pouce, une police de 72 points devrait produire un texte d'environ 1 pouce de haut... |
magick -pointsize 72 label:Hello pointsize.gif
![[IM Output]](../static/img/text/pointsize.gif)
Cependant, la plupart des affichages modernes ont une meilleure résolution que cela, généralement entre 90 et 120 pixels par pouce (ppi). Ainsi... |
magick -density 90 -pointsize 72 label:Hello density.gif
![[IM Output]](../static/img/text/density.gif)
Devrait produire une étiquette d'1 pouce de haut sur un affichage à 90 dpi. C'est le cas sur le mien ! Vous pouvez mesurer la hauteur de ces images à l'écran pour vérifier la résolution de votre affichage. Comme le nombre de pixels par pouce est plus grand, la police dessinée est aussi naturellement plus grande en nombre de pixels dans l'image, ce qui produit une image plus grande. Différents programmes d'image ont souvent une densité par défaut différente, ce qui peut faire apparaître les polices différemment selon le programme qui les dessine, même à taille de point identique. Notez que "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" désigne en réalité l'interligne d'une police (en fait la hauteur de sa zone de dessin), et ne fait PAS référence à la hauteur réelle des lettres dessinées ! Ainsi une police peut paraître plus grande ou plus petite qu'une autre, à pointsize et densité identiques. Seul l'interligne des polices sera réellement le même, tout le reste dépendant de la police et de son concepteur. Ainsi, avec une "[-density](https://imagemagick.org/command-line-options/#density)" par défaut de 72 dpi (à laquelle 1 point = 1 pixel), une police de 12 points devrait avoir 12 pixels d'écart entre les lignes de base de deux lignes de texte. | Notez que la hauteur d'une image "[label:](#label)" générée est fondée sur la zone de dessin ou la boîte englobante de l'image, qui correspond souvent à l'interligne et à la pointsize de la police. Ce n'est pas toujours le cas : à ce titre, se contenter d'empiler verticalement des lignes de texte est en réalité une gestion incorrecte des polices !
---|---
Certaines polices peuvent même dépasser largement les limites normales d'interligne, s'étendant bien au-dessus, ou plus souvent en dessous, de l'interligne. C'est particulièrement vrai des polices de type écriture manuscrite. L'aspect d'une police est aussi influencé par sa "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" et sa "[-density](https://imagemagick.org/command-line-options/#density)". Doubler la pointsize d'une police ("-pointsize 24") produit une police d'apparence à peu près aussi grande qu'une police dont on aurait doublé la densité ou la résolution. Toutefois, comme une police est conçue pour avoir un certain aspect, l'épaisseur des traits d'une police peut ne pas beaucoup changer à une taille de point plus grande. Autrement dit, la police de plus grande taille est légèrement différente. Mais si vous vous contentez de doubler la densité ("-density 144"), une police de 12 points sera dessinée avec ses dimensions doublées, tout en gardant l'aspect de la police originale de 12 points, simplement dessinée à plus grande échelle avec un meilleur lissage des bords. Cependant, à très basse résolution, les limites physiques de la taille des pixels peuvent aussi influer sur l'aspect d'une police. Cela signifie que les traits fins peuvent s'épaissir aux densités plus basses, du fait de la grande taille de pixel que la densité définit. Le rapport entre « densité » et « pointsize » est une question très complexe, que seul un graphiste concepteur de polices professionnel peut pleinement comprendre et prendre en compte pour concevoir des polices qui la gèrent correctement. D'après Lithium des forums IM...
Je pense que c'est une caractéristique du moteur de rendu des polices TrueType. Un glyphe TrueType n'est pas seulement un ensemble de courbes : il peut contenir plusieurs niveaux de détail et des instructions qui ajustent les coordonnées des points selon la taille de sortie en pixels, ce qui est plus visible pour les petites tailles en pixels. De ce fait, un petit texte a un aspect différent (et plus net, on peut le remarquer) d'un grand texte réduit.
FUTURE Example: difference between font at same 'pixel' size, but different density and point size. Fondamentalement, augmenter l'un de ces facteurs tout en diminuant l'autre d'autant peut ne pas produire le même résultat. En particulier pour l'épaisseur des traits et le « style » global de la police. Mieux vaut ajuster le bon facteur selon ce que vous faites. Utilisez "[-density](https://imagemagick.org/command-line-options/#density)" pour mettre une police à l'échelle d'un périphérique de sortie, ou pour un redimensionnement ultérieur de la police, et utilisez "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" pour les changements de taille de police normaux. Si vous souhaitez en savoir plus sur les polices, jetez un œil au document TrueType Fundamentals (PDF), que j'ai trouvé très intéressant.
Limites de l'image d'étiquette
Avec certaines polices exotiques, la police peut employer des caractères étendus, et par le passé IM avait beaucoup de mal à créer des étiquettes pour ces polices. C'est-à-dire que le texte débordait de la toile fournie. Par exemple, voici deux lettres capitales dans une police 'LokiCola' évoquant une certaine boisson gazeuse célèbre. |
magick -background lightblue -fill blue -font LokiCola -pointsize 64 \
label:HC label_overflow_font.gif
![[IM Output]](../static/img/text/label_overflow_font.gif)
Comme vous pouvez le voir, IM parvient à contenir cette police dans une étiquette sans couper les fioritures d'attaque ou de fin de la police. | Avant IM v6.3.2, "[label:](#label)" aurait coupé l'attaque du 'H' et des parties des queues des deux caractères, dans l'exemple ci-dessus.
---|---
La raison de ce problème est que les « glyphes » de la police, ou descriptions de caractères, dessinent en dehors des limites définies par la police pour certaines lettres, ce qui leur permet de chevaucher (généralement au-dessus ou en dessous) les autres caractères de la police. C'est un problème lié à la façon dont la police elle-même est conçue et définie, et ce n'était pas la faute d'IM, même si IM gère désormais ces situations particulières au mieux des intérêts des utilisateurs. Dans d'autres situations, cela pourrait rester un problème, qu'on ne peut pas résoudre simplement du fait des interactions du texte multiligne. Pour plus d'informations, voir les exemples Débordement de la boîte englobante ci-dessous, pour une description plus précise.
Texte au format Unicode ou UTF8
Cette méthode pour fournir des arguments de chaîne à IM est très importante, car elle vous permet de faire des choses qui, autrement, seraient très difficiles à réaliser en ligne de commande. En particulier, gérer du « texte Unicode », ou sélectionner des caractères précis à l'aide de codes de caractères. Désormais, si vous pouvez saisir des caractères Unicode dans des commandes ou des scripts, vous pouvez les utiliser directement..
magick -background lightblue -fill blue -pointsize 32 \
label:' é è à ù ç Ö ÿ ‘ ’ “ ” ° ² ³ € x ÷ ' label_i8n.gif
Cependant, peu de gens ont un clavier ou un éditeur correctement configuré pour gérer la saisie de caractères Unicode. Même si vous ne pouvez pas saisir directement des caractères Unicode, une solution simple consiste à « copier-coller » les caractères voulus depuis un fichier texte UTF-8 existant, ou une page web. C'est ce que je fais ! Si le texte UTF-8 que vous voulez dessiner a déjà été généré, vous pouvez le lire directement depuis un fichier à l'aide de '@nomdefichier'. Par exemple, ici je crée une étiquette en chinois à partir d'un fichier texte chinois encodé en UTF-8 (sans saut de ligne final dans le fichier).
magick -background lightblue -fill blue -pointsize 48 \
-font ZenKaiUni label:@chinese_words.utf8 label_utf8.gif
| _La police utilisée dans l'exemple ci-dessus est spéciale : elle possède le jeu complet de glyphes chinois, comme les polices de Fedora Linux 'SimSun' (ou le fichier de police "gkai00mp.ttf"), "ZenKaiUni" (dans le fichier "ukai.ttf") ou "ShanHeiSunUni" (dans l'un des fichiers "uming.ttf", "zysong.ttf" ou "bsmi00lp.ttf").
Notez que la police Windows 'Mincho' (utilisée dans un exemple ultérieur) définit elle aussi de nombreux glyphes chinois, mais de façon incomplète. Si vous l'utilisez avec ce qui précède, vous obtiendrez des points d'interrogation pour les glyphes non définis.
Le script spécial "[imagick_type_gen](../static/img/scripts/imagick_type_gen)" a servi à trouver la police, extraire son nom propre, et l'ajouter dans un fichier de configuration "type.xml" d'ImageMagick.
_
---|---
Nous pouvons aussi générer des chaînes UTF-8 à partir de codes de caractères Unicode à l'aide du programme "printf" 'GNU' (sur les systèmes Linux), pour transformer par magie des numéros Unicode en la chaîne encodée UTF-8 correspondante, ici de vrais guillemets typographiques ouvrants et fermants (là encore, pas de saut de ligne final dans l'entrée UTF-8). Par exemple, ici je génère le texte UTF-8 à l'aide de codes de caractères Unicode, et je l'alimente via un pipeline de commande (lu depuis 'stdin' avec "@-"), plutôt que depuis un vrai fichier.
env LC_CTYPE=en_AU.utf8 \
printf "\u2018single\u2019 - \u201Cdouble\u201D" | \
magick -background lightblue -fill blue -pointsize 36 \
label:@- label_quotes.gif
Sur d'autres systèmes (comme Mac OSX et Windows), vous pouvez utiliser le "printf" de perl pour produire une chaîne de caractères encodée UTF-8 à partir de codes de caractères 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
Pour plus d'informations et pour rechercher les codes de caractères Unicode de diverses langues et symboles, voir Unicode Character Code Charts. Non seulement les caractères Unicode peuvent contenir des caractères internationaux, mais avec la bonne police vous pouvez aussi utiliser les jeux de « symboles » spéciaux qu'ils définissent. Le plus célèbre est la police de symboles 'DingBats'. Cette police est devenue si répandue qu'elle fait désormais partie du jeu de polices Unicode standard. Par exemple, ici j'extrais les 24 premiers caractères de la zone de symboles Unicode 'DingBats' à l'aide d'un script shell spécial "**[graphics_utf](../static/img/scripts/graphics_utf)**" que j'ai écrit pour générer un « bloc » de caractères Unicode sous forme de texte UTF-8.
graphics_utf -N 2701 2718 |\
magick -font Mincho -pointsize 32 label:@- label_dingbats.gif
Les points d'interrogation ci-dessus sont des caractères précis qui n'étaient définis ni par Unicode, ni dans la police Windows 'Mincho'. Plus précisément, le symbole qui faisait partie de la police 'dingbat' d'origine est présent dans Unicode, mais sous un autre code de caractère Unicode que le code dingbat attendu. Voir Dingbats Unicode Specification Chart pour plus de détails, ainsi que son renvoi vers le caractère Unicode correct à utiliser pour les caractères 'dingbat' « manquants ». Plutôt qu'un point d'interrogation, beaucoup de polices afficheraient simplement une boîte ou un caractère vide pour de tels caractères non définis. Si vous voyez trop de ces caractères, ou des caractères manquants dans votre sortie, vous devriez probablement utiliser une autre police. Parmi les autres jeux de symboles disponibles au sein de l'énorme jeu de polices de caractères Unicode figurent : les symboles runiques tolkiens, les symboles mathématiques, les chiffres romains, les flèches, le braille et les symboles techniques. C'est un vaste ensemble à explorer, et le script shell "**[graphics_utf](../static/img/scripts/graphics_utf)**" peut vous aider à le parcourir. Voici un autre exemple de caractères Unicode que la police Microsoft 'Mincho' peut rendre. Dans ce cas, depuis la section "Miscellaneous Symbols"...
graphics_utf -N 2620 2630 |\
magick -font Mincho -pointsize 40 label:@- label_misc.gif
Utiliser Unicode dans des scripts DOS est bien plus difficile que sous UNIX et LINUX. Des notes spéciales sur l'usage d'Unicode dans cet environnement ont été fournies par Wolfgang Hugemann, dans Windows Character Encoding.
Polices de symboles
Les 'polices de symboles' spéciales sont plus couramment employées par ceux qui recherchent des images de texte particulières. Elles sont bien plus petites que la grande police Unicode complète, car elles ne remplacent que les caractères ASCII standard normaux (lettres et chiffres) par un jeu de formes et d'images spécifiques, même si parfois (rarement) elles comportent aussi davantage de symboles dans la zone des méta-caractères latins. Les symboles de la police 'DingBat' ont débuté ainsi, mais comme indiqué plus haut, ils font désormais partie du jeu de caractères Unicode. Par exemple, un symbole que j'aime bien utiliser provient de la police "WebDings". C'est un joli symbole de « cœur ondulé », qui remplace le caractère 'Y' normal dans la définition de cette police...
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
L'important à retenir, c'est que toutes les polices TrueType sont en réalité un type particulier de Format d'image vectorielle. Avec plusieurs images (une par caractère) dans la police. Comme ce sont des images vectorielles, cela signifie que la police devrait vous permettre de « dessiner » un caractère, une forme ou un symbole à peu près à n'importe quelle taille (échelle), à l'aide des contrôles fournis par "[-size](https://imagemagick.org/command-line-options/#size)", "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)" et "[-density](https://imagemagick.org/command-line-options/#density)". Comme vous pouvez le voir ci-dessus, le 'cœur ondulé' peut être 'rendu' à peu près à n'importe quelle taille que je souhaite. Certaines polices sont très spécialisées. Par exemple, vous pouvez obtenir chez IDAutomation un fichier de police appelé "IDAutomationHC39M.ttf" qui permet de générer des codes-barres. Par exemple...
![[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)
Voici d'autres symboles intéressants que j'ai trouvés dans diverses polices de symboles que j'ai collectionnées pour une raison ou une autre...
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
Ce n'est là qu'un petit échantillon de ce qui existe. D'énormes bibliothèques de quasiment tous les symboles, formes ou images imaginables sont disponibles sur le WWW pour que vous puissiez les parcourir et les télécharger.
![[IM Output]](../static/img/text/label_soundfx.gif)
| Rappelez-vous que chaque caractère dessiné comporte deux parties distinctes qui peuvent être dessinées : la zone « remplie » (que j'ai montrée ci-dessus), et le « tracé » ou contour, qui peut avoir un aspect très différent de la zone remplie. Chacune de ces zones peut être dessinée séparément, ou dans des couleurs différentes ; il peut donc être judicieux d'examiner de plus près un symbole ou une forme prometteurs, de plusieurs façons. Vous pourriez obtenir un résultat très surprenant. VoirPolices composées, Tracé pour quelques exemples de ce procédé.
| _Beaucoup de créateurs de polices de symboles génèrent les formes à l'aide d'un simple scanner et d'un convertisseur bitmap vers vectoriel, sans réelle conception ni nettoyage de l'image ou de la forme. La prudence est de mise avec de telles polices « scannées ».
La dernière police montrée ci-dessus est un exemple d'une telle police 'scannée', ce qui lui donne un aspect « pointillé » de piètre qualité, comparée aux autres polices conçues plus proprement._
---|---
Crénage inter-caractères
Depuis IM v6.4.7-8, vous pouvez utiliser "[-kerning](https://imagemagick.org/command-line-options/#kerning)" pour insérer un espace inter-caractères supplémentaire entre chaque lettre des chaînes de texte. Par exemple |
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)
Notez que la valeur de crénage peut être un nombre à virgule flottante, voire une valeur négative. Pour un autre exemple d'utilisation d'une valeur "[-kerning](https://imagemagick.org/command-line-options/#kerning)" négative, voir l'exemple Police composée jointe.
Espacement inter-mots
Également depuis IM v6.4.8-0, l'option "[-interword-spacing](https://imagemagick.org/command-line-options/#interword-spacing)" peut servir à modifier la taille du caractère d'espace utilisé entre les mots. Par exemple |
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)
Notez que vous pouvez non seulement augmenter la taille d'un caractère d'espace entre les mots, mais aussi réduire la taille par défaut. Notez toutefois que les espaces réaligneront les mots sur des limites de pixels (contrairement au Crénage inter-caractères ci-dessus) : la sortie d'une étiquette dont les espaces sont réglés à zéro sera donc tout de même différente de celle d'une étiquette ne contenant aucun espace du tout. Le Crénage inter-caractères comme l'Espacement inter-mots affecteront aussi la capacité d'IM à ajuster automatiquement une chaîne de texte à une image de taille précise. |
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)
Ce qui se passe, c'est qu'en fixant "[-interword-spacing](https://imagemagick.org/command-line-options/#interword-spacing)", la taille du caractère 'espace' ne varie plus avec le reste de la taille du texte. Ainsi, lorsqu'IM tente de déterminer la meilleure "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)", l'espace entre chaque mot est fixe, et ne joue donc aucun rôle dans l'ajustement du texte à la largeur donnée. En conséquence, plus l'"[-interword-spacing](https://imagemagick.org/command-line-options/#interword-spacing)" est grand, plus la taille de police nécessaire pour faire tenir la ligne de texte dans la même largeur d'image spécifiée est petite. Une valeur négative peut être utilisée, et peut même faire se chevaucher les mots, ou produire des effets inhabituels avec des caractères et des polices particuliers. Mais si vous la rendez trop négative, des comportements indéfinis peuvent apparaître. La prudence est conseillée si vous essayez cela. Bien que ce qui précède ne soit pas un exemple de justification du texte (même si cela y ressemble), vous pouvez utiliser ces options comme point de départ pour réaliser une véritable justification du texte. Si vous avez réellement besoin de ce niveau de mise en forme et de justification, mieux vaut peut-être envisager d'autres méthodes de génération de texte préformaté ou de Postscript, comme les logiciels "TeX" ou "LaTeX" en ligne de commande. Mieux encore, vous pourriez utiliser SVG (version bibliothèque rsvg), ou le langage de balisage Pango (voir plus bas), pour générer du texte justifié.
Espacement inter-lignes
Depuis IM v6.5.5-8, une autre option a été ajoutée : "[-interline-spacing](https://imagemagick.org/command-line-options/#interword-spacing)". Elle a été très demandée par les utilisateurs à la lumière des réglages précédents, et à bien des égards elle est beaucoup plus utile. Fondamentalement, elle ajoute ou retranche ce nombre de pixels entre les différentes lignes de texte. Autrement dit, vous pouvez l'utiliser pour écarter ou rapprocher les différentes lignes de texte. Par exemple....
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
Pour tirer le meilleur parti de ce réglage, il vous faut pouvoir calculer l'interligne normal d'une police donnée. C'est la définition même de "[-pointsize](https://imagemagick.org/command-line-options/#pointsize)", qui, avec la résolution ou le réglage "[-density](https://imagemagick.org/command-line-options/#density)" en vigueur, définit l'interligne d'une police. Cela ne définit pas réellement la hauteur ou l'épaisseur des traits de la police, même si cela influe sur ces aspects d'une police donnée. Ainsi, en prenant une "[-density](https://imagemagick.org/command-line-options/#density)" de '72' points par pouce, et sachant que par définition il y a 72 'points' par pouce, vous pouvez calculer qu'une police de 12 points aura un interligne de 12 pixels. Avec cette information, vous pouvez « doubler l'interligne » de vos lignes de texte de 12 points en utilisant un réglage "-interline-spacing 12". Cela ajoutera 12 pixels supplémentaires entre les lignes. |
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)
Bien sûr, comme on l'a vu précédemment pour la taille inter-mots, ajouter un nombre constant de pixels entre les éléments de texte tend à réduire la taille du texte lorsque la gestion automatique de la pointsize est utilisée. C'est-à-dire lorsqu'une "[-size](https://imagemagick.org/command-line-options/#size)" d'image finale est fournie sans réglage "[-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)
Un espacement inter-lignes négatif peut aussi servir de méthode sommaire et rapide pour « graisser » verticalement une ligne, simplement en répétant cette ligne et en soustrayant 1 pixel de plus que l'écart entre lignes de 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)
Bien entendu, cela ne fonctionnera pas si vous voulez réellement deux lignes, et non simplement graisser le texte. Cela fonctionne aussi mieux avec une police à chasse fixe.
Caractères d'échappement spéciaux dans les arguments de texte
Nous avons déjà présenté plus haut les caractères d'échappement spéciaux utilisés dans divers arguments de texte. En particulier, vous pouvez échapper des caractères spéciaux comme les sauts de ligne à l'aide de l'antislash '\', ou insérer des informations supplémentaires dans la chaîne à l'aide des échappements pour cent '%', tels que définis sur la page Propriétés d'image. Il existe aussi un échappement spécial '@' qui, utilisé en début de ligne, traitera le reste de l'argument de texte comme un nom de fichier d'où lire les données du fichier spécifié (ou STDIN si '-' est utilisé). |
Certains systèmes (comme ubuntu) désactivent l'usage de l'échappement '@{file}' via une politique de sécurité. Tapezmagick -list policy pour voir quelles politiques sont présentes sur votre système et d'où elles proviennent. |
|---|---|
Non seulement ces caractères d'échappement affectent "[-format](https://imagemagick.org/command-line-options/#format)", pour son usage par "magick identify" (ainsi que "[-identify](https://imagemagick.org/command-line-options/#identify)" et "[info:](files.html#info)"), mais ils affectent aussi les générateurs de texte vers image "[label:](#label)" et "[caption:](#caption)", et contrôlent les options de réglage des méta-données d'image "[-label](https://imagemagick.org/command-line-options/#label)", "[-comment](https://imagemagick.org/command-line-options/#comment)", "[-caption](https://imagemagick.org/command-line-options/#caption)". Et enfin, ils sont aussi utilisés par "[-annotate](https://imagemagick.org/command-line-options/#annotate)". |
_Alors que l'antislash '\' est utilisé par la méthode 'text' de "[-draw](https://imagemagick.org/command-line-options/#draw)", les échappements pour cent '%' ne le sont pas, car ils interfèrent avec la gestion des images SVG d'ImageMagick. Ce fut l'une des raisons de la création de l'opérateur "[-annotate](https://imagemagick.org/command-line-options/#annotate)" pour IM version 6. |
---|---
L'autre point important au sujet des caractères d'échappement, c'est que, bien qu'ils soient utilisés pour les arguments de texte en ligne de commande, ils ne s'appliquent jamais aux données lues depuis un fichier texte (généralement lu à l'aide de l'échappement '@'). Cela signifie que vous n'avez pas à vous soucier d'échapper les « échappements » pour les données de fichier texte, mais cela veut aussi dire que vous devez traiter vous-même les données de fichier en dehors d'IM si vous avez besoin d'y insérer des informations. | _La protection du texte de fichier d'entrée contre la gestion des échappements a été finalisée dans IM version 6.3.3.
---|---
Par exemple, ici je définis puis rapporte les méta-données 'label' et 'comment' d'une image à l'aide des deux méthodes permettant de fixer cette information depuis un fichier texte source. Le fichier "info.txt" contient la chaîne
, (sans saut de ligne 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)
Remarquez qu'IM n'a pas développé les séquences de caractères d'échappement qu'il a lues à l'aide de l'échappement de lecture de fichier '@'. C'est important, car cela signifie qu'à chaque fois qu'IM lit du texte depuis un fichier, il ne gérera jamais les caractères spéciaux qui y étaient présents.
IM lit les fichiers texte comme du texte littéral, sans aucun échappement
Malheureusement, cela inclut aussi tout saut de ligne final éventuellement présent dans le fichier (ou le flux) lu ! Cela peut se traduire par une ligne 'vide' supplémentaire dans l'image résultante, lorsque le texte d'entrée comporte un saut de ligne à la fin (une pratique très courante). Par exemple... |
echo "Anthony" | magick label:@- label_stdin.gif
![[IM Output]](../static/img/text/label_stdin.gif)
Comme vous pouvez le voir, l'étiquette ne contenait pas seulement la chaîne d'entrée, mais aussi une ligne vide supplémentaire due au caractère de saut de ligne que la commande "echo" a ajouté à la fin. Si vous ne voulez pas de ce saut de ligne final, il vous faudra le supprimer vous-même. Cela peut toutefois s'avérer délicat, selon l'endroit et la manière dont le texte est produit ou créé, et selon l'API depuis laquelle vous exécutez IM. La meilleure solution est d'essayer de ne pas générer ce saut de ligne final dès le départ. Par exemple, en utilisant un indicateur '-n' avec "echo". |
echo -n "Anthony" | magick label:@- label_stdin_2.gif
![[IM Output]](../static/img/text/label_stdin_2.gif)
Ou en utilisant quelque chose qui n'ajoute pas de sauts de ligne supplémentaires, sauf si vous le demandez expressément. |
printf "Anthony" | magick label:@- label_stdin_3.gif
![[IM Output]](../static/img/text/label_stdin_3.gif)
Ou vous pouvez « jeter » ce saut de ligne final à l'aide d'un petit one-liner perl astucieux... |
echo "Anthony" | perl -0777 -pe 's/\n$//' |\
magick label:@- label_stdin_4.gif
![[IM Output]](../static/img/text/label_stdin_4.gif)
Dans d'autres API, vous pouvez repérer ce saut de ligne final avant de transmettre le texte à une commande IM via une 'ouverture en pipe'.
Échappements d'options définis par l'utilisateur
Un problème majeur est d'essayer d'utiliser des informations échappées d'une image dans une autre image, par exemple lors de la génération d'une image "[label:](#label)" ou "[caption:](#caption)" distincte. C'est un problème très difficile, et la solution actuelle (pour une seule image) consiste à créer une 'option utilisateur' spéciale, attachée à une image en cours de traitement. Ce 'réglage' peut alors être consulté par "[label:](#label)", "[caption:](#caption)" ou "[-annotate](https://imagemagick.org/command-line-options/#annotate)", sous forme de séquence d'échappement pour cent, au besoin. Par exemple, ici je crée une image d'étiquette entièrement nouvelle à partir des informations de l'image rose intégrée. L'image source de ces informations est ensuite supprimée, même si j'aurais tout aussi bien pu accoler la nouvelle étiquette à l'image d'origine. |
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)
Oui, ce qui précède est délicat, mais c'est dû à certaines limitations internes de la bibliothèque de base d'IM. Voir Accéder aux données d'autres images pour plus de détails.
Échapper les échappements
Si vous devez transmettre une chaîne comme argument à IM (surtout lors d'un appel d'API), mais que vous ne voulez pas qu'IM développe les échappements, vous pouvez simplement « échapper » les trois échappements à l'aide d'un antislash '\' supplémentaire. Notez que le '@' ne doit être « échappé » que s'il est le premier caractère, et, pour des raisons de compatibilité ascendante, les échappements pour cent peuvent aussi être échappés en les doublant. Autrement dit, '%%' produira un seul pour cent. Par exemple... |
magick -background lightblue -fill blue -font Candice -pointsize 48 \
label:'\@ \\n \% 5%% ' label_escapes.gif
![[IM Output]](../static/img/text/label_escapes.gif)
| Avant IM version 6.3.2, vous ne pouviez pas utiliser un antislash pour échapper un '@' initial afin de désactiver la fonction 'lire depuis un fichier'. Dans ce cas, la seule façon d'échapper un '@' initial était de le lire depuis un fichier. Ce n'était pas très pratique dans les API.
---|---
Voici un exemple similaire d'« échapper les échappements » pour "[-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)
Bien sûr, comme montré précédemment, la lecture du texte depuis un fichier (à l'aide de l'échappement '@') sera toujours traitée comme littérale, sans aucune signification particulière. Cela évite tout prétraitement du texte : contentez-vous d'écrire exactement le texte que vous voulez qu'IM utilise, en surveillant simplement les éventuels sauts de ligne finaux. |
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)
Autrement dit, lors d'une lecture depuis un fichier, vous n'avez pas à vous soucier d'échapper quoi que ce soit : vous pouvez écrire exactement le texte que vous voulez qu'IM utilise.
Échappements sur les versions plus anciennes d'IM
Les définitions ci-dessus n'ont été finalisées que dans IM version 6.3.3. Avant cela, les échappements étaient parfois gérés dans certaines options, et parfois non, selon les demandes, problèmes et réclamations envoyés par les utilisateurs d'IM. C'était particulièrement le cas pour les échappements pour cent avec "[label:](#label)" et "[caption:](#caption)", qui furent un temps jugés « dénués de sens ». Par exemple, le fait de voir ou non un '%c' dans l'image d'étiquette suivante dépend beaucoup de la version (du moins avant 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 vous voyiez 'abde' (échappement pour cent appliqué) ou 'ab%cde' (pour cent non appliqué) dépend précisément de la version d'IM que vous utilisez. | _À partir d'IM v6.2.4, les échappements pour cent ont été retirés de "[label:](#label)" et "[caption:](#caption)" comme étant dénués de sens.
Ils sont toutefois revenus dans IM v6.3.2, sous la forme d'une nouvelle construction '%[fx:...]', qui, en pouvant référencer n'importe quelle image, a rendu les échappements pour cent de nouveau utiles dans les générateurs de texte vers image. Voir Échappements d'expressions FX._
---|---
Ce problème de « ce qui est échappé » concernait aussi la gestion des échappements provenant de fichiers. Avant IM v6.3.3, le code suivant aurait produit deux lignes, plutôt qu'une seule. |
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)
Comme les résultats de la gestion des échappements varient énormément d'une version à l'autre, pour les IM antérieurs à la v6.3.3 je recommande que les scripts testent leur gestion des échappements et s'y adaptent si c'est important pour leur bon fonctionnement. Si quelqu'un souhaite créer un test automatique pour les scripts IM, merci de contribuer. Ou si vous trouvez un tel test, faites-le-moi savoir.
Pango - Texte mis en forme de base
Le codeur de texte "pango:" (pleinement fonctionnel depuis IM v6.7.6-3) fonctionne à peu près de la même manière que les codeurs Label et Caption. Il fournit un langage de mise en forme de texte limité sur les systèmes où "Pango" est installé. Sur les systèmes Linux et MacOSX, pango est standard ; sous Windows, il est facultatif. Voici un exemple simple sans utiliser de mise en forme pango particulière... |
magick -background lightblue pango:"Anthony Thyssen" pango.gif
![[IM Output]](../static/img/text/pango.gif)
Vous devez toutefois noter que certains des Attributs du texte précédents ne fonctionneront pas avec pango, essentiellement en raison de ses exigences de mise en forme du texte. Par exemple, si vous pouvez fixer une couleur "[-background](https://imagemagick.org/command-line-options/#background)", vous ne pouvez pas définir le fill par défaut, ni la undercolor, ni la police précise à utiliser. C'est parce que ces attributs sont sélectionnables via le langage de balisage Pango à la place (voir plus bas). Il est recommandé d'utiliser "[-size](https://imagemagick.org/command-line-options/#size)" pour définir des limites de largeur et de hauteur de l'image de sortie, auxquelles pango renverra automatiquement à la ligne (ou par caractère, pour le chinois) le texte d'entrée. |
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)
Et vous pouvez même faire en sorte que Pango 'justifie' correctement le texte à l'aide du 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)
Notez toutefois que, si le texte peut être justifié, les espaces et les sauts de ligne sont tout de même pris en compte par le metteur en forme du texte. Pango comprend aussi l'usage des TABs (contrairement à label et caption). |
printf "col1\tcol2\nabc\txyz\n123\t789" |\
magick -background lightblue pango:@- pango_tabs.gif
![[IM Output]](../static/img/text/pango_tabs.gif)
| Notez que si la commande "printf" ci-dessus peut générer des caractères de tabulation à l'aide de l'échappement '\t', IM ne comprend pas l'usage d'un tel échappement. Il comprend en revanche la séquence d'échappement '\n' dans les chaînes.
---|---
Cependant, générer des colonnes à l'aide de TABs ne fonctionne pas très bien, car on ne peut pas facilement définir les 'taquets de tabulation' en dehors de l'API. À ce titre, utiliser les TABs de cette façon n'est pas recommandé , sauf pour l'indentation de lignes et de paragraphes.
Langage de balisage Pango
La véritable puissance de pango réside toutefois dans le « balisage Pango », activé par défaut. Vous pouvez désactiver le balisage pango à l'aide de "-define pango:markup=false", mais autant utiliser Caption à la place. Le « balisage Pango » ressemble beaucoup à HTML : vous employez un ensemble de balises "<...>" cachées dans le texte, qui servent à contrôler la façon dont le texte doit être mis en forme. Voici quelques guides sur le langage de balisage (sans le fatras propre à l'API)
- The Pango Markup Language
- Pango Text Attribute Markup Language (de Gnome)
- Pango Text Attribute Markup Language (de GTK)
- Pango Script Gallery (exemples)
Par exemple.. |
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 balise "<span ... >" est la principale balise à utiliser dans le balisage pango. Elle vous permet de contrôler précisément la taille, la couleur et la position du texte qu'elle contient. Par exemple..
magick -background lightblue \
pango:' Some <span size="49152" rise="-20480"
foreground="red" background="blue"
> Big Red on Blue </span> Text ' \
pango_span.gif
Notez que la plupart des valeurs numériques sont multipliées par un facteur de 1024 : ainsi la valeur "size="49152"" dans l'exemple ci-dessus correspond à une pointsize de texte de 48 points. Tandis que le rise négatif ("rise="-20480"") signifie abaisser la position du texte de 20 points (ou pixels à 72 dpi). Mais au lieu de spécifier une pointsize pour le texte, je peux aussi employer une étiquette de taille spéciale telle que "size="x-large"". Voir le code source de l'exemple suivant. Attention aux guillemets à l'intérieur des guillemets ci-dessus. Les guillemets à l'intérieur des balises sont obligatoires. Cependant, les sauts de ligne et les espaces supplémentaires à l'intérieur des balises ne jouent aucun rôle dans la mise en forme du texte. À ce titre, cacher des sauts de ligne supplémentaires dans une balise de balisage, ou dans un commentaire de balisage "<!-- ... -->", peut être très utile. Voir là encore le texte source de l'exemple suivant. Comme dernier exemple de la puissance de la mise en forme pango, je m'en sers ici pour mettre en forme un fichier préparé à l'avance "[pango_test.txt](../static/img/images/pango_test.txt)". Celui-ci contient la plupart des balises de balisage pango courantes que vous êtes susceptible d'utiliser. Comparez ce fichier de balisage à l'image obtenue ci-dessous.
magick -gravity center pango:@pango_test.txt pango_test.png
Notes et problèmes concernant Pango
- Gravity
- Je n'ai pas réussi à faire en sorte que pango centre sélectivement une seule ligne de texte. Vous ne pouvez tout centrer, ou rien centrer, que via le réglage "
[-gravity](https://imagemagick.org/command-line-options/#gravity)". La raison en semble être que pango est conçu pour générer des étiquettes de texte distinctes pour des applications. Autrement dit, les titres sont généralement générés séparément du corps principal du texte affiché. Pango n'est pas censé être un moteur complet de mise en page de texte. - Fonts
- Pango peut changer de police en cours de rendu. Il le fait déjà aisément pour le texte gras et italique. Cependant, la spécification des polices provient de GTK, et utilise à ce titre un système différent d'ImageMagick en général. Vous pouvez en apprendre davantage sur les polices avec GTK en exécutant le programme "gtk-demo", puis en double-cliquant sur "Pickers" et "Text Widget".
- Defines
- Il existe de nombreux Defines spéciaux qui peuvent servir à contrôler globalement divers aspects de la mise en forme de texte pango. Ils sont actuellement listés sur les Pseudo formats de fichier, même si je ne les ai pas tous explorés moi-même. Voici ceux que j'ai utilisés...
-define pango:markup=false- Désactive les balises du langage de balisage. Les balises sont alors incluses telles quelles dans la sortie. Aucune mise en forme pango dans le texte n'est possible. C'est particulièrement utile pour le débogage, car cela vous laisse voir exactement ce que pango reçoit en entrée.
-define pango:justify=true- Justifie le texte sur toute la largeur de la taille d'image. C'est-à-dire qu'il ajoute un espacement intra-mots supplémentaire pour que les bords gauche et droit d'un bloc de lignes de texte soient alignés.
Plus d'informations sur Pango
| Pour voir tout ce qui est possible, voir Pango Script Gallery. Si vous faites quelque chose d'intéressant avec pango, merci de contribuer. Soit en m'écrivant (adresse dans le pied de page), soit en le publiant sur le Forum de discussion IM. | Sur les systèmes où pango est installé, vous pouvez aussi utiliser la commande "pango-view" pour générer des images mises en forme par pango. Toutefois, son réglage 'density' ou 'dpi' par défaut est celui de votre affichage (IM utilise 72 dpi par défaut), et il peut donc varier d'un hôte à l'autre. |
|---|---|
Text - Pages de texte brut
Le format d'entrée "text:" est conçu pour transformer par magie du texte brut en images composées d'une image par page de texte. C'est l'opérateur d'entrée de « texte paginé » d'ImageMagick. Autrement dit, son but est de transformer par magie les grands fichiers texte préformatés en pages, à peu près de la même façon que les imprimantes impriment du texte brut sur des feuilles de papier séparées. | _Nepas confondre le format d'entrée de fichier "text:" avec le format d'entrée "[txt:](files.html#txt)" similaire. Ce dernier tentera d'abord de lire le fichier comme un format d'image 'énumération de pixels IM'.
Cela ne veut pas dire qu'un fichier texte brut avec un ".txt" échouera. En fait, un tel fichier sera probablement converti comme vous vous y attendez, car le format de fichier "[txt:](files.html#txt)" se rabat automatiquement sur le format "text:" si aucune image énumérée n'est reconnue.
_
---|---
La gestion du texte de cette façon posait toutefois un certain nombre de problèmes. D'abord, le texte est dessiné sur une grande toile, ce qui vous laisse le problème de retirer l'espace inutilisé, si cet espace n'est pas souhaité. Ensuite, les lignes ne sont pas renvoyées à la ligne, mais déborderont de la toile et seront tronquées si elles sont trop longues. Et enfin, pour les fichiers texte très longs, plusieurs pages (images) seront générées, sauf si certaines précautions supplémentaires sont prises. En revanche, "text:" gérera à peu près n'importe quel fichier texte, sans modifier la taille finale de l'image produite, ni renvoyer à la ligne les lignes très longues. Vous n'avez pas non plus besoin de prétraiter les caractères spéciaux comme vous devriez le faire si vous utilisiez le texte en ligne de commande. Enfin, et c'est plus important, si une police à chasse fixe (comme Courier) est utilisée, les fichiers comportant des colonnes de données espacées conserveront ces données en colonnes espacées. Fondamentalement, "text:" transforme par magie le fichier d'entrée 'TEL QUEL'. | _Les données de texte lues depuis le fichier sont pour l'essentiel transmises directement à la bibliothèque de polices pour dessiner le texte UTF. Par conséquent, certains caractères de contrôle peuvent être dessinés à l'aide de 'glyphes' inhabituels. Cela inclut les caractèresTAB et FORMFEED que, au moment où j'écris ces lignes, la bibliothèque 'freetype' gère mal.
Si cela vous préoccupe, vous pouvez prétraiter votre fichier texte à l'aide d'un programme filtre, comme "expand", pour transformer par magie les caractèresTAB en le nombre d'espaces approprié._
---|---
Lors du dessin du texte, une grande page de taille 'lettre' est créée (ou la taille ou le type de page spécifié avec un "[-page](https://imagemagick.org/command-line-options/#page)") à la résolution en vigueur (fixée avec "[-density](https://imagemagick.org/command-line-options/#density)"). Par défaut (à 72 dpi), elle fera '612x792' pixels, ce qui pour la plupart des usages est très grand. Par exemple, voici une conversion directe du manuel au format texte brut de la commande "magick" en une image (elle est grande, donc pour la voir sélectionnez l'image 'page' à droite)... |
man magick | col -b | expand | \
magick -font CourierNew text:- -delete 1--1 text_manpage.gif
| _La conversion du manuel en image ci-dessus génère toutefois plusieurs pages (images), aussi j'aiSupprimé la deuxième et les suivantes pour ne garder que la première page, au lieu d'une animation GIF de toutes les pages.
J'aurais aussi pu accoler un Modificateur de lecture, '[0]', au nom de fichier d'entrée, comme "text:-'[0]'", pour dire à IM de ne lire que la première image générée. Bien qu'à l'heure actuelle, toute la sélection de pages se fasse encore en générant toutes les pages puis en supprimant celles dont on ne veut pas._
---|---
J'ai délibérément utilisé la police à 'chasse fixe' 'CourierNew' ci-dessus afin de préserver la mise en forme par espacement des caractères présente sur la page imprimée. Notez comme cette sortie diffère de celle de caption: plus haut. L'aspect global de cette image peut aussi être amélioré à l'aide des mêmes techniques données dans la section Postscript suivante. Si vous voulez simplement savoir la taille, par exemple, d'une page 'A5' à 100 dpi, cette commande génère une seule page vierge de cette taille et renvoie sa taille en pixels. Le nom de fichier "/dev/null" est un fichier UNIX spécial toujours vide.
magick -page A5 -density 100 -units PixelsPerInch text:/dev/null \
-format 'Page Size at %x = %w x %h pixels' info:
Rogner les pages de texte
Comme le texte est 'dessiné' sur une grande toile, vous voudrez probablement retirer tout l'espace inutilisé produit. Cela peut se faire à l'aide des opérations d'image "[-trim](https://imagemagick.org/command-line-options/#trim)", "[+repage](https://imagemagick.org/command-line-options/#repage)", puis, pour que cela ait un aspect correct, en réajoutant un peu d'espace en bordure à l'aide de "[-border](https://imagemagick.org/command-line-options/#border)". Bien entendu, il vous faudra aussi faire correspondre la couleur "[-background](https://imagemagick.org/command-line-options/#background)" que vous avez utilisée à la "[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)" que vous réajoutez. Cela paraît compliqué ? Ça ne l'est pas vraiment, par exemple...
echo " Hello Cruel World " |\
magick -background lightblue -fill blue -pointsize 18 \
text:- -trim +repage -bordercolor lightblue -border 3 \
text_trimmed.gif
Dans l'exemple ci-dessus, "[-trim](https://imagemagick.org/command-line-options/#trim)" sert à retirer la vaste quantité d'espace blanc supplémentaire dans l'image de page "text:". Cela retirera toutefois aussi les éventuels espaces de tête devant une ligne ! Il existe cependant une technique intéressante qui vous permet de "[-trim](https://imagemagick.org/command-line-options/#trim)" l'image jusqu'à la taille du texte réellement dessiné sur la page, y compris les éventuels espaces de tête et de fin de l'entrée. Elle utilise un réglage "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)" spécial (examiné en détail plus loin).
echo " Hello Cruel World " |\
magick -background white -undercolor lightblue -fill blue \
-pointsize 18 text:- -trim +repage \
-bordercolor white -border 3 text_boxed.gif
L'espace supplémentaire en bas du texte résulte du dernier caractère de 'saut de ligne' dans le texte d'entrée, qui crée une ligne vide supplémentaire dans l'image. Mais comme vous pouvez le voir, les espaces de tête et de fin du texte d'entrée ont été préservés. Si vous utilisez une couleur de fond transparente dans ce qui précède, vous pouvez ensuite aplatir l'image rognée pour transformer par magie les zones non dessinées en la même couleur que la 'undercolor' utilisée.
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
Le résultat de ce qui précède (hormis le "[-border](https://imagemagick.org/command-line-options/#border)" ajouté) est en réalité presque exactement ce qu'IM produit désormais à l'aide d'un "[label:](#label)" lisant depuis un nom de fichier échappé par '@'. Cependant, "[label:](#label)" le fait d'une manière plus rapide et bien plus propre (via la bibliothèque "freetype" plutôt qu'une conversion postscript). Vous pouvez spécifier une taille "[-page](https://imagemagick.org/command-line-options/#page)" plus petite, soit en pixels (voir l'exemple suivant), soit à l'aide d'une taille de page de média (comme 'A5'), via le réglage "[-density](https://imagemagick.org/command-line-options/#density)" ou de résolution en pixels. Vous pouvez aussi spécifier le décalage auquel commencer à dessiner le texte sur la page, par rapport au coin supérieur gauche. Par exemple...
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
| _Presque tous les autres opérateurs de création d'image utilisent le réglage "[-page](https://imagemagick.org/command-line-options/#page)" pour définir une 'toile' virtuelle plus grande et un 'décalage' de l'image sur cette toile, généralement dans le but de superposer des images ou de générer des animations. De ce fait, il est probablement judicieux de réinitialiser votre réglage de page à l'aide de "[+page](https://imagemagick.org/command-line-options/#page)" après toute opération "text:" ou "ps:", faute de quoi vous pourriez obtenir des résultats inattendus pour les images secondaires que vous liriez ensuite sur la même ligne de commande.
C'est aussi pourquoi j'ai ajouté un opérateur "[+repage](https://imagemagick.org/command-line-options/#repage)" à l'exemple ci-dessus ; sans quoi le texte est décalé, et l'image générée l'est aussi !
Pour plus de détails sur l'usage de ce décalage, voir Attributs de page d'image.
---|---
Notez comme, dans le dernier exemple, toute ligne de texte trop longue pour tenir dans la largeur de la page débordera de la page, et ne sera pas 'renvoyée à la ligne'. Cela rognera et jettera concrètement la fin des lignes. De même, s'il y a trop de lignes, "text:" générera _plusieurs pages et donc plusieurs images , une pour chaque page produite par la traduction postscript du fichier texte. Si seule la première page de texte vous intéresse, ou si vous voulez simplement éviter la possibilité de plusieurs images, ajoutez un '[0]' au nom de fichier "text:", pour dire à IM de ne lire que la première page générée après que le texte a été converti en images (voir l'exemple précédent).
Postscript/PDF - Entrée de texte et de graphiques préformatés
(ou d'autres formats d'image vectoriels)
Ce qui suit présente une technique standard de gestion d'images vectorielles, qui peut servir non seulement aux images "PS:" (postscript) mais aussi à toutes les autres images gérées à l'aide de graphiques vectoriels. Cela inclut des formats d'image comme "PDF:" (portable document format), "[TEXT:](#text)" (texte brut paginé), et même "[SVG:](draw.html#svg)" (scaled vector graphic) et "[WMF:](formats.html#wmf)". Cette méthode peut être étendue pour vous donner un contrôle très fin sur l'aspect exact du texte en tant qu'image. Par exemple, avec le bon filtre 'texte vers postscript', vous pouvez contrôler le retour à la ligne, les justifications, la gestion de plusieurs polices, le gras, les bordures, les titres, les noms de fichiers, les dates, et autres fioritures dans l'image postscript. Mais comme cette section porte sur le texte vers image, cela signifie que vous devez d'abord transformer par magie votre texte en un fichier postscript mis en forme. Il existe de nombreux programmes externes pour le faire. Par exemple "a2ps", "enscript" ou "pstext". Vous pouvez essentiellement utiliser un traitement de texte (comme 'OpenOffice', 'Word', ou même 'Notepad'), OU, si vous voulez un système de traitement de texte par lot, vous pourriez utiliser 'TeX' et 'LaTeX' pour générer votre texte préformaté (voir Un système complet de traitement de texte plus bas). Ces programmes sont tous conçus pour gérer la complexité du mélange de texte simple, gras, de tailles et de polices différentes, ainsi que le retour à la ligne, la justification et le contrôle des paragraphes. La sortie de ces programmes peut ensuite être transmise à IM pour la convertir en une image de la taille et de la qualité désirées. Commençons donc par générer du postscript (en convertissant du texte issu d'un programme fortune personnel). |
mesgs LN-ManKzinWars | \
a2ps -q -1 --rows=10 --prologue=bold \
--center-title="Postscript via 'a2ps'" \
--header='' --left-footer='' --right-footer='' \
-o ps_version.ps
Nous pouvons maintenant transformer par magie cela en une image, en rognant le résultat (comme dans les exemples "text:" ci-dessus) pour retirer les zones vierges superflues de la page/toile par défaut générée.
magick ps_version.ps'[0]' \
-trim +repage -bordercolor white -border 3 ps_version_raw.gif
Notez l'usage de '[0]' pour limiter l'entrée à la seule première page. Si votre image postscript génère plusieurs pages, elle sera tout de même entièrement traitée par le délégué "ghostscript", mais IM ne lira que la première image renvoyée, au lieu de générer plusieurs images, une par page. Si votre postscript est très volumineux, vous pourriez utiliser d'autres utilitaires postscript pour limiter le nombre de pages avant de le traiter avec IM et "ghostscript". Comme vous pouvez le voir, le postscript converti à la "[-density](https://imagemagick.org/command-line-options/#density)" par défaut de 72 dpi n'a souvent pas aussi bon aspect qu'il le devrait, avec seulement une quantité minimale d'anticrénelage. C'est particulièrement le cas avec les polices postscript, qui ne sont pas conçues pour fonctionner à ces basses résolutions. Pour améliorer cela, vous pouvez utiliser une technique de suréchantillonnage pour générer une meilleure image. Dans ce cas, vous demandez à "ghostscript" de dessiner la page à une résolution (ou "[-density](https://imagemagick.org/command-line-options/#density)" d'image) supérieure. Vous pouvez ensuite la "[-resample](https://imagemagick.org/command-line-options/#resample)" (un redimensionnement spécialisé) pour ramener cette image plus grande à une densité de résolution d'écran plus 'normale'.
magick -density 196 ps_version.ps'[0]' -resample 72 \
-trim +repage -bordercolor white -border 3 ps_version.gif
La valeur '196' vaut 3 fois les 72 dpi finaux, ce qui signifie que lorsque "[-resample](https://imagemagick.org/command-line-options/#resample)" est utilisé, environ 3×3 pixels sont fusionnés en un seul pixel. Cela produit de meilleurs pixels d'anticrénelage le long des bords du texte, améliorant l'aspect global du résultat. Notez aussi qu'utiliser une densité ou une résolution plus grande n'est pas tout à fait pareil qu'agrandir simplement une police. Les définitions de la police pourraient comporter des ajustements pour gérer les situations de basse résolution. Par exemple, comparez le trou dans la lettre 'e' dans les deux images. La version originale est plus nette grâce à un traitement spécial au sein de la police, même si, globalement, la version suréchantillonnée est plus claire. Pour plus d'informations, voir Résolution, pointsize et taille réelle de la police plus bas. Vous n'êtes pas obligé d'utiliser les valeurs ci-dessus, car parfois une valeur légèrement différente peut produire un résultat meilleur ou plus souhaitable. Bien sûr, faire générer par "ghostscript" une image 2, 3, voire 4 fois plus grande signifie aussi qu'IM mettra 4, 9 ou 16 fois plus de temps à générer l'image ! Il utilisera aussi d'autant plus de mémoire et d'espace disque temporaire ! Mais les résultats en valent généralement la peine. La meilleure idée est simplement de l'essayer sur votre propre document et de voir ce qui donne les meilleurs résultats. De plus, si vous avez besoin de davantage d'anticrénelage, plutôt que d'utiliser une résolution d'entrée encore plus grande, vous pourriez essayer de flouter l'image d'une fraction de pixel (disons '-blur 0x0.7') avant d'en réduire la taille. J'ai aussi parfois constaté qu'une très petite quantité d'accentuation après le redimensionnement (une technique photoshop courante) peut améliorer le résultat final global.
magick -density 196 ps_version.ps'[0]' \
-blur 0x0.7 -resample 72 -unsharp 0x0.7 \
-trim +repage -bordercolor white -border 3 ps_unsharp.gif
Mais je me méfierais de ces ajustements, car ils pourraient aggraver les choses.
Si vous préférez un fond transparent plutôt que blanc, vous pouvez spécifier un réglage "[-channel](https://imagemagick.org/command-line-options/#channel)" de 'RGBA', pour inclure le canal alpha dans l'image. Bien sûr, il vous faudra utiliser un format d'image capable de gérer les couleurs semi-transparentes.
magick -channel RGBA -density 196 ps_version.ps'[0]' -resample 72 \
-trim +repage -bordercolor none -border 3 ps_transparent.png
Remarquez que la bannière utilise encore une couleur blanc cassé pour ses fonds, plutôt que d'être elle aussi rendue transparente ou semi-transparente. C'est parce que le postscript généré dessine réellement ce fond, remplaçant le fond par défaut de la page (qu'il soit blanc ou transparent). Rendre le fond transparent de cette façon vous permettra de superposer votre image postscript sur une couleur de fond précise.
magick ps_transparent.png -background skyblue -flatten ps_bgnd_color.gif
À l'aide d'une méthode de composition alpha, vous pouvez même la superposer sur une image de fond précise, ou un fond en mosaïque.
magick composite -tile bg.gif ps_transparent.png -compose DstOver \
ps_bgnd_tiled.gif
Comme presque toutes les imprimantes postscript ne peuvent qu'assombrir le papier ou un transparent pour rétroprojecteur (y compris les imprimantes couleur), lorsque ce qui précède est imprimé, la bannière serait automatiquement rendue semi-transparente. Si vous voulez qu'IM fasse la même chose qu'une imprimante, vous pouvez utiliser une composition alpha '[Multiply](compose.html#multiply)' spéciale, pour superposer l'image 'à fond blanc' sur le fond 'papier' souhaité.
magick composite -tile bg.gif ps_version.gif -compose Multiply ps_multiply.gif
Si vous avez une image postscript en couleur, vous pouvez aussi simuler une imprimante purement noir et blanc sur du papier coloré à l'aide de la méthode de composition spéciale '[BumpMap](compose.html#bumpmap)'. Elle met l'image source superposée en niveaux de gris, avant d'utiliser multiply pour composer les images ensemble. Vous pouvez aussi générer l'équivalent en niveaux de gris d'un transparent pour rétroprojecteur. Cela utilise essentiellement l'image opaque à fond blanc (de ci-dessus) comme 'masque' pour définir une image transparente en forme à l'aide de l'opérateur Alpha Shape
magick ps_version.gif -negate -background black -alpha shape ps_overhead.png
Comme le convertisseur "[text:](#text)" ci-dessus, le convertisseur "ps:" utilise lui aussi le réglage "[-page](https://imagemagick.org/command-line-options/#page)" pour définir la taille de toile du 'média' de l'image sur lequel la page est dessinée. Le décalage fourni sera toutefois ignoré. Cependant, comme la plupart des fichiers postscript définissent en interne la taille du média de dessin, cela n'est généralement pas nécessaire. | _La plupart des autres opérateurs de création d'image utilisent le réglage "[-page](https://imagemagick.org/command-line-options/#page)" pour définir une 'toile virtuelle' et un décalage sur cette toile virtuelle (par exemple pour générer des animations GIF). Il est donc probablement judicieux de le réinitialiser à l'aide de "[+page](https://imagemagick.org/command-line-options/#page)" après l'avoir utilisé pour une opération de lecture d'image "text:" ou "ps:", faute de quoi vous pourriez obtenir des résultats inattendus avec les images ultérieures.
Pour plus de détails sur l'usage de ce décalage, voir Attributs de page d'image._
---|---
Comme dernier exemple pratique, jetez un œil à mon image Ray Traced Tetrahedron. D'autres images similaires peuvent être vues dans Studies into Polyhedra. La page de fond a été générée à partir des mêmes données que celles ayant servi à produire l'objet mathématique 3D affiché. Les données de texte ont été converties à l'aide de "a2ps", puis IM a servi à transformer par magie cela en image. Sur cette image, d'autres dessins au trait préparés à l'avance du même objet mathématique ont été ajoutés à la page. Cette image finale (enregistrée au format 'targa' ou TGA) a ensuite été transmise au ray-tracer "[PovRay](http://www.povray.org/)" pour être intégrée à l'image finale ou à la scène en lancer de rayons.
Utiliser GhostScript directement
Bien que ce ne soit pas strictement IM, Richard Bollinger a rapporté qu'exécuter le délégué "ghostscript" directement est bien plus efficace, produisant un traitement plus rapide d'un ordre de grandeur grâce à une moindre manipulation de fichiers par IM. Par exemple, au lieu d'exécuter...
magick -density 300x300 -compress Group4 file.ps file.tif
Vous pouvez faire en sorte que GhostScript le fasse directement.
gs -dBATCH -dNOPAUSE -sDEVICE=tiffg4 -r300x300 \
-sOutputFile=file.tif file.ps
Cela évite à IM d'avoir à générer un grand fichier temporaire (pour la sécurité et la gestion d'images en pipeline). De ce fait, l'usage direct de GhostScript peut économiser pas mal de manipulation de fichiers et de traitement d'E/S, et peut apporter un gain de performance majeur lors du traitement de fichiers postscript et PDF. Cependant, "ghostscript" ne peut pas redimensionner les images (autrement qu'en ajustant la densité ou la résolution de sortie) et ne pourra probablement pas produire l'image dans le format de fichier que vous voulez, ni à la qualité souhaitée. Mais vous pouvez toujours ensuite transmettre la sortie de GhostScript à ImageMagick pour terminer la tâche. C'est le cas en particulier si vous voulez suréchantillonner les résultats (entrée à plus haute résolution, sortie redimensionnée plus petite). GhostScript peut être un programme difficile à prendre en main, ou à corriger pour des types de postscript précis. Cristy se bat constamment contre ces problèmes au nom des utilisateurs d'IM, et il y accomplit un travail formidable. Malheureusement, en composant avec tout ce qui peut (et arrive) de se produire, IM ne peut pas fournir de méthode simplifiée pour le postscript/PDF via GhostScript.
Draw - Dessiner du texte sur une toile existante
En utilisant l'opérateur de bas niveau "[-draw](https://imagemagick.org/command-line-options/#draw)" pour dessiner la police, nous obtenons beaucoup plus de contrôle, en particulier sur la position exacte de la police et sur la taille de l'image dans laquelle elle est dessinée.
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
-fill blue -draw "text 25,65 'Anthony'" text_draw.gif
Cependant, pour l'utiliser, nous devons générer une image de fond de la taille appropriée pour dessiner la police, ce qui peut être délicat lorsqu'on dessine un texte inconnu. Voir Dimensionnement automatique des images de police pour des moyens de résoudre ce problème. Beaucoup d'options supplémentaires, au-delà des options de texte standard, influent aussi sur la façon dont "[-draw](https://imagemagick.org/command-line-options/#draw)" dessine réellement le texte sur une image. Non seulement vous pouvez spécifier une couleur "[-fill](https://imagemagick.org/command-line-options/#fill)", mais vous pouvez aussi spécifier une "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)", ainsi qu'une couleur de bord ou "[-stroke](https://imagemagick.org/command-line-options/#stroke)", toutes deux désactivées par défaut (fixées à une couleur 'none'). La couleur "[-fill](https://imagemagick.org/command-line-options/#fill)" peut aussi être remplacée par un motif d'image "[-tile](https://imagemagick.org/command-line-options/#tile)", tandis que la largeur du bord du tracé peut être modifiée à l'aide de "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)". La position relative du texte dessiné peut ensuite être modifiée avec un réglage "[-gravity](https://imagemagick.org/command-line-options/#gravity)". Par exemple, ici j'ai utilisé bon nombre des fonctionnalités supplémentaires que je viens de mentionner.
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
| _Depuis IM version 6.2.4, l'opération "[-draw](https://imagemagick.org/command-line-options/#draw) text" ne comprend plus l'usage de '\n' pour signifier un saut de ligne, ni l'usage des échappements d'informations d'image pour cent '%'. (Voir Drawing a Percent Bug).
Ces capacités, et ces problèmes, restent toutefois disponibles dans le nouvel opérateur d'IM v6 "[-annotate](https://imagemagick.org/command-line-options/#annotate)". Voir L'opérateur de dessin de texte Annotate plus bas._
---|---
Toutes les options ci-dessus peuvent aussi être utilisées au sein de la chaîne "[-draw](https://imagemagick.org/command-line-options/#draw)" (MVG - Magick Vector Graphic). Toutefois, si vous fixez l'option ci-dessus à l'intérieur de l'argument draw, cette option ne s'appliquera qu'à cette chaîne MVG de dessin précise. En outre, le format draw MVG peut faire bien plus, comme la rotation du texte et la 'décoration' de la police ; et bien sûr, vous pouvez aussi dessiner diverses formes comme des cercles sur l'image. Par exemple, ici nous dessinons du texte souligné et pivoté, superposé à quelques cercles de fond.
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 vous voulez vraiment tirer le maximum de "[-draw](https://imagemagick.org/command-line-options/#draw)" pour créer votre image, je vous suggère de consulter la page des exemples de dessin.
Boîte de sous-couleur
Le réglage de couleur "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)", comme démontré ci-dessus et plus loin, colorera la zone de dessin définie pour ce caractère et cette police. En général, elle s'ajuste juste au caractère dessiné. C'est particulièrement le cas des bords gauche et droit de la police dessinée, car les bords supérieur et inférieur sont généralement assez grands pour accueillir tous les caractères. La zone de dessin représente en gros les limites de la 'cellule' du caractère entourant la zone dans laquelle la police est dessinée. Le principal usage de l'option "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)" est comme moyen simple et rapide d'effacer un fond 'bruité' autour du texte. Par exemple, voir Annoter par-dessus des images. Il est toutefois recommandé, dans ce cas, d'ajouter aussi un caractère d'espace supplémentaire au début et à la fin de la chaîne dessinée.
Débordement de la boîte englobante
L'un des plus gros problèmes que vous rencontrerez probablement en dessinant du texte, ou plus généralement en gérant des polices, c'est que toutes les polices n'obéissent pas aux règles normales. Un concepteur de police peut 'dessiner' des caractères (ou 'glyphes') individuels n'importe où par rapport à la position de texte courante (appelée le caret). La position de la police n'a même pas à avancer, et dans certaines polices internationales elle pourrait même reculer ! Le résultat de cette liberté de conception, c'est que certains 'glyphes' ne tiennent pas dans la zone de dessin que la police déclare pour le caractère, en particulier avec les polices inclinées ou de type écriture, où certaines parties des lettres s'étendent bien au-delà des limites et empiètent sur les zones utilisées par les caractères suivants (ou précédents). La pire police que j'aie vue à cet égard est la police 'LokiCola', qui dessine environ la moitié de ses lettres capitales avec de longues queues ondulées, bien au-delà des limites des cellules de caractère individuelles. La police suppose en gros que chaque lettre capitale sera suivie de 3 lettres minuscules ou plus. Pour l'illustrer, je vais dessiner séparément plusieurs lettres capitales de la police, afin que vous puissiez voir à quel point les lettres peuvent s'étendre au-delà de la 'undercolor' de la cellule, ou des limites de dessin. J'en utilise aussi quelques-unes pour former le nom de la police, afin que vous les voyiez telles qu'elles ont été conçues pour être utilisées, et pourquoi elles débordent de leurs boîtes englobantes.
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 - Opérateur de dessin de texte
Avec IM version 6, un nouvel opérateur de dessin de police, "[-annotate](https://imagemagick.org/command-line-options/#annotate)", a été rendu disponible. Cet opérateur est à bien des égards bien plus simple qu'une opération "[-draw](https://imagemagick.org/command-line-options/#draw) text", mais comme il utilise l'API 'annotate()' (Application Program Interface), il est aussi plus puissant. Bien que l'opérateur fasse usage des primitives "[-draw](https://imagemagick.org/command-line-options/#draw)", il le fait d'une manière plus complexe, par exemple en développant des caractères d'échappement spéciaux pour ajouter des informations d'image supplémentaires et même plusieurs lignes, et en appliquant une transformation du système de coordonnées au texte dessiné pour produire des inclinaisons et des rotations. De ce fait, l'opérateur est désormais l'opérateur de dessin de texte préféré pour tout le dessin de texte et l'annotation d'images d'ImageMagick, ce qui se reflète maintenant dans ces pages d'exemples. Voici un exemple de base utilisant cet opérateur.
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
-fill blue -annotate +25+70 'Anthony' annotate.gif
L'une des fonctionnalités supplémentaires de l'opérateur "[-annotate](https://imagemagick.org/command-line-options/#annotate)" est qu'il peut faire pivoter les axes X et Y du texte dessiné de façon totalement indépendante l'un de l'autre. Cela se fait en fournissant l'angle de rotation de chaque axe sous forme de 'taille d'image' dans l'argument de l'opérateur. Juste pour montrer à quel point une seule opération "[-annotate](https://imagemagick.org/command-line-options/#annotate)" peut être complexe, voici une image encadrée, tracée et inclinée...
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
Dans cet exemple, les quatre arguments d'annotate sont fournis : rotation de l'axe X, rotation de l'axe Y, et positions X et Y de la police sur l'image de fond. Notez aussi que le motif de remplissage (fixé avec "[-tile](https://imagemagick.org/command-line-options/#tile)") est lui aussi incliné avec la police. C'est parce qu'il est dessiné à l'aide d'un système de coordonnées cisaillé/pivoté, qui cisaille aussi le motif de remplissage en mosaïque à l'intérieur du texte dessiné. Un autre exemple de cette capacité de cisaillement est l'exemple Police à ombre cisaillée. Comparez-le à la Police inclinée créée avec la chaîne MVG "[-draw](https://imagemagick.org/command-line-options/#draw)" équivalente. Pour un tableau résumant les effets de l'opération de cisaillement de "[-annotate](https://imagemagick.org/command-line-options/#annotate)", voir Usage de l'argument Annotate. Par exemple, voici un texte légèrement pivoté...
magick -size 320x100 xc:lightblue -font Candice -pointsize 72 \
-annotate 350x350+20+90 'Anthony' annotate_rotated.gif
| Notez que l'angle donné à "[-annotate](https://imagemagick.org/command-line-options/#annotate)" doit être positif pour qu'IM le comprenne correctement. L'exception à cela est l'usage d'une forme d'argument de géométrie à 4 nombres séparés par des virgules. Par exemple "-annotate '-10,-10,20,90' 'Anthony'" aurait pu être utilisé dans le dernier exemple.
---|---
Cela peut servir à générer un étiquetage condensé en biais. Par exemple... |
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)
Vous pouvez aussi ajouter d'autres informations sur l'image courante à la chaîne annotée à l'aide de caractères d'échappement. Par exemple, écrasons l'image "rose:" intégrée avec des informations sur la taille de l'image. Pour centrer le texte sur l'image, nous utilisons un réglage "[-gravity](https://imagemagick.org/command-line-options/#gravity)", et nous désactivons toute rotation et tout décalage à l'aide d'un argument "[-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)
Pour plus d'informations, voir Caractères d'échappement spéciaux dans les arguments de texte plus bas. Pour d'autres exemples d'annotation de texte sur une image plus grande de diverses façons (comme centré sur le côté, ou pivoté dans le coin inférieur droit), voir Exemples pratiques d'annotation de texte.
Toiles de texte annoté dimensionnées automatiquement
Souvent, vous avez besoin de bien plus de contrôle que ce que "[label:](#label)" peut offrir. Par exemple, vous voulez utiliser une image de mosaïque ou de dégradé, ce qui vous oblige à Annoter le texte. Malheureusement, il vous faut alors connaître à l'avance la taille de la toile nécessaire pour votre texte annoté. Voici un exemple typique du problème. Quand j'ai configuré cette commande pour la première fois, j'ai réglé ma taille sur le résultat voulu, et au début cela a plutôt bien fonctionné. Mais ensuite, j'ai obtenu ceci...
magick -size 480x80 gradient:yellow-green \
-font ArialBkI -pointsize 70 -tile gradient:blue-red \
-annotate +10+65 'Gradient Fun' funfont_gradients.jpg
Malheureusement, en devinant la taille de la toile, j'avais mal orthographié le mot 'Gradient' ci-dessus (il manquait la lettre 'i'). Bien sûr, quand j'ai corrigé cette orthographe, ma taille d'image était désormais fausse, produisant le résultat incorrect montré ci-dessus. Ce qu'il nous faut, c'est pouvoir utiliser l'opérateur "[-annotate](https://imagemagick.org/command-line-options/#annotate)", mais avec la toile dimensionnée pour s'adapter au texte annoté. Une solution consiste à utiliser une toile bien plus grande, puis à "[Trim](crop.html#trim)" le fond à la bonne taille. J'ai aussi ajouté une "[Border](crop.html#border)" pour ajouter un peu d'espace supplémentaire autour de la police et du bord final de l'image, pour un meilleur aspect.
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
Cette méthode est bien meilleure que d'essayer de deviner la taille de votre image finale ; cependant, "[Canvas Trim](crop.html#trim)" ne rognera pas un fond multicolore en mosaïque. La meilleure solution consiste à créer la toile à l'aide de "[label:](#label)", pour générer la toile de la bonne taille. Un remplissage de couleur par Draw sert ensuite à recouvrir la toile (et le texte de l'étiquette) d'une image en mosaïque, et enfin nous Annotons notre texte à l'aide d'une autre image de mosaïque.
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
| Notez que la position du texte dans une image "[label:](#label)" centrée peut ne pas correspondre exactement à la position d'une opération "[-annotate](https://imagemagick.org/command-line-options/#annotate)" centrée. Les deux méthodes suivent des algorithmes de traitement complètement différents, et peuvent donc ne pas concorder, en particulier avec des polices inhabituelles.
---|---
Dimensionnement automatique à l'aide de la 'boîte de sous-couleur'
Plutôt que d'utiliser une image "[label:](#label)", vous pouvez dessiner la police sur une grande toile à l'aide d'une boîte de sous-couleur et d'une grande largeur de tracé, avant de rogner la toile pour l'ajuster. Par exemple
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 quantité d'espace autour de la police peut être ajustée à l'aide du réglage "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)". La seule exigence importante est que la toile initiale soit d'une couleur différente de la couleur de fond ('lightblue' dans ce cas) et plus grande que le résultat final. Juste un mot d'avertissement : certaines polices dessinent des caractères bien au-delà de la zone de dessin individuelle du caractère. (Par exemple, voir Boîte de sous-couleur plus haut). Dans ce cas, le résultat ci-dessus fonctionnera, mais pourra vous obliger à utiliser une toile transparente, puis à superposer le résultat sur du blanc (à l'aide d'une opération comme "-background white -flatten" par exemple), pour transformer par magie les zones inutilisées et encore transparentes en blanc. Toutefois, ce caractère touchera probablement un bord de l'image résultante. Fondamentalement, on ne peut pas vraiment gagner dans toutes les situations, alors faites simplement de votre mieux.
Colorer une image de texte en niveaux de gris
J'ai délibérément généré l'image ci-dessus comme une image en niveaux de gris noir et blanc, car elle peut servir de gabarit de masquage. À partir d'une image aussi pure, vous pouvez ensuite colorer le fond et l'avant-plan de l'image, séparément ou simultanément. Ici, par exemple, j'utilise l'opérateur Level by Colors, "[+level-color](https://imagemagick.org/command-line-options/#level-color)", pour modifier globalement les couleurs de l'image afin d'attribuer aux couleurs d'avant-plan et de fond des valeurs précises.
magick invitation_box.jpg -colorspace sRGB \
+level-colors navy,lightblue invitation_colored.jpg
Par exemple, ici j'utilise le masquage par composition pour remplacer le fond et l'avant-plan par des images de motif.
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
L'opérateur Reverse ci-dessus sert à réordonner les images, de sorte que la première image devienne la troisième image 'de masquage' de la composition. L'image d'avant-plan ("plasma:") devient alors la première, et le fond se retrouve au milieu. Pour d'autres techniques de coloration d'une image en niveaux de gris comme celle-ci, voir Utiliser un masque pour limiter la zone composée. Plus généralement, voir Utiliser des masques avec les images. Pour d'autres méthodes de génération de dégradés à mettre en mosaïque, voir Dégradés de couleur, Points de couleur épars et Toiles aléatoires.
Polices
En construction
As for ordering the font paths, that is simply ordering the fonts specified in
the XML files.
The start point is the system fonts, followed by the system installed
"type.xml" file, on my system this is "/etc/ImageMagick-6/type.xml".
This system installed "type.xml" file is typically just a list of 'include'
other type-* files. And the order of the includes will specify the order of
Extra System Fonts, verses Ghostscript Fonts.
After that file other "type.xml" files are looked for, such as in 'home'
directories, or even current directory.
Later fonts will NOT replace earlier fonts, as such if two fonts have that
same name, only the first one will be noted by IM. (a security measure).
To see the fonts loaded use
magick -list font
It lists "Path:" of the type file each font list was found in, but the
paths are listed in REVERSE order, with system fonts at the end.
I have for example a personal Font named "Courier", but it is not listed in
the above list as it was defined after the "Courier" that was found in the
"System Fonts" area, (which is listed at the end of the above output).
On the other hand my own personal font "CourierNew", is listed, as it does not
clash with any system or system config defined font.
To see what font glyph file is selected for soem specific request
use...
magick -debug annotate xc: -font Courier \
-annotate 0 'Test' null: 2>&1 |
grep '^ *Font '
Déterminer les métriques d'une police, sans utiliser d'API
Une police donnée, ainsi que ses caractères individuels, contient beaucoup d'informations. De telles informations peuvent être très utiles à avoir, surtout si vous voulez utiliser IM pour assembler le texte de nombreuses polices différentes. Il est aussi important de se rappeler que la plupart des polices sont proportionnelles, ce qui signifie que chaque caractère individuel aura une largeur différente, et une avance 'naturelle' du caret (ou origine) différente. À ce titre, chaque 'chaîne' de caractères précise sera rendue (dessinée) avec une longueur différente, sans réel rapport avec le nombre réel de caractères utilisés dans la chaîne. L'exception à cela sont les polices à 'chasse fixe', comme les polices "Courier", "Typewriter" ou "Terminal", dans lesquelles tous les caractères ont la même largeur, ce qui vous permet de générer facilement des colonnes de texte. Le réglage de débogage "[-debug](https://imagemagick.org/command-line-options/#debug) annotate" peut servir à faire rapporter directement par IM les métriques d'une police TTF, pour une chaîne précise. Par exemple...
magick -debug annotate xc: -font Candice -pointsize 24 \
-annotate 0 'Test' null: 2>&1 |\
grep Metrics: | fmt -w80
| Comme vous pouvez le voir, vous obtenez un ensemble hétéroclite d'informations utilisables : depuis les limites déclarées de la chaîne dessinée (qui ne sont pas nécessairement les limites réelles de la chaîne), relatives à l'origine ; jusqu'à la quantité dont le 'caret' (origine) doit avancer avant de dessiner la chaîne suivante. La sortie de débogage complète (assez verbeuse, et non montrée ci-dessus) rapporte aussi le fichier de police réellement utilisé (deux fois), de sorte que vous pouvez également vous en servir pour vérifier que vous avez la bonne police. | La méthode "[-debug](https://imagemagick.org/command-line-options/#debug) annotate" a été ajoutée à IM v6.3.9-2 |
|---|---|
Techniques plus anciennes
Cette sortie de débogage peut toutefois ne pas être pratique, ou vous pourriez avoir affaire à des IM plus anciens que cette version. Ce qui suit sont des exemples plus anciens où le texte est réellement dessiné de diverses façons et couleurs, puis où des informations (sous forme d'entiers) sont extraites de l'image résultante. Par exemple, découvrons les dimensions de la police 'Ravie' par rapport à une ligne de base fixe, à 72 points. Voici l'image que nous allons étudier, à titre de référence. Vous n'avez pas réellement besoin de la dessiner ni de l'enregistrer comme image, car nous n'extrayons que des données, pas une image. Les couleurs de cette image seront modifiées afin que nous puissions examiner séparément les parties blanches et noires à l'aide de "[-trim](https://imagemagick.org/command-line-options/#trim)" pour extraire les métriques utilisées. |
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)
Pour les métriques de police de base, nous dessinons d'abord la police elle-même avec une couleur transparente ('None'), afin de pouvoir mesurer et trouver la taille et l'emplacement de la boîte englobante ou zone de dessin de ce caractère précis, pour cette police. Notez que, pour l'information de hauteur, vous pouvez dessiner n'importe quoi.
magick -size 100x150 xc:lightblue -font Ravie -pointsize 72 \
-fill none -undercolor white -annotate +20+100 'A' -trim info:
D'après les résultats ci-dessus, on voit qu'une police 'Ravie' à 72 points aura une hauteur totale de boîte englobante de 74 pixels. Le haut de la boîte est à 42 pixels du haut de l'image ; comme la ligne de base était positionnée à une coordonnée y de 100 pixels, la boîte commence 100 - 42, soit 58 pixels au-dessus de la ligne de base. Cela laisse 74 - 58, soit 16 pixels pour la boîte englobante sous la ligne de base, pour les jambages. |
Notez que toutes les polices ne limitent pas leur dessin à l'intérieur de leur boîte englobante définie ! Certaines lettres peuvent en revanche s'étendre bien au-delà de ces limites. C'est pourquoi l'exemple ci-dessus fixe une couleur "[-fill](https://imagemagick.org/command-line-options/#fill)" de 'none'. Ainsi, les polices mal conçues n'affecteront pas les mesures ci-dessus. |
|---|---|
Notez aussi que la distance séparant les lignes (les lignes de base, en réalité) devrait être déterminée uniquement par la taille de point de la police, et n'a rien à voir avec la façon dont la police est dessinée. Dans notre exemple, comme la police a une taille de point de 72 points, et qu'un point est défini comme 1/72e de pouce, les lignes de base devraient être distantes d'1 pouce. Avec une résolution (densité) de sortie courante de 72 pixels par pouce, cela signifie que les lignes de base seront distantes de 72 pixels. Fait intéressant, cela signifie que pour cette police, avec une boîte englobante de 74 pixels, la police a un chevauchement de deux pixels de la zone de dessin entre les lignes d'un texte correctement à interligne simple ! On peut aussi voir d'après les mesures ci-dessus que, en dessinant la chaîne "A" dans cette police à cette taille de point, le caractère suivant devrait être dessiné 66 pixels à droite du point de départ (appelé le caret). C'est la longueur 'logique' de la chaîne. Autrement dit, le 'caret', ou point de départ du caractère suivant, devrait commencer à 20 + 66, soit à '+86+100' (la ligne de base ne change pas verticalement). Attention : certaines polices arabes peuvent en fait dessiner de droite à gauche, de sorte que le décalage du 'caret' sera négatif. Cela nous donne les métriques de police pour le caractère 'A', mais qu'en est-il des dimensions physiques du 'A' dessiné par rapport au 'caret' ou point de départ. Eh bien, il suffit d'échanger les deux réglages de couleur... |
magick -size 100x150 xc:lightblue -font Ravie -pointsize 72 \
-fill black -undercolor none -annotate +20+100 'A' -trim info:
| En hauteur, le caractère était dans ses limites de dessin définies, sa hauteur allant de 100 - 43, soit 57 pixels au-dessus de la ligne de base (collé contre sa boîte englobante), à 60 - 57, soit seulement 3 pixels sous la ligne de base de la police. Autrement dit, cette lettre n'a pas de 'jambage' dessiné dans la zone sous la ligne de base. De là, on voit que le 'A' se dessine depuis 3 pixels avant le caret (positionné à +20, mais l'image finale est à +17), jusqu'à 70 - 3, soit 67 pixels après la position du caret. Autrement dit, cette police est légèrement plus large que sa boîte englobante horizontale, une fois dessinée. Notez que, si cela vous donne la longueur réelle de la chaîne dessinée, c'est différent du décalage de caret nécessaire lors de l'ajout de texte (qui est défini par la boîte englobante de la chaîne, et non par sa longueur dessinée). Autrement dit, le texte devrait être accolé à l'aide des boîtes englobantes, et non de la longueur réellement dessinée comme nous l'avons fait dans d'autres exemples. Bien sûr, si vous tombez sur une police très mal conçue, vous pourriez vouloir vérifier jusqu'où une chaîne précise se dessine au-delà de ses limites, afin de pouvoir tout de même lui réserver de l'espace, par exemple en fin de ligne. | Les dimensions extraites d'une police varieront aussi selon la "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)" en vigueur pour dessiner la police. Si vous augmentez la taille du contour du tracé, alors les dimensions (et la taille de la boîte englobante) nécessaires pour dessiner la police sont elles aussi étendues d'autant pour accueillir le contour plus épais. |
|---|---|
| Les dimensions varient aussi selon le système d'exploitation (type et version) et la version de la bibliothèque de dessin de polices déléguée qu'IM utilise sur ce système, même lorsque exactement la même bibliothèque de polices et la même version d'IM n'ont pas changé. La prudence est recommandée lorsque différents ordinateurs peuvent servir au dessin de texte, car les résultats peuvent varier même pour une même police. | |
| --- | --- |
| Pour plus d'informations, voir le document TrueType Fundamentals (PDF). Il montre que même mes généralisations ci-dessus peuvent ne pas toujours se vérifier, même si c'est généralement le cas. Notez que les exemples ci-dessus ne renverront des dimensions qu'en pixels entiers, alors que toutes les dimensions utilisées par les polices sont des nombres à virgule flottante. En fait, le fait qu'une police soit même dessinée à partir d'un point de départ (caret) en pixel entier peut dépendre de l'application, et influer sur l'aspect résultant de la police. |
Créer des lignes mêlant plusieurs styles de police
Créer une seule ligne à l'aide de plusieurs polices, tailles de point et styles n'est pas vraiment quelque chose pour quoi IM est conçu. Cela devient encore pire lorsque vous commencez aussi à prendre en compte des choses comme la justification du texte, le retour à la ligne, et l'habillage autour des images et d'autres éléments. C'est le genre de chose que les traitements de texte, les navigateurs web et les imprimantes de documents font très bien, généralement sous l'interaction de l'utilisateur, mais que peu savent faire aussi bien sous contrôle programmatique. Une exception à cela est "TeX" et sa famille de programmes (voir Un système complet de traitement de texte plus bas) ; donc si vous voulez sérieusement traiter du texte graphiquement, je vous suggère de vous pencher sur cette famille de programmes. Une autre solution est de considérer divers programmes d'impression 'soignée' de documents, comme un convertisseur HTML. Vous pouvez vous en servir pour transformer par magie des documents générés par programme en postscript, qu'IM peut ensuite volontiers post-traiter dans le format ou le style d'image que vous voulez. Une solution par API (utilisant l'interface C MagickWand) a été créée par "El Supremo" (des forums de discussion IM) dans son programme FontMetrics. et voici un exemple de sortie de "FontMetrics".
Or, si la ligne de commande d'IM n'est pas conçue pour le 'traitement de texte', cela ne veut pas dire que vous ne pouvez pas l'utiliser pour cela. C'est juste plus difficile. Ici, je vais donner quelques exemples de mélange de texte dans différentes polices et styles, pour donner un point de départ aux gens. La solution la plus simple à laquelle les gens pensent habituellement est de simplement accoler des images "[label:](fonts.html#label)"...
magick -font LokiCola -pointsize 36 label:'LokiCola ' \
-font Candice -pointsize 24 label:'Candice ' \
-font SheerBeauty -pointsize 48 label:'SheerBeauty' \
+append wp_label_append.jpg
Cependant, comme vous pouvez le voir, toutes les images sont alignées verticalement sur le haut de l'image, et à moins d'utiliser des polices semblables, cela n'aura pas très bon aspect. Autrement, vous pouvez utiliser une astuce de justification à l'accolage pour les aligner le long du bas.
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
Ce que cela a fait, c'est ajouter un peu de remplissage supplémentaire en haut de chaque étiquette, et les rogner toutes à la même hauteur avant de les accoler horizontalement. Ensuite, un simple "[-trim](https://imagemagick.org/command-line-options/#trim)" et un "[-flatten](https://imagemagick.org/command-line-options/#flatten)" ont servi à fixer la hauteur de la ligne à celle de l'étiquette la plus haute, et à remplir le fond. Comme vous pouvez le voir, cela donne un meilleur résultat, mais une petite police tend à produire un comportement de type indice, plutôt qu'un texte correctement aligné. Ce qu'il nous faut réellement faire, c'est aligner toutes les chaînes de texte par leurs 'lignes de base', et c'est très difficile sans accès à davantage d'informations textuelles. Cette information s'obtient facilement sous une API de programme, mais bien plus difficilement depuis la ligne de commande. Une méthode est montrée dans la section d'exemple précédente. Il est toutefois possible d'aligner des mots par leur ligne de base sans réellement collecter l'information de ligne de base. Bien que les images de texte "[label:](fonts.html#label)" ne fournissent aucun indice quant à la ligne de base de l'image, vous pouvez dessiner spécifiquement des images à une ligne de base fixe. Sans API, vous ne pouvez pas non plus découvrir directement la longueur ou la hauteur du texte dessiné : il vous faut donc d'abord utiliser une toile assez grande pour garantir de ne perdre aucune information de l'image de texte. Ensuite, pour préserver les espaces de fin et la hauteur du texte, il vous faut aussi bien utiliser la fonctionnalité ("[-undercolor](https://imagemagick.org/command-line-options/#undercolor)") disponible pour l'annotation de texte, et fournir une limite pour le rognage de l'image. Voyons donc comment vous pouvez le faire depuis la ligne de commande.
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
Comme précédemment, le rognage des images se fait en deux étapes. On dessine d'abord le texte sur une image de base qui contient une ligne verticale bleue. Ainsi, lorsque nous rognons le texte, seule la largeur de l'image de texte est rognée, ce qui laisse tous les mots à la même hauteur de ligne de base. Après les avoir accolés, nous pouvons désormais retirer la ligne de construction bleue en la rendant entièrement transparente. Si vous générez seulement une image en noir et blanc, la meilleure façon serait d'extraire plutôt l'un des canaux non bleus, ce qui garantit de bien récupérer toute la ligne de construction. Un second rognage rogne alors les sections du haut et du bas, la réduisant à la plus grande boîte englobante. Un aplatissement final vers la même couleur que la boîte englobante retire ensuite toute trace de son usage dans la construction de la ligne. Comme vous pouvez le voir, tout le texte est désormais correctement aligné sur la ligne de base, quelle que soit la police ou la taille de point utilisée. Bien sûr, dans ces exemples je n'ai utilisé que du texte noir sur blanc. D'autres couleurs peuvent être employées, tant qu'elles n'interfèrent pas avec la ligne de construction et le fond transparent utilisés pour l'alignement du texte. Avec cette technique, vous pouvez désormais générer des lignes de texte mêlant plusieurs polices, et les accoler toutes verticalement en un document plus grand. Vous pouvez aussi constater que tout cela représente beaucoup de travail, un travail normalement caché à l'utilisateur par les traitements de texte et les navigateurs web. Si vous prévoyez d'en faire beaucoup, je vous suggère de vous pencher sur les solutions de rechange que j'ai mentionnées précédemment.
Remplissage de formulaire
Vous avez l'image d'un formulaire standard à remplir, et vous voulez renseigner les champs qui se trouvent à des positions bien connues. Vous disposez donc d'un fichier de données comme "[text_data.txt](../static/img/images/text_data.txt)" montré ici...
Les champs sont : largeur du texte, gravity (justification), couleur, position x, y et le texte réel à placer pour ce champ. Vous pouvez alors utiliser un simple script shell en boucle pour générer une étiquette de texte telle que décrite ci-dessus, en assignant le texte approprié aux positions de texte définies dans une image de formulaire (fond).
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
L''image de formulaire' dans ce cas n'est qu'une image vierge, mais elle pourrait en réalité être n'importe quoi. J'ai aussi fixé la couleur de fond des étiquettes à 'wheat' pour que la zone remplie soit visible, mais vous la fixeriez normalement à none. Ce qui précède n'utilise pas de fichiers temporaires, mais recourt plutôt à un pipeline d'images au format MIFF. C'est un exemple d'utilisation d'un format de flux d'images, dans lequel les images individuelles sont simplement accolées les unes après les autres dans un fichier ou un pipeline. Ce n'est qu'un point de départ. Les champs du formulaire peuvent provenir d'un fichier de définition, tandis que le texte à insérer peut venir d'une base de données ou d'une autre source de données. D'autres attributs peuvent aussi être fixés, comme la police à utiliser, les rotations de texte, etc. Vous pourriez aussi inclure à la fois la largeur et la hauteur, ou, si le texte doit être renvoyé à la ligne, utiliser Caption plutôt qu'un Label. Voir aussi Épingles sur une carte pour un autre exemple de cette technique, très proche de ce qui précède.
Solutions de rechange pour le traitement de texte
| La façon idéale de générer des fichiers texte et des documents entièrement mis en forme est d'utiliser ImageMagick au sein d'un système de traitement d'images et de texte plus large. Outil | utilisé pour... |
|---|---|
| ImageMagick | Traitement et préparation d'images par lot |
| Gimp | Édition d'images en interface graphique pour corriger des problèmes ponctuels |
| LyX | Traitement de texte en interface graphique, conçu pour générer... |
| LaTeX | Processeur de texte pour documents et livres... |
| TeX | Format de texte sous-jacent |
| (positionne les symboles et les polices sur les pages) | |
| Metafont | Générateur de polices pour TeX |
| Fondamentalement, ImageMagick peut faire beaucoup de choses, ce qui ne veut pas dire qu'il est le meilleur outil pour ces choses. Pour la préparation de documents plus volumineux, mieux vaut le traiter comme une simple partie d'un ensemble plus large. Les divers outils 'TeX' donnés ci-dessus font généralement partie d'une installation standard sur la plupart des systèmes Linux, et peuvent combiner texte et images en un tout unifié. Plus important encore, ils gardent le texte en tant que texte, et le mettent en forme de façon appropriée, comme vous le spécifiez, en faisant presque tout le travail difficile de retour à la ligne des mots et des pages, et d'agencement avec les images. Et cela sans remplir un fichier 'doc' de fatras de mise en forme inutile. Vous avez le contrôle total, ou vous pouvez le laisser prendre les décisions. Ils offrent un moyen de générer tout type de document, d'une simple page à un bulletin, voire à un livre complet. Si vous êtes sérieux au sujet de la génération de documents, ces outils méritent vraiment qu'on s'y intéresse et qu'on les apprenne. | |
| Pango (Linux et MacOSX uniquement) offre aussi une solution de rechange. Il fournit de nombreuses fonctionnalités de traitement de texte vers image absentes d'ImageMagick. Par exemple les TABs, la justification, les marges, les en-têtes, etc. Il a même une sorte de langage de balisage permettant de changer de police au milieu du texte. | |
| Parmi les autres solutions figurent aussi les nombreux programmes de conversion de texte vers postscript, comme "a2ps" que je démontre en générant un exemple de fichier postscript dans Gestion du Postscript plus haut. Cela convertit et met en forme de nombreux types de fichiers texte différents, avec retour à la ligne, gras et contrôle des tabulations, ainsi qu'un en-tête, un pied de page, une bordure et des options multi-pages assez agréables. Bien sûr, il s'agit là d'un traitement d'image indirect via un langage intermédiaire Postscript ou PDF. Une autre consiste à agencer le texte à l'aide de SVG, ou de la commande de dessin d'ImageMagick, même s'il vous faudra alors gérer l'agencement. Il existe une foule d'outils pour transformer par magie du texte en images, et la plupart peuvent être combinés avec ImageMagick pour post-traiter l'image de texte et la fusionner dans votre image. Cela laisse ImageMagick se consacrer à ce qu'il fait de mieux : le traitement d'images. |
![[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)