⚠️ Ceci est un site de traduction non officiel, sans lien avec ImageMagick Studio LLC. Pour des informations officielles, consultez la page originale (https://usage.imagemagick.org/annotating/index.html).

Exemples ImageMagick -- Annotation des images

Exemples ImageMagick — Préface et index
Étiquetage des images (techniques pour étiqueter les images)

Ce document présente différentes manières d'annoter une grande image, soit avec du texte, soit avec une autre image. L'annotation peut être marquée et très visible, ou discrète et dissimulée. Les raisons d'annoter des images sont variées, mais il s'agit généralement de :

  • Marquer l'image avec des informations sur son sujet.
  • Signaler ou mettre en évidence un aspect de l'image.
  • Ajouter un copyright ou des logos à l'image comme forme de protection contre la copie.

ImageMagick offre de nombreuses façons de réaliser ces opérations, mais elles ne sont pas toutes faciles à découvrir seul dans les manuels. Cette page s'efforce de présenter les méthodes les plus courantes. Beaucoup de ces méthodes précises sont détaillées plus en profondeur sur d'autres pages d'exemples. Si vous souhaitez annoter ou filigraner une animation GIF, je vous conseille de parcourir d'abord ce document, puis de passer à Annoter les animations GIF pour démarrer.


Annotation des images

Le problème fondamental de l'étiquetage d'une image est de le faire de sorte que le texte reste lisible quelle que soit l'image. Ce qui suit présente de nombreuses méthodes, dont certaines peuvent être étendues à des tâches plus complexes. Dans ces exemples, je me limite à la police par défaut d'ImageMagick. Vous êtes encouragé à utiliser différentes polices et tailles de point adaptées à ce que vous voulez obtenir.

Étiqueter sous (ou au-dessus d')une image

Ajouter une étiquette par concaténation avec centrage est désormais possible, depuis IM v6.4.7-1, car la concaténation d'images suit maintenant le réglage de gravité, à des fins d'alignement. |

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

[IM Output]
En réordonnant les images, vous pouvez concaténer l'étiquette au-dessus de l'image. |

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

[IM Output]
Splice et Draw est une manière très simple d'ajouter de l'espace supplémentaire à une image pour nous permettre d'y dessiner/annoter l'étiquette. |

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

[IM Output]
La même méthode permet de dessiner une étiquette au-dessus de l'image : il suffit de remplacer le réglage de gravité 'South' par 'North'. Facile ! |

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

[IM Output]
L'opérateur "[-draw](https://imagemagick.org/command-line-options/#draw)" n'est plus recommandé pour dessiner directement sur les images, sauf dans le cadre de fonctions de dessin plus complexes. Consultez la section Traitement du texte vers l'image pour plus de détails sur les autres méthodes et techniques de dessin de texte. Étiqueter avec Montage La commande montage d'ImageMagick est souvent perçue par les utilisateurs comme utile uniquement pour afficher tout un répertoire d'images. Elle offre pourtant un moyen très simple d'ajouter des étiquettes à une image. |

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

[IM Output]
montage peut aussi ajouter pour vous un cadre et d'autres éléments à l'image, si bien que cette forme d'étiquetage offre bien plus de possibilités que le simple étiquetage de l'image. |

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

Pour en savoir plus sur l'utilisation de montage, voir Montage, tableaux d'images. [IM Output]
Étiqueter avec Polaroid Une alternative à montage consiste à utiliser la transformation d'image Polaroid pour générer une image commentée plutôt élégante. |

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

Attention : cette image est déformée (courbée et pivotée) avec une part d'aléatoire ; de ce fait, la taille finale de l'image peut varier, sauf si la rotation est désactivée. Elle contient également des effets d'ombre et de transparence complexes, c'est pourquoi un format PNG a été utilisé pour enregistrer l'image résultante. [IM Output]
Vous pouvez réduire le « flou » de l'image résultante causé par la rotation en recourant à une technique de « suréchantillonnage ». Voir la transformation d'image Polaroid pour un exemple.

Étiqueter directement sur l'image elle-même…

Le problème lorsqu'on écrit du texte directement sur une image est qu'on ne peut pas être certain que le texte sera lisible dans la couleur choisie. L'image sur laquelle on dessine peut être noire, blanche ou un arc-en-ciel de couleurs. Étiquette avec contour : la méthode la plus simple consiste à dessiner la chaîne avec un contour pour séparer le texte de l'image. Cependant, comme le réglage de police "[-stroke](https://imagemagick.org/command-line-options/#stoke)" ajoute de l'épaisseur à la police à la fois vers l'intérieur et vers l'extérieur, cela réduit son efficacité (voir Stroke et StrokeWidth pour plus d'informations). La meilleure façon de dessiner une police avec un contour d'arrière-plan est de dessiner le texte deux fois. |

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

[IM Output]
Comme vous pouvez le voir, cela fonctionne, mais pas très bien. Cela marche mieux avec une police plus épaisse qu'avec les polices par défaut 'Times' ou 'Arial'. Pour plus de détails sur cette technique, voir Police composée à contour épais. Dessiner une boîte assombrie : la méthode plus classique pour rendre le texte annoté plus visible consiste à « assombrir » l'image dans la zone où le texte sera ajouté, puis à dessiner le texte dans la couleur opposée. Par exemple… |

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

[IM Output]
Cette méthode fonctionne bien mais, comme vous pouvez le voir, j'ai décidé de ne pas utiliser "[-gravity](https://imagemagick.org/command-line-options/#gravity)" dans cet exemple pour placer le texte, car le rectangle assombri ne peut pas être positionné avec la gravité (cela pourrait changer à l'avenir). De plus, sa taille et sa position peuvent dépendre de l'image et de la taille finale du texte, ce qui peut nécessiter quelques calculs supplémentaires. Boîte de couleur de fond (undercolor) : au lieu d'essayer de dessiner vous-même la boîte d'arrière-plan, vous pouvez demander à ImageMagick d'appliquer une « couleur de fond » (undercolor) à la boîte. Voir Boîte de couleur de fond du texte. La « couleur de fond » du texte (telle qu'utilisée dans l'API de la bibliothèque) peut être indiquée en ligne de commande avec l'option "[-undercolor](https://imagemagick.org/command-line-options/#undercolor)". |

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

[IM Output]
Comme vous pouvez le voir, c'est bien plus simple que de dessiner soi-même la boîte assombrie ; il est toutefois recommandé d'ajouter une espace au début et à la fin du texte dessiné, afin d'élargir légèrement la boîte. Étiquette composée : la solution la plus idéale consiste à préparer au préalable une image de texte, puis à la superposer comme une image. Ici, nous créons une étiquette simple sur un fond semi-transparent, puis nous la superposons. |

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

[IM Output]
Cette dernière technique présente des avantages bien distincts. La boîte assombrie peut être dimensionnée pour s'ajuster à l'étiquette, et elle peut être placée avec "[-gravity](https://imagemagick.org/command-line-options/#gravity)" pour la positionner correctement, sans nécessiter de connaissance particulière de l'image à laquelle elle est ajoutée ni de la police de dessin utilisée.
De plus, vous n'êtes pas limité à une simple boîte assombrie. Vous pouvez au contraire préparer une image de police très complexe, soit au préalable pour l'appliquer de nombreuses fois, soit à la volée pour chaque image. À peu près tous les styles d'effets de polices composées sont également à votre disposition, ce qui vous permet de rendre vos ajouts de texte très attrayants et d'aspect professionnel. Légende à taille automatique : depuis la sortie d'IM v6.3.2, "[caption:](text.html#caption)" peut désormais ajuster automatiquement la taille du texte pour qu'il s'insère au mieux dans une boîte d'une taille donnée. Mais pour en tirer pleinement parti dans une superposition, il faut vraiment connaître la largeur de l'image annotée. Ici, je récupère cette information, puis je crée et superpose une légende dont le texte est dimensionné automatiquement pour occuper au mieux l'espace fourni, avec retour à la ligne automatique. |

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

[IM Output]
Cette technique est idéale pour superposer des commentaires sur une image, même si le faire en ligne de commande pose ses propres problèmes, puisque vous créez une nouvelle image plutôt que d'annoter une image existante. Voir Échappements d'options définis par l'utilisateur pour une solution à ce problème. Étiquette élégante : comme dernier exemple, je vais superposer une chaîne de texte créée avec une élégante police à contour doux pour m'assurer qu'elle reste visible, mais sans créer de boîte rectangulaire pour l'annotation. |

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

[IM Output]
Si vous prévoyez de composer la même étiquette (par exemple un message de copyright) sur beaucoup d'images, il vaut sans doute mieux générer votre étiquette séparément, puis la composer sur chaque image avec la commande "mogrify". Le décalage "-geometry +0-3" ci-dessus sert à rapprocher la superposition composée du bord, car le contour doux et flou de cette image est souvent plus grand que nécessaire.
Tous les exemples ci-dessus doivent bien sûr être adaptés à vos propres besoins. Ne soyez pas un mouton qui suit ce que font tous les autres. Expérimentez, et donnez à votre propre site web ou programme une saveur distincte de celle des autres. Et surtout, faites-en part à la communauté IM.

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

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

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

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

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

Superposition d'images La commande "magick composite" et l'opérateur d'image "[-composite](https://imagemagick.org/command-line-options/#composite)" d'ImageMagick constituent le moyen principal de placer une image par-dessus d'autres images de diverses manières. Les détails de ces méthodes sont donnés sur la page d'exemples Composition alpha. Il existe cependant des opérateurs de plus haut niveau qui recourent eux aussi à la composition alpha des images. Parmi eux figurent la superposition d'images en couches, ainsi que le positionnement des images avec la gravité, plus bas sur cette page d'exemples. La méthode de composition par défaut est "Over", qui se contente de superposer l'image de premier plan sur l'image d'arrière-plan, en gérant les transparences exactement comme on s'y attend. L'image d'arrière-plan détermine aussi la taille finale du résultat, quel que soit l'endroit où la superposition est placée (à l'aide de l'option "[-geometry](https://imagemagick.org/command-line-options/#geometry)"). Peu importe que la superposition soit au centre, à moitié en dehors de l'image d'arrière-plan ou très loin : l'image de sortie a la même taille que l'image d'arrière-plan. La position geometry de l'image est également affectée par "[-gravity](https://imagemagick.org/command-line-options/#gravity)", de sorte que le placement de l'image superposée peut être défini par rapport à l'un des neuf (9) emplacements possibles. Voir "Positionnement des images et du texte" ci-dessous. En plus du "[-geometry](https://imagemagick.org/command-line-options/#geometry)" de la superposition, chaque image peut aussi disposer d'informations de page ou de canevas (définies avec les options "[-page](https://imagemagick.org/command-line-options/#page)" et "[-repage](https://imagemagick.org/command-line-options/#repage)"), qui peuvent influer sur la position finale des images. Cette information propre à l'image n'est toutefois pas affectée par "[-gravity](https://imagemagick.org/command-line-options/#gravity)". Passons aux exemples…Superposition est probablement la forme d'annotation d'image la plus courante, et elle est très simple à réaliser. Ici, je superpose une icône de château 32x32 au centre d'un cadre de bouton préparé.

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

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

Vous pouvez aussi positionner les sous-images avec précision. Ici, nous plaçons une main pour désigner les petites griffes du dragon féerique.

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

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

La manière exacte dont une image est dessinée sur l'arrière-plan est contrôlée par le réglage "[-compose](https://imagemagick.org/command-line-options/#compose)". La valeur par défaut, utilisée ci-dessus, est "-compose over", qui se contente de superposer l'image sur l'arrière-plan. La plupart des autres méthodes de composition fournies sont peu utilisables sauf dans des situations très particulières, mais en voici quelques-unes. Pour plus de détails sur ce réglage et ses effets, voir Composition alpha. Bumpmap est une méthode de composition délicate qui, pour l'essentiel, assombrit l'image d'arrière-plan en fonction de la luminosité de l'image de premier plan. Tout ce qui est blanc dans la superposition est traité comme transparent, tandis que tout ce qui est noir devient noir sur l'image de sortie. C'est un peu comme utiliser la superposition comme un tampon encreur, et c'est une bonne façon de se représenter cette opération. À titre d'indication, la superposition avec un bumpmap fonctionne mieux avec des images de couleur claire. Vous devrez donc peut-être préparer l'image bumpmap avant de l'utiliser. Ici, nous redimensionnons notre image de dragon avant d'utiliser "-compose bumpmap" pour la dessiner sur une image de parchemin.

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

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

Les bumpmaps peuvent aussi servir à appliquer un effet global sur une image ; dans ce cas, nous appliquons en mosaïque un motif d'arrière-plan de couleur claire sur notre dragon. Rappelez-vous qu'une image bumpmap est traitée comme une image en niveaux de gris, si bien que toute couleur de notre image de superposition est perdue.

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

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

| L'option "[-tile](https://imagemagick.org/command-line-options/#tile)" ci-dessus ne fonctionne que pour les opérations de composition utilisant la commande "magick composite". Avec "magick", vous devrez utiliser le générateur d'image "[tile:](canvas.html#tile)" avec un "[-size](https://imagemagick.org/command-line-options/#size)" pour préciser l'étendue. Vous pouvez bien sûr rendre votre image source superposée plus grande que l'image d'arrière-plan sur laquelle vous la superposez, car le résultat aura la taille de l'image d'arrière-plan (ou de destination).
---|---
La méthode de composition Multiply est surtout connue pour sa capacité à fusionner deux images à fond blanc (par exemple sur une page de texte). Contrairement à la méthode de composition 'bumpmap', elle ne convertit pas au préalable l'image superposée en niveaux de gris.

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

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

REMARQUE : la commande complexe qui génère "text.gif" ci-dessus ne sert qu'à créer une image typique composée uniquement de texte ; la commande "mesgs" affiche simplement une citation précise, comme le fait "fortune" mais avec plus de contrôle. Cette méthode fonctionne très bien dans de nombreuses situations, mais généralement seulement si l'une des deux images est essentiellement noire (ou en niveaux de gris) sur un fond majoritairement blanc. Si les deux images contiennent des zones de couleur, vous pouvez obtenir des résultats inhabituels. Autrement dit, cette technique est parfaite pour superposer des dessins au trait, des schémas ou des images de texte sur des images blanches (ou d'une couleur raisonnablement claire), comme des images de pages imprimées ou numérisées.


Filigrane

Le filigranage est une tâche importante, car il offre un moyen de marquer une image comme appartenant à une entreprise ou à un site web. Malheureusement, cela implique de dégrader l'image d'une façon ou d'une autre, au détriment de l'image elle-même. Les objectifs fondamentaux du filigranage sont les suivants :

  • La marque doit être clairement visible que l'image soit de couleur claire ou foncée.
  • Elle doit être difficile à effacer.
  • et elle ne doit pas être trop gênante pour ceux qui regardent l'image.

Tous ces facteurs sont en conflit, et c'est l'une des raisons pour lesquelles il est si difficile de bien réaliser un filigrane.

Filigrane avec des symboles

L'une des formes de filigrane les plus simples, et les plus gênantes, consiste simplement à placer une image très petite mais bien précise quelque part sur l'image à filigraner. Ici, nous avons généré une image (à l'aide de "logo:") que nous voulons filigraner, en utilisant un petit symbole en forme d'« yeux ».

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

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

La meilleure approche pour placer la petite image est de l'ajouter de façon à ce qu'elle paraisse réellement faire partie de l'image d'origine. Ci-dessus, j'ai ajouté l'image des « yeux » pour qu'elle semble presque faire partie du chapeau du magicien (attention toutefois à ne pas trop l'intégrer à l'image non plus). Par conséquent, cette technique demande une intervention humaine, ce qui la rend impossible à automatiser complètement. La petite image peut aussi être très difficile à retirer, car elle détruit entièrement la partie de l'image qu'elle recouvre. Et, bien réalisée, elle passe presque inaperçue, à moins qu'on ne la cherche spécifiquement. Je l'ai vue utilisée avec de bons résultats à de nombreux endroits sur le web. Un site utilisait un petit symbole en forme de poignard. Les images volées à ce site sont devenues très évidentes lorsque j'ai repéré ce même symbole de poignard sur des images trouvées sur d'autres sites. Filigrane avec du texte Dessiner simplement du texte sur une image est aussi un moyen simple de filigraner, et n'importe lequel des exemples d'étiquette sur image ci-dessus peut servir de type de filigrane. Cependant, pour bien le faire, vous devriez utiliser deux couleurs différentes afin d'éviter que le texte ne disparaisse lorsqu'il est dessiné sur des arrière-plans de couleurs différentes. Il convient donc d'employer une forme d'effets de polices composées. |

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

Cela fonctionne bien et peut être automatisé, mais c'est trop marqué pour constituer un bon filigrane, car cela ressort trop de l'image. [IM Output]
Mais avec un peu de préparation, on peut créer une image à fond transparent qui sera moins envahissante. Pour le détail des étapes utilisées pour générer le texte du filigrane, voir Masquage de police. Les exemples de masques de Masquage d'images peuvent aussi vous aider à comprendre.

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

[IM Output]

Maintenant que nous disposons d'une police de filigrane, nous pouvons l'appliquer à notre image… |

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

Comme vous pouvez le voir, le filigrane est moins marqué qu'auparavant, et il utilise même des nuances de gris plutôt que du blanc et du noir purs. Malgré cela, il reste bien visible quel que soit l'arrière-plan. La page Effets de polices composées détaille de nombreux styles de police utilisables de cette manière sans écraser l'image filigranée. [IM Output]
Vous pouvez aussi répéter le texte en mosaïque sur toute l'image. Ici, nous évitons aussi le recours à une image intermédiaire en utilisant un « pipeline » de commandes, la sortie de l'une alimentant la suivante. |

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

Cela tire parti du fait qu'une image (comme une photographie, et non un schéma) comporte généralement des zones où la chaîne de texte en mosaïque sera visible. Vous voudrez peut-être rendre le texte semi-transparent pour votre propre filigrane (en utilisant par exemple un gris à moitié transparent tel que "'#80808080'"). Vous pourriez aussi garder cette technique de mosaïque à l'esprit avec les véritables techniques de filigrane décrites ci-après. [IM Output]

Filigrane avec des images

ImageMagick propose également plusieurs options particulièrement utiles pour un filigrane plus subtil, couvrant une plus grande surface. C'est généralement ce à quoi on fait référence le plus souvent quand on dit qu'on « filigrane » une image. À droite se trouve une image de « dragon d'eau » que j'utiliserai pour ces démonstrations. Elle comporte une certaine transparence, dont je me suis servi pour vérifier qu'IM fait ce qu'il faut concernant la transparence, en évitant tout affreux aspect « carré » dans les résultats. [IM Output]
Avant IM version 6, les options "-watermark" et "-dissolve" géraient mal le canal alpha (transparence) de l'image superposée, produisant des effets très étranges.
--- ---
La composition Watermark était destinée à filigraner les images et, bien qu'elle fonctionne, elle n'a tendance à donner de bons résultats qu'avec des images de superposition en blanc et noir purs, produisant de vilains artefacts sur les bords.
  magick composite -watermark 30% -gravity south \
            wmark_image.png  logo.jpg    wmark_watermark.jpg

Pour des informations plus détaillées sur cette option, voir la page Utilisation de l'option Watermark. [IM Output]
Dissolve s'est révélé, pour moi comme pour d'autres, mieux fonctionner. |

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

Cela fonctionne très bien, mais des parties du filigrane disparaîtront sur les images comportant des pixels blanc et noir purs. Autrement dit, fondre du blanc sur du blanc et du noir sur du noir ne sera pas visible dans l'image finale. Comme ces deux couleurs sont très courantes, il vaut mieux prétraiter un peu le filigrane pour qu'il utilise diverses nuances de gris plutôt que du blanc et du noir purs. (Voir « Dissolve grisé » ci-dessous) [IM Output]
Pour des informations plus détaillées sur cette option, voir la page Utilisation de l'option Dissolve. En mosaïque (Tiled) : vous pouvez aussi répéter le filigrane en mosaïque sur toute l'image d'arrière-plan au lieu de l'ajouter à un seul endroit. Il suffit de remplacer votre position de gravité par "[-tile](https://imagemagick.org/command-line-options/#tile)". Bien sûr, dans ce cas, vous voudrez peut-être rendre le filigrane encore plus discret. |

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

[IM Output]
Bumpmap grisé : pour utiliser correctement bumpmap comme filigrane, l'image doit être préparée afin de ramener le blanc comme le noir vers une plage de gris plus clairs, à l'aide d'une technique d'ajustement en niveaux de gris. Sans cela, le résultat serait extrêmement marqué. |

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

[IM Output]
Le plus gros problème du bumpmap comme filigrane est que l'opération ne peut qu'assombrir une image. Cette technique est donc à peu près inutile pour les images très sombres. Dissolve grisé : la même technique de prétraitement peut aussi être utile avec la méthode dissolve, de sorte que les parties blanches de l'image de filigrane s'assombrissent légèrement sur un fond blanc, et de même que les zones noires du filigrane s'éclaircissent sur les parties noires de l'image. |

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

[IM Output]
C'est, je dirais, à peu près idéal comme filigrane, satisfaisant toutes les exigences. J'ajusterais toutefois davantage le dissolve final pour rendre le filigrane encore moins perceptible. Dissolve grisé en mosaïque : exactement comme ci-dessus, mais répété en mosaïque sur l'image avec une valeur de dissolve encore plus faible. |

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

[IM Output]
| La commande "magick composite" ne sait pas gérer les fichiers multi-images tels que les animations. D'autres méthodes le permettent cependant. Voir Modifier les animations, annotation pour des exemples d'annotation et de superposition sur des fichiers multi-images.
---|---


Positionner les images et le texte avec la gravité

La « gravité » de la situation

Comme vous l'avez vu plus haut, pouvoir positionner des images et du texte dans une image plus grande peut être tout aussi important que le reste. Naturellement, le réglage "[-gravity](https://imagemagick.org/command-line-options/#gravity)" en est l'un des aspects les plus importants.

Sur la liste de diffusion ImageMagick, Tim Hunter a déclaré :
« La gravité vous rendra fou jusqu'à ce que vous en preniez le coup de main. »

C'est un sentiment que je partage sans réserve. La gravité ne s'applique que dans les situations suivantes…

  • Toute opération faisant intervenir un réglage de type « geometry », comme "[-crop](https://imagemagick.org/command-line-options/#crop)" et le positionnement d'images "[-geometry](https://imagemagick.org/command-line-options/#geometry)" pour la composition alpha, y compris la composition multi-images en couches.
  • Elle sert aussi à spécifier la justification du texte par les différents générateurs de texte vers image tels que "[label:](text.html#label)", ainsi que la justification du texte par les différents générateurs de texte vers image tels que "[caption:](text.html#caption)".
  • L'opérateur de dessin de texte "[-annotate](https://imagemagick.org/command-line-options/#annotate)" l'utilise également pour le positionnement du texte ainsi que pour la justification.
  • Et enfin, elle est utilisée par la méthode "[-draw](https://imagemagick.org/command-line-options/#draw)" pour ses méthodes 'text' et "image', et UNIQUEMENT ces méthodes-là.

En revanche, "[-gravity](https://imagemagick.org/command-line-options/#gravity)" n'est PAS utilisé pour

  • Les opérateurs de liste d'images ou de couches, tels que "[-mosaic](https://imagemagick.org/command-line-options/#mosaic)", "[-flatten](https://imagemagick.org/command-line-options/#flatten)" et la plupart des méthodes "[-layers](https://imagemagick.org/command-line-options/#layers)", et surtout pas dans les animations GIF. Toutes ces opérations utilisent des décalages d'image sur un canevas virtuel plus grand (défini avec les réglages de métadonnées "[-page](https://imagemagick.org/command-line-options/#page)" et "[-repage](https://imagemagick.org/command-line-options/#repage)") pour positionner les images. Ces décalages sont toujours relatifs au coin supérieur gauche du canevas virtuel de l'image. Aucune notion de "[-gravity](https://imagemagick.org/command-line-options/#gravity)" n'intervient dans cette méthode.
  • Aucune autre méthode "[-draw](https://imagemagick.org/command-line-options/#draw)" n'utilise "[-gravity](https://imagemagick.org/command-line-options/#gravity)" pour le positionnement. Il est d'ailleurs peu probable que cela change, car "[-gravity](https://imagemagick.org/command-line-options/#gravity)" n'est pas défini dans la spécification SVG qu'IM suit pour ces fonctions de bas niveau.

Qu'est-ce que tout cela signifie ? Premièrement, et c'est le plus important, cela définit le point d'origine que "[-geometry](https://imagemagick.org/command-line-options/#geometry)" utilise pour positionner le texte et les images superposés par rapport aux bords, aux côtés et au centre de l'image, sans que l'utilisateur ait besoin de connaître la taille réelle de l'image. C'est sa fonction première. Deuxièmement, cela définit la justification horizontale et verticale de l'objet superposé (texte ou image) par rapport à ce point de gravité défini. Par exemple, avec la gravité 'East', le texte ou l'image sera placé à droite (justification à droite) du point défini. La justification devrait techniquement être un réglage distinct de "[-gravity](https://imagemagick.org/command-line-options/#gravity)", bien qu'étroitement liée, mais IM combine actuellement les deux en un seul réglage. Il existe une volonté de séparer ces deux aspects, de sorte que si un réglage "justification" est indéfini, il se rabatte sur le réglage "[-gravity](https://imagemagick.org/command-line-options/#gravity)" courant. Si vous en avez besoin, demandez-le à Cristy (via la liste de diffusion). Si suffisamment d'utilisateurs le réclament, je suis sûr que cela finira par être mis en œuvre.

Positionnement des images avec la gravité

Voici un exemple d'utilisation de la gravité pour positionner des images sur un arrière-plan.

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

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

Notez que la position réelle de l'image est aussi justifiée selon le réglage "[-gravity](https://imagemagick.org/command-line-options/#gravity)". Autrement dit, une gravité "South" centre l'image en bas de l'image plus grande, mais au-dessus de ce point de gravité. Cela prendra plus d'importance plus tard avec la rotation du texte. L'autre chose à retenir est que la position spécifiée par tout réglage "[-geometry](https://imagemagick.org/command-line-options/#geometry)" est relative à la position où la gravité place l'image. Non seulement cela, mais la direction de la position est aussi modifiée de sorte qu'elle soit orientée vers l'intérieur. Par exemple, "-gravity South -geometry +10+10" déplace l'image d'étiquette davantage vers l'intérieur de l'arrière-plan. Autrement dit, la direction Y de la position geometry a été inversée, tandis que la direction X est restée inchangée.

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

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

Vous pouvez aussi utiliser "[-gravity](https://imagemagick.org/command-line-options/#gravity)" avec "-draw image" pour placer plusieurs images avec une seule commande. |

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

[IM Output]
Et vous pouvez désormais aussi utiliser "[-composite](https://imagemagick.org/command-line-options/#composite)" pour superposer des images sur l'arrière-plan… |

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

[IM Output]
Pour plus de détails sur les réglages "[-compose](https://imagemagick.org/command-line-options/#compose)" utilisés ci-dessus, voir Composition alpha. Pour d'autres méthodes de combinaison et de superposition de plusieurs images en une seule, voir la section des exemples IM Couches de plusieurs images.

Positionnement du texte avec la gravité

C'est très bien pour les images, mais qu'en est-il du dessin de texte directement sur les images ? Eh bien, les mêmes effets de base que pour les images s'appliquent. Comme mentionné plus haut, la gravité affecte aussi le positionnement du texte, que l'on utilise la méthode 'text' de "[-draw](https://imagemagick.org/command-line-options/#draw)" ou le meilleur opérateur de dessin de texte "[-annotate](https://imagemagick.org/command-line-options/#annotate)". |

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

[IM Output]
Il existe une différence très importante entre le positionnement des images et celui du texte. Si vous dessinez une chaîne de texte sans définir aucune forme de "[-gravity](https://imagemagick.org/command-line-options/#gravity)", la chaîne sera dessinée par rapport à la « ligne de base » de la police. Par exemple, faisons-le concrètement… |

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

[IM Output]
Si vous regardez attentivement, vous verrez que seule la petite boucle de la queue du 'g' de 'String' est visible sur le bord supérieur de l'image résultante. Le reste de la chaîne a été dessiné en dehors de l'image d'arrière-plan. En revanche, si vous réglez "[-gravity](https://imagemagick.org/command-line-options/#gravity)" sur 'NorthWest', le texte est positionné comme s'il s'agissait d'une image. C'est-à-dire par rapport à sa boîte englobante ou boîte de couleur de fond telle que définie par la police. Par exemple… |

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

[IM Output]
La raison de cette distinction est de garantir que le dessin de texte d'IM reste compatible avec d'autres formats d'images de dessin vectoriel comme le « SVG ». Ces formats n'utilisent pas la gravité ; activer la gravité indique donc à IM de suivre, pour le dessin de texte, les mêmes règles que pour le placement d'images, plutôt que les règles du dessin vectoriel qui reposent sur la « ligne de base » de la police et le point de « départ » du texte. Si vous activez la gravité puis souhaitez la désactiver plus tard, vous pouvez utiliser soit "[-gravity](https://imagemagick.org/command-line-options/#gravity) none", soit "[+gravity](https://imagemagick.org/command-line-options/#gravity)" pour la rétablir au réglage par défaut « sans gravité ». Appliquons un décalage de texte et dessinons à la fois les arguments par défaut 'None' et 'NorthWest' de "[-gravity](https://imagemagick.org/command-line-options/#gravity)", juste pour que vous voyiez à quel point les deux formes sont proches. |

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

[IM Output]
Même si cela ne se voit pas dans cet exemple, ces deux chaînes peuvent se chevaucher, en particulier au niveau des jambages de lettres comme 'g' et 'p'. C'est-à-dire que les deux chaînes ne sont pas correctement séparées par des unités de 'pointsize', mais seulement par la hauteur de ligne de base de la police. Le mieux est de ne pas mélanger les deux modes dans votre propre traitement d'image. Utilisez la gravité, ou ne l'utilisez pas. Le choix vous appartient. Texte sur le bord gauche avec la gravité Comme dernier exemple, voici la manière d'annoter réellement de façon centrée le long du bord gauche d'une image. Le problème ici est que, lorsqu'on fait pivoter du texte, il pivote autour de la « poignée » du texte. Malheureusement, cette poignée est définie par la gravité AVANT que le texte ne soit pivoté, et de ce fait cela ne fonctionne pas très bien, sauf si vous vous limitez au « texte centré ». [IM Output] Par exemple, voici un « premier essai » typique de positionnement du texte pour qu'il soit placé au centre du bord gauche de l'image. Bien entendu, il échoue de façon plutôt inattendue ! |

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

Comme vous pouvez le voir, le texte a bien été placé sur le bord gauche, mais seulement de sorte que le début (là où se trouve la « poignée » avant rotation) soit centré. La cause de ce problème est qu'en IMv7 le réglage "-gravity" sert aussi directement à définir la « justification » du texte (qui fixe la « poignée » utilisée pour positionner le texte). Il existe des démos animées des effets de la gravité sur le texte pivoté, écrites avec l'API PerlMagick (téléchargez "[**im_annotation.pl**](../static/img/scripts/im_annotation.pl)"). J'ai aussi créé une version en script shell du même programme, "[**im_annotation**](../static/img/scripts/im_annotation)" et "[**im_annotation_2**](../static/img/scripts/im_annotation_2)". Une astuce pour que cela fonctionne : faire d'abord pivoter toute l'image, puis utiliser center south ! C'est une solution absurde, mais elle fonctionne. |

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

[IM Output]
Une autre méthode est présentée plus bas dans Positionnement du texte avec Distort.

Positionnement du texte avec Draw

Ci-dessus, j'ai utilisé un « décalage de texte » pour positionner le texte par rapport au point "[-gravity](https://imagemagick.org/command-line-options/#gravity)", mais ce n'est pas la seule façon de faire. L'autre méthode consiste à utiliser une option "-draw translate" pour positionner le texte. Cela a l'avantage de permettre de positionner le texte sans les effets de la gravité, tout en continuant d'utiliser la gravité pour « justifier » la « poignée » de positionnement à l'intérieur du texte. Dans ces exemples, j'ai ajouté quelques lignes de construction supplémentaires (elles non plus ne sont pas affectées par la gravité) pour montrer comment la position est appliquée à partir du point central de l'image. Texte avec un décalage… |

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

[IM Output]
Texte avec une translation… |

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

[IM Output]
Comme vous pouvez le voir, les deux produisent le même résultat effectif. Mais comme "-draw text" exige que vous fournissiez un décalage faisant partie de ses arguments, on l'utilise plus couramment pour positionner le texte dessiné en ligne de commande. Cependant, bien que ces deux méthodes produisent le même résultat, elles donneront des résultats totalement différents lorsqu'une rotation du texte est également appliquée. Cela tient essentiellement à l'ordre dans lequel les actions sont appliquées.

Dessiner du texte pivoté

Il existe deux façons distinctes de positionner le texte dessiné : utiliser un « décalage de texte », ou « translater » le texte jusqu'à sa position finale. Les effets de ces deux méthodes de positionnement produisent des résultats très différents lorsqu'une rotation est aussi appliquée. La raison en est complexe, mais tient essentiellement à la façon dont IM réalise les déformations de la surface de dessin. Cela dit, voyons ce qui se passe si vous faites pivoter du texte avec les deux positions différentes. Juste un décalage, sans rotation… |

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

[IM Output]
Rotation de texte avec un décalage… |

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

[IM Output]
Rotation de texte avec une translation… |

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

[IM Output]
C'est en réalité ce que veulent la plupart des gens. La rotation avec décalage peut toutefois être utile pour certains effets spéciaux. Remarquez comment l'ordre de ces déformations de la surface de dessin est inversé par rapport à l'ordre dans lequel elles sont données. La rotation est effectuée en premier, et la translation en second. Si vous inversez les méthodes 'rotate' et 'translate', vous obtiendrez le même résultat qu'un simple « décalage de texte », un décalage pivoté. L'opérateur "[-annotate](https://imagemagick.org/command-line-options/#annotate)" a été conçu spécifiquement pour faciliter le positionnement du texte pivoté, en demandant explicitement à IM de dessiner le texte avec rotation, au lieu de « déformer la surface ». Annotate avec rotation et décalage… |

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

[IM Output]
Le problème avec les exemples ci-dessus est qu'en IMv7 le réglage "[-gravity](https://imagemagick.org/command-line-options/#gravity)" désigne non seulement la position sur l'image d'arrière-plan, mais aussi la position dans l'image de superposition à dessiner. IMv7 ajoutera la « justification du texte », qui désigne la position de la superposition, comme un réglage distinct (mais lié) de la gravité (position d'arrière-plan).

Positionnement du texte avec Distort

L'utilisation de la distorsion SRT avec la superposition d'images en couches est une méthode particulièrement adaptée pour placer des images (ou du texte dans des images). Pour l'essentiel, elle vous offre un contrôle complet de bas niveau à la fois sur le point où l'image est placée et sur la façon dont l'image est disposée par rapport à ce point. Pour commencer, nous créons ici une « image de texte » à fond transparent et nous nous contentons de « superposer en couche » l'image sur l'image d'arrière-plan. |

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

[IM Output]
Comme vous pouvez le voir, le texte a simplement été ajouté à l'image dans le coin supérieur gauche. Faisons-le pivoter avec distort (variante en couches) — Notez l'usage des parenthèses pour limiter l'image que nous déformons ! |

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

[IM Output]
Notez que la position du texte n'a PAS changé ! Tout ce qui s'est produit, c'est que le distort a fait pivoter le texte autour du point central (la poignée), mais de sorte que, par rapport au « canevas virtuel », ce point n'a pas bougé. Ainsi, lorsque l'image désormais plus grande est aplatie, son point de rotation, « le centre de l'image de texte », n'a pas bougé. L'étape suivante consiste à déplacer cette poignée, mais pour cela nous devons utiliser presque l'ensemble complet des arguments de la distorsion SRT. Comme nous voulons aussi continuer à utiliser la « poignée centrale », nous devons recourir à des échappements en pourcentage de propriétés d'image, ou plus précisément aux échappements FX en pourcentage. Plaçons donc le centre à '+60+60' dans l'image d'arrière-plan |

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

[IM Output]
Une autre façon de déplacer une « image de couche » consiste à utiliser l'opérateur Repage. En particulier un déplacement relatif à l'aide d'un indicateur '!'. La « poignée » est ici, par la nature même des images de couche, le coin supérieur gauche. L'opérateur de distorsion SRT ne se contente pas de translater l'image en utilisant la poignée spécifiée : il peut utiliser des positions sous-pixel (à virgule flottante) pour ces deux poignées. Autrement dit, il peut déformer le texte par incréments sous-pixel vers n'importe quel emplacement, sans les restrictions entières que présentent la plupart des autres opérations. Le dernier exemple consiste à placer le texte pivoté de 90 degrés sur le bord gauche. La poignée du texte autour de laquelle pivoter et à positionner sera cette fois le centre bas du texte, avant sa rotation. C'est-à-dire une position calculée de '%[fx:w/2],%h'. La position sur l'image d'arrière-plan doit elle aussi désormais être calculée pour être le centre du bord gauche ('0,%[fx:h/2]'). Le problème est que l'opérateur de distorsion SRT n'a pas accès à l'image d'arrière-plan lorsqu'il déforme l'image de texte. La solution est d'effectuer ce calcul de position lorsque l'image d'arrière-plan est disponible, et de l'enregistrer dans un « réglage personnel » qui pourra ensuite être ajouté aux arguments du distort. Cette technique est examinée de plus près dans Extraire des informations d'autres images. Voici donc le résultat. Calculez d'abord la position sur l'image d'arrière-plan. Puis déformez l'image de texte pour que sa « poignée » soit elle aussi déplacée vers cette position pré-calculée. |

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

[IM Output]
La chaîne 'my:' peut être n'importe quoi qui n'entre pas en conflit avec les préfixes existants. C'est-à-dire que je m'en sers pour stocker MES réglages, distincts de tout autre réglage qu'ImageMagick peut utiliser pour les codecs ou des options particulières. Préfixer avec 'my:' est un bon choix pour cela. Les échappements en pourcentage sont traités purement comme des substitutions de chaînes, et nous pourrions d'ailleurs générer toute l'option Distort sous forme de chaîne. Le seul problème est que vous ne pouvez pas faire de calculs sur vos réglages 'my:' une fois qu'ils ont été définis. Tout calcul doit donc être effectué au préalable. C'est un point qui sera étudié pour IMv7, afin que les expressions FX utilisent des variables d'échappement en %.