Exemples ImageMagick -- Création de vignettes et encadrement
Préface et index des exemples ImageMagick
Création générale de vignettes
- Vignettes d'une hauteur précise
- Redimensionner la vignette pour l'ajuster
- Compléter la vignette par remplissage
- Rogner la vignette pour l'ajuster
- Ajustement de la taille par surface
- Résumé de l'ajustement à un espace donné
- Remplissage ou rognage carré
- Rognage manuel
- Pages de vignettes HTML
- Vignette de lien de page web FavIcon
- Ajout d'étiquettes d'image
- Bouton en relief
- Bouton bulle
- Ajout de bordures
- Cadre simple
- Encadrement avec Montage
- Bords doux et flous
- Coins arrondis et façonnés
- Bord de papier déchiré
- Ajout d'une ombre
- Ajout d'une certaine épaisseur
- Vignettes façon Polaroid
|
- Auto-encadrement (externe)
- Auto-encadrement (interne)
- Simple superposition de bordure
- Badge par superposition
- Technique masque et peinture
- Bordure arrondie
- Badge par masque et peinture
- Technique peinture et masque
- Coins avec page qui se corne
- Superposition de coin élaborée
- Badge par peinture et masque
- Technique du masque d'éclairage
- Bulle de verre
- Badge avec masque d'éclairage
Encadrement à partir d'images de bord
- Ajout (append) trop simpliste
- Encadrement par superposition étendue
- Assemblages d'angles à 45 degrés
L'une des plus grandes utilisations d'ImageMagick est la création de vignettes pour les albums photo de famille, les pages sur le sport et les loisirs, les catalogues, etc. Typiquement pour un usage sur le World Wide Web ou sur des CD photo. Cette page fournit des exemples et des techniques employés pour générer des vignettes.
Stockage des vignettes
Je voudrais commencer par un point très important. L'image originale issue des caméras vidéo et de la numérisation de photos devrait être conservée en lieu sûr dans son format d'origine, de préférence un format non destructif (pas le format d'image JPEG), sans aucune modification, redimensionnement ou autre changement, sauf éventuellement un changement de nom de fichier. Bien sûr, une image numérisée peut être re-numérisée, mais il vaut bien mieux réutiliser votre source originale que de la refaire plus tard à partir d'une copie déjà dégradée. C'est TRÈS important car toute forme de modification entraîne la perte d'une partie de l'information de l'image, et cela fournit une source à partir de laquelle vous pouvez retravailler votre image pour d'autres usages. L'image originale n'a pas à être votre image de travail, qui peut être redimensionnée ou ajustée en couleur pour l'affichage ; assurez-vous simplement que votre image est enregistrée et sauvegardée quelque part en sécurité pour un usage futur. La chose suivante à faire, avant même de créer la moindre vignette, est de décider comment vous voulez enregistrer votre vignette par rapport au format de votre image de taille normale, puis de vous en tenir à ce schéma. Ceci est particulièrement important pour les pages web. Parmi les schémas possibles...
- Enregistrer l'image principale de la photo au format destructif JPEG à la taille voulue ou nécessaire, puis utiliser le même nom pour la vignette générée mais avec le format d'image GIF. Autrement dit, même nom de fichier mais un format et un suffixe différents. Image principale :
photo_name.jpgVignette :photo_name.gif - Stocker les vignettes sous le même nom dans un sous-répertoire appelé par exemple «
thumbs» ou tout autre nom qui vous convient. Image principale :photo_name.jpgVignette :thumbs/photo_name.jpg - Utiliser le même format que l'image originale, mais avec une chaîne supplémentaire ajoutée au nom de fichier. Les ajouts de chaînes typiques incluent «
_tn», «_small», «_thumb», etc. Image principale :photo_name.jpgVignette :photo_name_tn.jpg - Une combinaison de ce qui précède. Rien ne vous empêche d'enregistrer les vignettes dans un format d'image différent, avec un suffixe d'image supplémentaire ajouté au nom de fichier, et enregistrées dans un sous-répertoire ! Image principale :
images/photo_name.jpgVignette :thumbs/photo_name.jpg.gifC'est en fait assez courant sur le WWW, et j'ai même vu les deux répertoires stockés sur des machines complètement séparées !
Le premier schéma peut utiliser « magick mogrify » pour générer toutes vos vignettes, sans détruire l'image originale, en utilisant un réglage « [-format](https://imagemagick.org/command-line-options/#format) » pour spécifier le format de l'image de sortie. Depuis IM v3.2.0, le deuxième schéma est désormais lui aussi réalisable avec « magick mogrify » grâce à l'ajout d'un réglage spécial « [-path](https://imagemagick.org/command-line-options/#path) » qui indique un répertoire différent dans lequel enregistrer les images modifiées. Par exemple, ceci convertit des images JPG en vignettes GIF dans un sous-répertoire « thumbs » qui vient d'être créé.
mkdir thumbs
magick mogrify -format gif -path thumbs -thumbnail 100x100 *.jpg
Les autres méthodes vous obligeront soit à faire d'abord une copie de l'image originale avant d'exécuter « magick mogrify », soit à créer un script spécial pour traiter les images, soit à recourir à une autre méthode maison. Un certain nombre de techniques hors IM plus simples sont détaillées à la fin de la section d'exemples sur le Traitement par lots -- Sans utiliser « magick mogrify ». Quelle que soit la méthode choisie, l'important est de choisir un schéma de stockage des vignettes, puis de s'y tenir. En utilisant le même schéma pour toutes vos vignettes, vous pouvez alors écrire des scripts shell ou Perl qui facilitent la génération des vignettes et même la génération des liens HTML. Nous y reviendrons plus loin.
Sélection du format de vignette
Le format dans lequel vous enregistrez une vignette peut faire une grande différence sur sa taille finale sur le disque et sur la vitesse de téléchargement des pages web. À cet égard, je vous recommande d'étudier le résumé des divers Formats de fichiers courants. En particulier, vous devriez noter...
**JPEG** se compresse bien et est destructif, mais il est conçu pour de grandes images du monde réel, pas pour de petites vignettes. Il n'autorise pas non plus la moindre forme de transparence. En résumé, ce format est bon pour les grandes images, mauvais pour les vignettes. Attention aux profils (voir la section suivante). Bien que le JPG ne soit pas recommandé pour les vignettes, pour la visualisation d'images sur le WWW il est recommandé d'utiliser une image plus petite de 800x600 pixels, à un pourcentage de « `[-quality](https://imagemagick.org/command-line-options/#quality)` » bien plus faible (disons 50 voire 30 %), même si le rendu ne sera pas très beau. Il a aussi été suggéré que l'usage de « `[-sampling-factor](https://imagemagick.org/command-line-options/#sampling-factor) 2x1` » produira lui aussi une taille d'image JPEG plus petite. Je recommande de ne jamais placer directement l'image originale complète sur le web, sauf temporairement (à un emplacement référencé) pour qu'un ami la télécharge. N'oubliez pas de ne pas y mettre de lien (même par l'indexation de répertoire), et jamais plus d'une journée, sinon elle risque d'être indexée par Google.
**GIF** fonctionne pour les images simples et petites, et se compresse correctement. Il a une limite de 256 couleurs, mais pour les petites images cela se remarque rarement. Il peut aussi réaliser des animations d'images façon dessin animé, non pas que ce soit nécessaire pour des vignettes, à moins que vous ne vouliez vraiment faire dans le sophistiqué. Ce qui pose problème, c'est que le format ne dispose que d'une transparence booléenne (activée/désactivée), ce qui donne des bords affreux sur les images façonnées. Les solutions sont de concevoir la vignette pour n'utiliser qu'une transparence booléenne, ou de faire en sorte qu'elle ne puisse être utilisée que sur une couleur d'arrière-plan précise. Pour les détails, voir les exemples sur les [GIF sur une couleur ou un motif d'arrière-plan](formats.html#bgnd).
**PNG** est le format moderne idéal pour les vignettes. Il a une bonne compression et des styles de format internes. Il est non destructif, peut afficher toutes les couleurs, et de nos jours il est compris par presque tous les navigateurs (bien que pour Microsoft Internet Explorer, avant la v7, il faille ajouter du JavaScript aux pages web). Plus important encore, ce format comprend les couleurs semi-transparentes, ce qui rend les ombres et les bords nets et clairs, ou estompés et flous selon votre souhait. Ce format ne fait cependant pas d'animations, contrairement au format apparenté MNG. Très peu de navigateurs semblent toutefois prendre en charge ce format. Pour les vignettes, vous pouvez réduire la taille de l'image finale en réduisant la profondeur et le nombre de couleurs, ainsi qu'en réglant une qualité de compression « `bzip` » plus élevée (premier chiffre de « `[-quality](https://imagemagick.org/command-line-options/#quality)` ») pour votre image de vignette finale. Par exemple, ce qui suit est suggéré pour de petites vignettes PNG n'impliquant pas de transparence.
-strip -quality 95 PNG8:thumbnail.png
Ce qui utilise un format PNG plus petit, sur 8 bits, ou limité à 256 couleurs. Vous pouvez aussi retraiter l'image finale au moyen d'applications secondaires (voir Traitement PNG hors IM) qui peuvent trouver automatiquement la meilleure compression PNG pour cette image précise. Il existe aussi des programmes qui effectuent cette réduction de couleurs vers le format PNG interne plus petit, tout en préservant les couleurs semi-transparentes. C'est quelque chose qu'IM ne gère pas actuellement. . Un dernier mot au sujet des formats... Quel que soit le format que vous utilisez pour vos vignettes, si vous devez enregistrer une image intermédiaire inachevée, utilisez un format d'image PNG (sans aucune réduction de couleurs) ou MIFF. Cela préservera autant d'information de couleur que possible sur l'image au stade intermédiaire. Ne procédez à la réduction de couleurs, ou à l'enregistrement aux formats GIF ou JPEG, qu'en tant qu'étape absolument finale. C'est important, alors je le répète...
N'utilisez PAS JPEG, PNG8 ou GIF pour les images de travail intermédiaires !
Mieux vaut utiliser PNG ou MIFF.
Profils, suppression (strip) et gestion du JPEG
Beaucoup d'images issues d'appareils photo numériques, de logiciels de numérisation et de certains logiciels de dessin (Photoshop est réputé pour cela) enregistrent des informations supplémentaires sur l'image sous forme de profils. Cela concerne des formats d'image tels que JPEG, PNG, TIFF et, depuis IM v6.2.4-1, GIF. Bien sûr, le format spécifique à IM, MIFF, fait cela lui aussi. (Voir Profils d'image pour des informations plus détaillées). Ces profils peuvent atteindre 60 Kb, ce qui peut faire une grande différence sur la taille de votre fichier, et par défaut IM préserve ces informations de profil. Les vignettes n'ont pas besoin de ces données, et souvent l'image principale elle-même n'en a pas besoin. Vous pouvez aussi supprimer les profils de vos images avec les commandes IM...
magick input.jpg -strip output.jpg
magick mogrify -strip *.jpg
Vous pouvez aussi utiliser l'option « [-profile](https://imagemagick.org/command-line-options/#profile) '*' » pour supprimer les profils. Il est cependant recommandé de ne supprimer les profils que lorsque vous modifiez une image, en particulier lorsque vous en réduisez la taille pour l'affichage web ou pour des vignettes. Supprimer les profils tout en redimensionnant, en particulier pour générer de plus petites vignettes, est si courant que « [-resize](https://imagemagick.org/command-line-options/#resize) » et « [-strip](https://imagemagick.org/command-line-options/#strip) » ont été combinés en une nouvelle opération, précisément dans ce but. Naturellement, cette opération de redimensionnement s'appelle « [-thumbnail](https://imagemagick.org/command-line-options/#thumbnail) ». Par exemple...
magick -define jpeg:size=240x180 image.jpg -thumbnail 120x90 thumbs/image.gif
magick mogrify -path thumbs -format gif -define jpeg:size=240x180 -thumbnail 120x90 '*.jpg'
| Avant IM v6.5.4-7, le « [-thumbnail](https://imagemagick.org/command-line-options/#thumbnail) » supprimait TOUS les profils de l'image, y compris les profils de couleur ICC. À partir de cette version, les profils de couleur sont préservés. Si le profil de couleur n'est pas voulu, alors supprimez tous les profils avec « [-strip](https://imagemagick.org/command-line-options/#strip) ».
---|---
« [magick mogrify](basics.html#mogrify) » génère bien sûr des vignettes pour tout un répertoire d'images JPEG, mais veillez à ce qu'il n'écrase pas des vignettes que vous voulez conserver. Pour un certain nombre d'autres méthodes hors IM permettant de boucler sur un grand nombre d'images, voir la section d'exemples sur le Traitement par lots -- Sans utiliser Mogrify. Pour les très grandes images, l'opérateur de redimensionnement « [-thumbnail](https://imagemagick.org/command-line-options/#thumbnail) » va plus loin et réduit d'abord l'image à 5 fois la taille finale de la vignette, avant de procéder à l'opération de redimensionnement proprement dite. Cela accélère encore la génération des vignettes. Cependant, pour la mise en vignette des images JPEG, on peut employer une méthode encore meilleure pour limiter la taille initiale de l'image, en ne lisant tout simplement pas l'image entière en mémoire au départ. Le réglage « [-define](https://imagemagick.org/command-line-options/#define) jpeg:size= » (comme montré dans l'exemple ci-dessus) est un indice spécial donné à la bibliothèque d'images JPEG pour réduire la quantité de données lues à partir de TRÈS GRANDES images JPEG. Voir Lecture des fichiers JPEG. | _Avant IM v6.5.6-0, ce réglage de codeur était extrait du réglage « [-size](https://imagemagick.org/command-line-options/#size) ». Cela causait des problèmes lorsque les utilisateurs employaient « [-size](https://imagemagick.org/command-line-options/#size) » pour la création d'image mais que la lecture JPEG produisait ensuite des résultats inattendus. C'est pourquoi cela a été transformé en un réglage de codeur spécial à la place.
Dans les anciennes versions d'IM, vous pourriez avoir besoin de réinitialiser le réglage avec « [+size](https://imagemagick.org/command-line-options/#size) » avant de lire des images JPEG, à cause de ce « double » rôle._
---|---
Depuis IM version 6.2.6-2, un nouveau Modificateur de lecture d'image a été ajouté, qui vous permet de redimensionner l'image d'entrée immédiatement après sa lecture. Cette option fonctionne avec N'IMPORTE QUEL format d'image, pas seulement l'image JPEG. Elle ne remplace toutefois pas l'usage d'un réglage « [-define](https://imagemagick.org/command-line-options/#define) jpeg:size= » pour les images JPEG. Ainsi, la manière recommandée de redimensionner N'IMPORTE QUEL format d'image d'entrée est désormais...
magick -define jpeg:size=240x180 input.img'[120x90]' \
-strip output_thumbnail.gif
Passons donc aux exemples pratiques de vignettes IM...
Création de vignettes en général
Générer des vignettes en général (hauteur spécifique)
Convertissons avec magick une grande image JPEG d'exemple en une vignette GIF de 90 pixels de haut, la largeur étant ajustée automatiquement (dans la limite de 250 pixels de largeur) afin de préserver le rapport d'aspect de l'image. |
magick -define jpeg:size=500x180 hatching_orig.jpg -auto-orient \
-thumbnail 250x90 -unsharp 0x.5 thumbnail.gif
![]()
Notez que j'ai utilisé l'option « [-thumbnail](https://imagemagick.org/command-line-options/#thumbnail) » ci-dessus. Celle-ci ne se contente pas de redimensionner l'image : elle supprime aussi tous les profils et toutes les informations de commentaire éventuellement présents dans l'image JPEG originale. De plus, comme elle utilise l'opérateur de redimensionnement « [-sample](https://imagemagick.org/command-line-options/#sample) » pour la réduction initiale de l'image, elle est plus rapide tout en produisant des résultats convenables pour de petites vignettes. J'ai aussi défini un « [-define](https://imagemagick.org/command-line-options/#define) jpeg:size= » minimal pour l'image en cours de lecture. Cette valeur est transmise à la bibliothèque JPEG, qui renverra une image d'une taille comprise entre cette valeur et son double (si possible), plutôt que l'énorme image originale entière. En clair, il s'agit de ne pas saturer la mémoire de l'ordinateur avec une image gigantesque lorsque ce n'est pas nécessaire. L'indice de taille JPEG que j'utilise vaut au moins le double de la vignette finale, afin que le redimensionnement produise malgré tout un résultat d'apparence correcte. L'opérateur « [-auto-orient](https://imagemagick.org/command-line-options/#auto-orient) » garantit que l'image, si elle provient d'un appareil photo numérique, est pivotée correctement selon l'orientation de l'appareil. Ce n'est pas nécessaire pour l'image « desktop » que j'utilise, mais je l'ai inclus ci-dessus pour les utilisateurs d'appareils photo numériques. Notez toutefois que l'orientation peut malgré tout être erronée, en particulier pour les photos prises exactement vers le bas ou vers le haut, comme lorsqu'on photographie des documents.Le résultat est une vignette de hauteur spécifique mais de largeur variable. J'utilise ce type de vignette pour mes propres pages web, de sorte qu'une série d'images sur une même ligne s'aligne en hauteur, formant un rendu net. La limite de largeur de 250 pixels ci-dessus est importante. Si elle n'était pas définie (par exemple en utilisant « -thumbnail x90 »), IM pourrait rencontrer des problèmes lors de la génération de vignettes d'images très longues et fines, comme celles présentées dans Web Line Images. Le résultat serait dans ce cas un agrandissement très très long de l'image, au lieu d'une petite vignette. Certaines personnes (moi y compris) trouvent que, bien que le redimensionnement d'IM soit l'une des meilleures implémentations (voir IM Resize vs Other Programs), le résultat reste un peu flou. Vous pouvez donc améliorer le résultat ci-dessus en accentuant légèrement l'image (en utilisant « [-unsharp](https://imagemagick.org/command-line-options/#auto-orient) ») après l'opération de redimensionnement « [-thumbnail](https://imagemagick.org/command-line-options/#thumbnail) ». Pour plus d'informations, voir Sharpen Resized Images -- Photoshop Resize Technique. Mais au final, tout cela reste une question de goût personnel.
La version « magick mogrify » est identique à la commande « magick » (sans images d'entrée initiales), mais elle génère automatiquement des vignettes pour chaque image JPEG du répertoire courant. L'argument d'image est entre guillemets afin qu'IM lui-même parcoure le répertoire, et non le shell de la ligne de commande. Cela évite les « erreurs de dépassement de la limite de longueur de ligne » sur les répertoires contenant un très grand nombre d'images.
magick mogrify -format gif -define jpeg:size=500x180 -auto-orient \
-thumbnail 250x90 -unsharp 0x.5 '*.jpg'
| _Notez que « magick mogrify » crée les vignettes sans discernement, en remplaçant toute image existante portant le même nom. Ici, des images GIF. La plus grande prudence est toujours recommandée lors de l'utilisation de cette commande.
Il est toujours recommandé de faire des copies de sauvegarde avant tout traitement.
---|---
| _Plutôt que de spécifier un format différent (en utilisant « [-format](https://imagemagick.org/command-line-options/#format) ») pour empêcher « magick mogrify » d'écraser les images sources originales, vous pouvez utiliser un réglage « [-path](https://imagemagick.org/command-line-options/#path) » pour définir un répertoire de vignettes séparé. Vous pouvez utiliser les deux options de sortie.
---|---
Bien que « magick mogrify » puisse générer les nouvelles images avec un suffixe différent (« [-format](https://imagemagick.org/command-line-options/#format) ») ou dans un répertoire différent (« [-path](https://imagemagick.org/command-line-options/#path) »), ce sont vos seules options avec cette commande. Si vous souhaitez également changer le nom de l'image, par exemple en ajoutant « _tn » ou « _sm » pour désigner les versions vignette ou petite de l'image, je vous recommande de créer un script shell qui fait le travail à votre place, en les traitant une par une avec « magick ». J'ai écrit un tel script pour le faire, tout en générant simultanément des index HTML.
Redimensionner la vignette pour l'ajuster
Une autre forme de génération automatique de vignettes consiste à réduire l'image pour qu'elle tienne dans une boîte de taille fixe, disons « 100x100 », tout en conservant le rapport d'aspect de l'image. C'est justement le sens par défaut d'un réglage de géométrie de redimensionnement. Cependant, je préfère ne pas agrandir les images qui tiennent déjà dans une telle boîte. Pour cela, il faut ajouter un « > » à la chaîne de géométrie. |
magick -define jpeg:size=200x200 hatching_orig.jpg \
-thumbnail '100x100>' rectangle.gif
![]()
Comme précédemment, le rapport d'aspect de l'image est préservé ; il est donc peu probable que la vignette soit exactement un carré de 100 pixels. Toutefois, au moins l'une des dimensions de l'image sera de 100 pixels.
Compléter la vignette par des bordures
La demande la plus courante ensuite est de générer des vignettes qui remplissent l'image avec des bordures d'une couleur spécifique (généralement « black » ou « transparent », mais pour ces exemples j'utiliserai « skyblue ») afin que la vignette ait exactement la taille voulue. Par exemple : une image de 400x300 pixels réduite pour tenir dans une boîte de 100x100 pixels aura normalement (avec ce qui précède) une taille de 100x75 pixels. Nous voulons ajouter des bordures de remplissage en haut et en bas de l'image (et sur les côtés par précaution) pour que la vignette finale fasse toujours exactement 100x100 pixels. Il existe plusieurs manières de le faire, et depuis IM v6.3.2 la meilleure façon consiste à utiliser l'opérateur Extent. |
magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
-background skyblue -gravity center -extent 100x100 pad_extent.gif
![]()
Depuis IM version 6.2.5, vous pouvez aussi utiliser un Viewport Crop et aplatir le résultat sur une couleur de fond. |
magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
-gravity center -crop 120x120+0+0\! \
-background skyblue -flatten pad_view.gif
![]()
La différence essentielle entre l'utilisation d'Extent et d'un Viewport Crop tient à ce que vous souhaitez : un canevas virtuel minimal, ou bien toute la zone « remplie ». Une autre méthode pour compléter une image consiste à superposer la vignette sur une image de fond (image réelle, couleur unie ou canevas en mosaïque) de la bonne taille, en l'occurrence l'image intégrée « granite: » de 128x128. |
magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
granite: +swap -gravity center -composite pad_compose.gif
![]()
Cette méthode est probablement la meilleure à utiliser avec les anciennes versions d'IM (comme IM v5), bien que l'opération « [-composite](https://imagemagick.org/command-line-options/#composite) » doive alors être effectuée par la commande séparée « [composite](basics.html#composite) », plutôt que par la méthode en une seule commande ci-dessus. D'un point de vue traitement d'image, toutes les méthodes ci-dessus font cependant en réalité la même chose.
Découper la vignette pour l'ajuster
Une alternative, au lieu de compléter l'image pour l'ajuster à la taille de vignette voulue, consiste à couper les parties de l'image qui ne tiennent pas dans la taille finale. Bien sûr, cela signifie que vous perdez réellement certaines parties de l'image originale, en particulier ses bords, mais le résultat est une vignette agrandie de la partie centrale de l'image. C'est généralement (mais pas toujours) le sujet principal de l'image, ce qui en fait une méthode pratique de création de vignettes. Depuis IM v6.3.8-3, l'indicateur spécial de redimensionnement « ^ » a été ajouté pour faciliter cela. Il suffit de redimensionner avec cet indicateur, puis de rogner les parties de l'image qui débordent de la taille souhaitée. |
magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail 100x100^ \
-gravity center -extent 100x100 cut_to_fit.gif
![]()
Comme vous pouvez le constater, la vignette de l'image est bien plus grande et détaillée, mais au prix de la coupe des côtés de l'image originale. Pour plus d'informations sur cette option, voir Resize to Fill Given Area. | Avant IM v6.3.8-3, lorsque cet indicateur spécial fut ajouté, il aurait fallu recourir à des astuces très complexes pour obtenir le même résultat. Voir Resizing to Fill a Given Space pour les détails.
---|---
Taille de vignette ajustée par surface
Les deux dernières méthodes rendent souvent l'image très petite avec beaucoup de remplissage supplémentaire, ou bien coupent une grande partie de l'image afin de remplir complètement l'espace. Cependant, en utilisant un indicateur de redimensionnement différent, il est possible d'obtenir une vignette située entre ces deux extrêmes. Par exemple, une vignette de 100x100 pixels comporte 10 000 pixels. Si l'on demande alors au redimensionnement d'ajuster notre image à un nombre de pixels voisin de celui-là (en utilisant l'indicateur « @ » du redimensionnement), vous obtiendrez une image qui nécessitera à la fois un peu de remplissage et un peu de découpe. Cela maximise la taille de la vignette obtenue, sans trop couper. Par exemple... |
magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail 10000@ \
-gravity center -background skyblue -extent 100x100 area_fit.gif
![]()
Comme vous pouvez le constater, la vignette comporte un peu de remplissage et l'image un peu de rognage, mais le résultat est probablement à peu près le meilleur ajustement de l'image à un espace de vignette donné.
Récapitulatif de l'ajustement à un espace donné
En résumé, voici les résultats des trois méthodes permettant de créer une vignette d'une image dans une zone de taille spécifique. Les trois méthodes utilisent exactement le même code, avec seulement une légère variation de l'argument/indicateur de redimensionnement utilisé. ![]()
Ajustement avec remplissage
redimensionnement, sans indicateur | ![]()
Ajustement par surface
redimensionnement, indicateur '@' | ![]()
Ajustement par découpe
redimensionnement, indicateur '^'
---|---|---
Mise au carré par remplissage et par rognage
Les méthodes de remplissage et de rognage ci-dessus supposent que vous connaissez la taille finale de la zone dans laquelle vous voulez faire tenir l'image. Mais ce n'est pas toujours le cas. Parfois, vous voulez simplement « mettre une image au carré », soit en la « complétant » par du remplissage (carré externe), soit en « rasant » les bords (carré interne). À partir du fil des forums de discussion d'IM sur Squaring Images, plusieurs méthodes ont été développées. La mise au carré externe peut se faire à l'aide de Mosaic pour créer un canevas de fond plus grand en utilisant une copie pivotée de l'image. |
magick thumbnail.gif \
\( +clone -rotate 90 +clone -mosaic +level-colors white \) \
+swap -gravity center -composite square_padded.gif
![]()
La mise au carré interne, en revanche, est un peu plus difficile et demande davantage de travail. Celle-ci recourt à un traitement de masque assez poussé pour générer un canevas plus petit. |
magick thumbnail.gif \
\( +clone +level-colors white \
\( +clone -rotate 90 +level-colors black \) \
-composite -bordercolor white -border 1 -trim +repage \) \
+swap -compose Src -gravity center -composite \
square_cropped.gif
![]()
Une autre approche consiste à utiliser une distorsion sans effet (no-op) recourant à un viewport de distorsion pour rogner/compléter l'image (voir Distort Viewport Centered Square Crop). Essentiellement, elle utilise des « échappements en pourcentage » pour effectuer les calculs nécessaires à une opération de type Extent. Carré externe (remplissage)... |
magick thumbnail.gif -virtual-pixel white -set option:distort:viewport \
"%[fx:max(w,h)]x%[fx:max(w,h)]-%[fx:max((h-w)/2,0)]-%[fx:max((w-h)/2,0)]" \
-filter point -distort SRT 0 +repage square_external.gif
![]()
Le réglage Virtual Pixel sert à spécifier la couleur de remplissage. Carré interne (rogné)... |
magick thumbnail.gif -set option:distort:viewport \
"%[fx:min(w,h)]x%[fx:min(w,h)]+%[fx:max((w-h)/2,0)]+%[fx:max((h-w)/2,0)]" \
-filter point -distort SRT 0 +repage square_internal.gif
![]()
Avec l'aimable autorisation de la page Tidbits de Fred Weinhaus. Ceci est une version plus simple, mais elle fait perdre toutes les métadonnées que l'image peut posséder (comme les chaînes de commentaire ou les profils). |
magick thumbnail.gif -set option:size '%[fx:min(w,h)]x%[fx:min(w,h)]' \
xc:none +swap -gravity center -composite square_internal_2.gif
![]()
| IMv7 vous permettra d'effectuer les calculs ci-dessus directement dans l'argument d'un crop ou d'un extent, ce qui évitera la perte des métadonnées de l'image.
---|---
Rognage manuel
La façon habituelle dont je génère les vignettes destinées à mes pages web est un mélange de scripts automatiques et manuels. La configuration finale de mes images est la suivante..
- J'utilise un PNG ou un TIFF pour le scan original, TRÈS grand, de la photo. OU l'image JPEG originale téléchargée depuis un appareil photo numérique. Fondamentalement, pour l'image source originale non modifiée, à des fins d'archivage. J'aime aussi désormais inclure la chaîne «
_orig» dans le nom de fichier de cette image. - Un format JPEG plus petit pour une image consultable sur le web lorsque la vignette est cliquée ou sélectionnée. Cette image est redimensionnée pour tenir dans une boîte de 800x800 pixels, une taille adaptée à la consultation par la plupart des internautes. J'ajoute généralement un «
_md» pour une image de taille moyenne dans le nom de fichier. - Et enfin une vignette GIF redimensionnée à une hauteur fixe de 90 pixels et de largeur variable. Cela permet à des rangées de vignettes centrées sur les pages web d'avoir un aspect raisonnablement net et ordonné, tout en remplissant automatiquement la largeur de la fenêtre du navigateur, quelle que soit la taille de navigateur utilisée. Là encore, j'inclus généralement désormais un «
_tn» dans le nom de fichier de l'image, pour indiquer qu'il s'agit d'une vignette.
Je génère d'abord les images JPEG consultables sur le web (taille moyenne) avec « magick mogrify » à partir de l'image scannée originale. Cela réduit le temps de téléchargement et la taille d'affichage de l'image à quelque chose de pratique pour l'internaute typique (qui pourrait être connecté via un modem). À partir de ces images, je génère un premier jeu de vignettes, là encore avec « magick mogrify ». Cependant, je constate souvent avec les photos typiques que le sujet des vignettes devient trop petit pour constituer une vignette efficace une fois affichée. Pour corriger cela, j'examine les vignettes générées automatiquement, et dans environ la moitié des cas je crée manuellement ma propre vignette « zoomée sur le sujet ». Je lis l'image JPEG et je la rogne autour du sujet principal de l'image, « zoomant » ainsi efficacement sur le sujet de la photo et supprimant l'essentiel du contexte d'arrière-plan de l'image. Elle est ensuite lissée et transformée en vignette, soit avec un « magick -thumbnail », soit plus souvent dans le même logiciel graphique avec lequel je visualise et rogne les images (généralement « XV », voir ci-dessous). Ainsi, au lieu d'une vignette où les personnes sur la photo sont à peine visibles (à gauche), j'ai rogné manuellement autour du sujet, mettant en valeur le point principal de la photo (à droite), avant de créer la vignette. Cela permet aux utilisateurs de voir plus clairement le contenu de l'image et donc de mieux décider s'ils veulent réellement télécharger et regarder la version JPEG plus grande de l'image. Queensland KiteFlyers, Ron and Val Field
![[IM Output]](../static/img/img_photos/kiteflyers_auto.gif)
Vignette
générée
automatiquement | | ![[IM Output]](../static/img/img_photos/kiteflyers_man.gif)
Vignette rognée
manuellement
et redimensionnée
(Cliquez sur l'une ou l'autre image pour obtenir la photo scannée originale)
Ceci est bien sûr plus exigeant manuellement, mais ne doit être fait qu'une seule fois par image, et seulement sur les images comportant beaucoup d'espace, comme dans l'exemple ci-dessus. De plus, je ne le fais que pour les images que je mets en ligne. Bien entendu, comme « magick mogrify » écrase toute vignette existante, éventuellement générée à la main, vous ne pouvez plus l'utiliser après avoir effectué une génération manuelle de vignettes. La commande « magick mogrify » est utile, mais aussi très dangereuse car elle écrase de nombreuses images. Réfléchissez toujours avant d'exécuter « magick mogrify » globalement sur toutes vos images.
Pages HTML de vignettes
Une fois toutes les vignettes triées dans le répertoire, j'utilise un script perl spécial appelé « thumblinks » que j'ai écrit, qui recherche les images (photos JPEG et vignettes GIF) et génère des liens HTML, et même des pages photo HTML complètes. Le script lit et inclut la taille de la vignette GIF dans le HTML, et entoure les liens vers les vignettes de fichiers d'en-tête et de pied de page préparés à l'avance. Le script supprime également de la liste qu'il génère tout lien de vignette pour lequel il trouve un lien déjà existant dans le fichier d'en-tête ou de pied de page. Cela peut sembler complexe, mais cela rend la génération de mes pages HTML très rapide et flexible, et garantit que TOUTES les images transformées en vignettes dans un répertoire ont bien été ajoutées à la page d'index de ce répertoire, tout en me laissant commenter des images précises dans l'en-tête de l'index. Cela rend aussi la page indépendante de la taille de la fenêtre de l'utilisateur, s'ajustant automatiquement en conséquence. Pour un exemple simple de la sortie de mon script « thumblinks », voir Tomb of Castle Artworks. Pour un exemple rapide et un point de départ pour générer de tels liens, regardez les exemples d'utilisation de la commande identify.
Vignette de lien de page web FavIcon
L'icône « favion.ico » que les navigateurs web recherchent souvent sur la page web de premier niveau d'un site, pour l'ensemble de ce site. Cette image est un format d'image multi-résolution particulier et peut être créée comme suit.
magick image.png -alpha off -resize 256x256 \
-define icon:auto-resize="256,128,96,64,48,32,16" \
favicon.ico
Le fichier « image.png » peut être ce que vous voulez, mais il devrait être carré. S'il ne l'est pas, cela devrait aussi constituer la première étape ci-dessus. Vous pouvez également inclure des résolutions plus grandes, comme 128 ou 256 pixels, mais peu de navigateurs les utiliseraient. Les tailles de 16 et 32 pixels sont bien plus couramment utilisées dans de tels fichiers ICO, il peut donc être utile d'insister particulièrement sur celles-ci. Rappelez-vous aussi que de nombreux navigateurs réduisent le nombre de couleurs des images afin de réduire l'espace occupé pour les stocker dans le fichier de favoris de l'utilisateur. Cela nous amène à un autre point. Comme seules les plus petites images sont généralement utilisées, avec en plus une réduction du nombre de couleurs, il est recommandé de garder les images aussi petites et aussi bien définies que possible. Voici un exemple de redimensionnement manuel d'images pour un format de fichier ICO.
magick image.png -background white \
\( -clone 0 -resize 16x16 -extent 16x16 \) \
\( -clone 0 -resize 32x32 -extent 32x32 \) \
\( -clone 0 -resize 48x48 -extent 48x48 \) \
\( -clone 0 -resize 64x64 -extent 64x64 \) \
-delete 0 -alpha off -colors 256 favicon.ico
Comme mentionné, seule l'image « favion.ico » trouvée dans le répertoire de premier niveau d'un site web est généralement utilisée ; vous pouvez toutefois aussi spécifier l'emplacement de la vignette de lien en ajoutant la balise HTML suivante aux en-têtes de vos pages...
<LINK REL="icon" HREF="/path/to/favicon.ico" type="image/x-icon">
<LINK REL="shortcut" HREF="/path/to/favicon.ico" type="image/x-icon">
Le « /path/to/favicon.ico » peut être une URL/URI absolue ou partielle vers l'emplacement d'où le navigateur doit récupérer la vignette des pages web. L'usage de « REL="shortcut" » est spécifique à Internet Explorer (avant IE9) et ne fait pas officiellement partie de la spécification HTML. Il est possible de fusionner les deux balises HTML avec « REL="shortcut icon" », mais en gardant les balises séparées vous pouvez utiliser un format de fichier image non-ICO (comme SVG) pour les navigateurs autres qu'IE, tels que firefox. Rappelez-vous que si cet élément html n'est pas utilisé, c'est le fichier « favicon.ico » trouvé dans le répertoire de premier niveau du site web qui est utilisé à la place (s'il est présent). Le format d'image ICO est universellement compris par tous les navigateurs modernes. Tous, sauf Internet Explorer, peuvent aussi utiliser les formats de fichier image JPEG, PNG et GIF pour la vignette de lien. Quelques-uns, comme FireFox, peuvent même utiliser des GIF animés ou des formats de fichier image SVG. Cependant, comme ces derniers formats ne peuvent généralement pas contenir plusieurs images à différentes résolutions et nombres de couleurs, il vaut sans doute mieux s'en tenir au format de fichier ICO pour l'image « favion.ico ».
Autres techniques non-IM
Le programme « XV » que j'utilise pour le traitement manuel des images génère lui aussi des vignettes, dans un sous-répertoire appelé « .xvpics ». Le format des images de ce répertoire est le format de vignette particulier propre au programme (le suffixe de nom de fichier dans ce répertoire étant ignoré). Ces vignettes sont limitées à 80x60 pixels et sont donc un peu « petites » (à moins de bidouiller « xv » pour utiliser des vignettes plus grandes -- voir le lien ci-dessous). IM comprend le format de vignette de « xv » (qui est basé sur le format d'image « NetPBM »), vous pouvez donc générer rapidement toutes les vignettes avec XV, puis convertir avec magick les vignettes XV des images JPEG en images GIF pour un traitement ultérieur...
xv -vsmap & # génère les vignettes avec le bouton « Update »
rm .xvpics/*.gif # supprime les vignettes XV des vignettes « gif » existantes
magick mogrify -format gif .xvpics/*.jpg
mv .xvpics/*.gif . # déplace les nouvelles vignettes « gif » vers le répertoire d'origine
Si vous en avez assez de la petite taille des vignettes XV, en particulier avec les écrans modernes plus grands, vous pouvez bidouiller le code de XV. Voir mes notes de modification de XV, qui vous permettent de faire utiliser à XV une taille de vignette plus grande. J'utilise moi-même des vignettes de 120x90 pixels.
Traitements supplémentaires -- Ajout de fioritures
Ce qui précède n'est que le commencement de ce que vous pouvez faire pour rendre vos vignettes plus intéressantes. Au-delà de la vignette de base, vous pouvez ajouter des bordures, des rotations, voire une sélection aléatoire de styles, pour rendre votre galerie de vignettes d'autant plus intéressante. Ce genre d'ajouts aux vignettes, je les appelle des « fioritures » (fluff), à l'image des peluches qui recouvrent vos vêtements après le lavage. Autrement dit, cela ajoute des extras superflus à la vignette, mais qui peuvent rendre les pages web et les images d'index d'autant plus intéressantes. Sachez que bon nombre des méthodes et traitements qui suivent sont très complexes et peuvent exiger une connaissance plus approfondie des diverses options de traitement d'image d'ImageMagick.
Ajout d'étiquettes aux images
Lors de la création de vos vignettes, vous pouvez aussi ajouter des étiquettes au-dessus, en dessous, ou même par-dessus votre vignette. Ce type de traitement d'image est toutefois traité plus en détail dans Annoter les images avec des étiquettes. Souvenez-vous simplement d'utiliser « [-thumbnail](https://imagemagick.org/command-line-options/#thumbnail) » ou « [-strip](https://imagemagick.org/command-line-options/#strip) » plutôt qu'un « [-resize](https://imagemagick.org/command-line-options/#resize) » dans ces exemples. Par exemple... |
magick thumbnail.gif \
-background Lavender -fill navy -font Candice -pointsize 24 \
label:Hatching -gravity South -append \
labeled.gif
![]()
En recourant aux polices composées, vous pouvez superposer des étiquettes très élaborées sur l'image elle-même. Ici, par exemple, j'ai utilisé une technique de police à contour doux plus dense pour annoter la vignette, en assombrissant la zone autour du texte afin qu'il reste toujours lisible. |
magick -define jpeg:size=400x400 hatching_orig.jpg -resize '120x200>' \
\( +clone -sample 1x1\! -alpha transparent -sample 1000x200\! \
-font SheerBeauty -pointsize 72 -gravity Center \
-strokewidth 8 -stroke black -fill black -annotate 0,0 '%c' \
-channel RGBA -blur 0x8 \
-strokewidth 1 -stroke white -fill white -annotate 0,0 '%c' \
-fuzz 1% -trim +repage -resize 115x \
\) -gravity North -composite -strip annotated.gif
![]()
Remarquez que je n'utilise pas l'image « thumbnail.gif » pré-générée, ni l'opérateur de redimensionnement Thumbnail pour retirer les profils et commentaires de l'image. J'ai plutôt utilisé « [+clone](https://imagemagick.org/command-line-options/#clone) », « [+sample](https://imagemagick.org/command-line-options/#sample) » et « [-alpha](https://imagemagick.org/command-line-options/#alpha) » pour générer un canevas de travail transparent plus grand, qui contient aussi une copie des métadonnées de l'image originale. Cela me permet d'utiliser la chaîne de « commentaire » de l'image avec l'opérateur d'annotation « [-annotate](https://imagemagick.org/command-line-options/#annotate) » pour fournir le texte à superposer sur l'image. Ce n'est qu'à la fin, après avoir composé la superposition de texte, que je nettoie et « [-strip](https://imagemagick.org/command-line-options/#strip) » ces informations.
Bouton en relief
L'opérateur « [-raise](https://imagemagick.org/command-line-options/#raise) » a été essentiellement créé dans le seul but de mettre en évidence les bords d'images rectangulaires pour former un bouton en relief. C'est une transformation de vignette simple, rapide et efficace. |
magick thumbnail.gif -raise 8 raised_button.gif
![]()
Le même opérateur possède une forme « plus » qui peut servir à créer un effet de mise en évidence en creux. |
magick thumbnail.gif +raise 8 sunken_button.gif
Bouton bulle
Avec quelques astuces, l'opérateur « [-raise](https://imagemagick.org/command-line-options/#raise) » peut servir à produire un bouton en relief lisse, « en forme de bulle ».
magick thumbnail.gif -fill gray50 -colorize 100% \
-raise 8 -normalize -blur 0x8 bubble_overlay.png
magick thumbnail.gif bubble_overlay.png \
-compose hardlight -composite bubble_button.png
Voir les méthodes de composition par la lumière pour plus d'informations sur ce type de technique. Pour d'autres effets de ce genre, voir Auto-encadrement (interne) ci-dessous, et pour passer au niveau supérieur, voir Masque d'effet d'éclairage ci-dessous.
Ajout de bordures
Le modeste et simple opérateur « [-border](https://imagemagick.org/command-line-options/#border) » peut servir à générer un encadrement complexe autour d'une image. |
magick thumbnail.gif \
-bordercolor black -border 3 -bordercolor white -border 2 \
\( -background black -fill white -pointsize 24 \
label:Hatching -trim +repage \
-bordercolor black -border 10 \
\) -gravity South -append \
-bordercolor black -border 10 -gravity South -chop 0x10 \
border_framework.gif
Cadre simple
De façon similaire, l'opérateur « [-frame](https://imagemagick.org/command-line-options/#frame) » facilite l'ajout d'un cadre autour de l'image |
magick thumbnail.gif -mattecolor peru -frame 9x9+3+3 framed.gif
![]()
Cet opérateur dispose aussi de bien d'autres options pour créer une douzaine de styles de cadres différents. Vous pouvez voir des exemples de ces possibilités dans Frame, ajouter une bordure de type 3D.
Encadrement avec Montage
La commande montage offre un moyen bien plus simple de faire tout ce qui précède, et bien davantage. Non seulement elle peut générer des vignettes (ou des pages entières de vignettes), mais elle peut aussi les étiqueter pour y inclure des informations comme le nom de fichier, la taille sur le disque et les dimensions, ou une chaîne indiquée par l'utilisateur. Voici un usage simple de « magick montage » pour générer une vignette encadrée. |
magick montage -define jpeg:size=240x200 -label '%c' hatching_orig.jpg \
-frame 6 -geometry '120x100>' montage_simple.gif
L'étiquette provient du commentaire du fichier image JPEG, ajouté il y a longtemps à l'image à l'aide de la commande non-IM « wrjpgcom ». Voir Traitement JPEG non-IM pour plus de détails. ![]()
Même avec le seul « magick montage », vous pouvez rendre votre génération de vignettes vraiment sophistiquée. |
magick montage -define jpeg:size=400x180 -label '%c' hatching_orig.jpg \
-thumbnail '200x90>' -geometry '130x100>' -mattecolor peru \
-frame 6 -bordercolor skyblue -font LokiCola -pointsize 18 \
montage_fancy.gif
![]()
Voir « Montage, tableaux d'images » pour plus de détails. L'exemple des cartes d'images de vignettes HTML avec Montage pourrait particulièrement vous intéresser. Il crée une page d'index HTML de vignettes dans laquelle un clic sur une vignette fait apparaître l'image originale, dans le même répertoire.
Bords doux et flous
L'opérateur Vignette offre un moyen simple d'ajouter un bord flou autour d'une image. |
magick thumbnail.gif -alpha set \
-background none -vignette 0x4 vignette.png
![]()
Bien sûr, comme cette vignette utilise une couleur semi-transparente, elle doit être enregistrée au format PNG. La méthode Morphology Distance offre un véritable « adoucissement » (feathering) transparent des bords d'une image. |
magick thumbnail.gif -alpha set -virtual-pixel transparent -channel A \
-morphology Distance Euclidean:1,10\! +channel feathered.png
![]()
La distance maximale de la zone transparente est contrôlée par le drapeau spécial de mise à l'échelle de distance « 10\! ». Il n'a été ajouté que dans IM v6.6.1-6. Cela présente l'avantage supplémentaire de fonctionner aussi pour les images de forme quelconque, bien qu'une initialisation plus complexe soit nécessaire pour préserver correctement les pixels anti-aliasés dans la formule de distance. Voir Adoucir des formes à l'aide de Distance pour plus de détails. L'adoucissement ici est un dégradé purement linéaire, et peut être encore ajusté à l'aide de l'opérateur de contraste non-linéaire sigmoïdal pour lui donner un aspect plus lisse et plus progressif de diverses manières. Vous pouvez aussi adoucir des images à l'aide du flou, en utilisant la même méthode consistant à ajouter des pixels virtuels transparents avant de ne flouter que le canal alpha. Cela génère un adoucissement plus doux de l'image, tout en arrondissant sensiblement les coins de l'image. |
magick thumbnail.gif -alpha set -virtual-pixel transparent \
-channel A -blur 0x8 -level 50%,100% +channel soft_edge.png
![]()
L'opération « [-level](https://imagemagick.org/command-line-options/#level) » supplémentaire (n'ajustant que le canal de transparence) garantit que le bord devient entièrement transparent, plutôt que seulement à moitié transparent. Toutefois, il chute brusquement vers zéro au niveau du bord réel, en raison de la courbe de type sigmoïdal que le flou génère. Il a aussi un effet additif dans les coins, ce qui les arrondit ; tandis qu'avec une image de forme quelconque présentant une concavité prononcée, il peut faire devenir semi-transparents des pixels entièrement transparents. Ainsi, pour les formes, il peut être nécessaire de masquer le résultat contre l'image originale (à l'aide de la composition Dst-In). Pour les vignettes rectangulaires, en revanche, le résultat est satisfaisant. Vous pouvez voir un autre exemple d'utilisation de ce type d'adoucissement dans Vignettes en couches. Au lieu d'effectuer un ajustement de niveau sur l'adoucissement flouté, vous pouvez appliquer un seuil au canal alpha flouté à « 50% », de façon à ajouter des pseudo-coins arrondis à la vignette ci-dessus. |
magick thumbnail.gif -alpha set -virtual-pixel transparent -channel A \
-blur 0x8 -threshold 50% +channel rounded_corner_blur.gif
![]()
Bien que très simple, le résultat n'est pas une manière vraiment satisfaisante d'arrondir les coins de l'image. D'abord, les coins ne sont pas réellement circulaires, mais suivent une courbe « hyperbolique ». Ensuite, le résultat n'est pas une courbe anti-aliasée lisse, mais présente des « crénelures » causées par l'effet d'aliasing de l'opération de seuil. Cette image peut toutefois être enregistrée au format de fichier GIF. Voir Transparence booléenne GIF pour plus de détails. Notez aussi que l'opération « [-blur](https://imagemagick.org/command-line-options/#blur) » peut devenir très lente lorsque vous travaillez avec un grand argument pour générer un coin arrondi plus important. C'est pourquoi cette méthode d'arrondissement des coins à grande échelle n'est absolument pas recommandée. Pour un effet de bord flou plus inhabituel, vous pouvez utiliser un flou radial uniquement sur le canal alpha. |
magick thumbnail.gif -alpha set -virtual-pixel transparent \
-channel A -radial-blur 0x45 +channel radial_blur_edge.png
![]()
Cela fonctionne mieux pour les images parfaitement carrées. À mesure que la quantité de flou angulaire augmente, vous finirez par générer un bord circulaire semblable à un Vignette. |
magick thumbnail.gif -alpha set -virtual-pixel transparent \
-channel A -radial-blur 0x100 +channel radial_blur_vignette.png
![]()
Les deux artefacts en forme de marche que l'on peut observer sont dus aux deux dimensions de taille de l'image. Aucune « marche » ne sera visible pour une image carrée. Ajouter un peu de flou normal supplémentaire au dernier exemple peut aussi améliorer le problème des marches.
Coins arrondis et de forme quelconque
Bien que l'application d'un seuil à un bord doux et flou (voir ci-dessus) génère un coin arrondi adapté à la transparence booléenne du GIF, elle ne génère pas de coin « anti-aliasé » lisse. La manière appropriée de générer une image aux coins arrondis, ou de toute autre forme, consiste à découper réellement chaque coin à l'aide d'un masque de la forme voulue. La méthode suivante, de Leif Åstrand leif@sitelogic.fi, multiplie un masque d'image complet pour générer le résultat approprié. |
magick thumbnail.gif \
\( +clone -alpha extract \
-draw 'fill black polygon 0,0 0,15 15,0 fill white circle 15,15 15,0' \
\( +clone -flip \) -compose Multiply -composite \
\( +clone -flop \) -compose Multiply -composite \
\) -alpha off -compose CopyOpacity -composite rounded_corners.png
![]()
Fondamentalement, on extrait de l'image originale le masque de transparence blanc, avec un seul coin noir arrondi. Celui-ci est ensuite retourné verticalement (flip) et horizontalement (flop) pour produire un masque dont les quatre coins sont arrondis. Et enfin ce masque est appliqué à l'image originale. Pour des images beaucoup plus grandes, il vaut peut-être mieux appliquer un masque beaucoup plus petit à chaque coin individuel afin de réduire la quantité totale de traitement nécessaire. Cela représente davantage d'étapes de traitement individuelles, mais dans l'ensemble un traitement moindre des pixels réels. Par exemple, voici la même chose, mais en découpant une simple forme triangulaire dessinée dans chaque coin. Cela fonctionnera avec des images bien plus grandes. |
magick thumbnail.gif -alpha set -compose DstOut \
\( -size 20x15 xc:none -draw "polygon 0,0 0,14 19,0" \
-write mpr:triangle +delete \) \
\( mpr:triangle \) -gravity northwest -composite \
\( mpr:triangle -flip \) -gravity southwest -composite \
\( mpr:triangle -flop \) -gravity northeast -composite \
\( mpr:triangle -rotate 180 \) -gravity southeast -composite \
corner_cutoff.png
![]()
Si vous ne voulez pas de transparence, mais une autre couleur, vous pouvez tout de même procéder comme ci-dessus, puis supprimer la transparence. Cela peut être important pour les images JPEG. Toutefois, une solution encore plus simple (en termes de complexité et d'utilisation mémoire) a été trouvée dans une discussion du forum IM. Elle superpose des coins colorés (« Red » dans ce cas) plutôt que de les rendre transparents. |
magick thumbnail.gif \
\( +clone -crop 16x16+0+0 -fill white -colorize 100% \
-draw 'fill black circle 15,15 15,0' \
-background Red -alpha shape \
\( +clone -flip \) \( +clone -flop \) \( +clone -flip \) \
\) -flatten rounded_corners_red.png
![]()
Malheureusement, cette méthode ne peut pas servir simplement à « effacer » les coins de l'image en transparence, en raison d'une interaction avec un « canevas d'arrière-plan » de l'opération Flatten ; un futur opérateur de mise en couches pourrait résoudre cela. | Le dernier exemple échouera pour les versions d'IM antérieures à v6.6.6-5, car les opérateurs « [-flip](https://imagemagick.org/command-line-options/#flip) » et « [-flop](https://imagemagick.org/command-line-options/#flop) » ne gèrent pas correctement le décalage du canevas virtuel.
---|---
En utilisant une astuce de cycle polaire, nous pouvons générer un masque circulaire parfaitement anti-aliasé pour une vignette de n'importe quelle taille. Bien sûr, nous n'utiliserons l'image déformée que comme masque de l'image originale, afin d'obtenir le meilleur résultat. |
magick thumbnail.gif -alpha set \
\( +clone -distort DePolar 0 \
-virtual-pixel HorizontalTile -background None -distort Polar 0 \) \
-compose Dst_In -composite -trim +repage circle_masked.png
![]()
Nous poursuivrons ce style de traitement d'image dans Bordure à coins arrondis ci-dessous. Là, nous ne découperons pas seulement les coins, mais superposerons aussi des images d'encadrement appropriées.
Bord de papier déchiré
Leif Åstrand leif@sitelogic.fi a contribué le code IM suivant pour générer un bord qui semble avoir été déchiré d'un papier fibreux (comme du papier journal)... |
magick thumbnail.gif \
\( +clone -alpha extract -virtual-pixel black \
-spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 \) \
-alpha off -compose Copy_Opacity -composite torn_paper.png
![]()
Une amélioration possible serait de donner l'impression que vous l'avez arraché depuis le coin d'un journal. |
magick thumbnail.gif -bordercolor linen -border 8x8 \
-background Linen -gravity SouthEast -splice 10x10+0+0 \
\( +clone -alpha extract -virtual-pixel black \
-spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 \) \
-alpha off -compose Copy_Opacity -composite \
-gravity SouthEast -chop 10x10 torn_paper_corner.png
![]()
On pourrait améliorer cela en ajoutant des bords de couleur « papier » et un masque de forme courbe, afin que l'image paraisse avoir été déchirée grossièrement à la main. Ajouter une « ombre douce » (voir plus loin) permettra aussi de « décoller » l'image résultante de l'arrière-plan, lui donnant l'apparence d'un morceau séparé. Comme toujours, suggestions et contributions sont les bienvenues.
Ajout d'une ombre
L'opérateur « [-shadow](https://imagemagick.org/command-line-options/#shadow) » facilite la génération d'ombres pour une image de n'importe quelle forme. Par exemple, ici j'ajoute une ombre colorée semi-transparente à la vignette. |
magick thumbnail.gif -alpha set \
\( +clone -background navy -shadow 60x0+4+4 \) +swap \
-background none -mosaic shadow_hard.gif
![]()
Mais vous pouvez tout aussi facilement créer des ombres douces et floues. |
magick -page +4+4 thumbnail.gif -alpha set \
\( +clone -background navy -shadow 60x4+4+4 \) +swap \
-background none -mosaic shadow_soft.png
![]()
Notez qu'ici encore j'ai utilisé une image au format PNG pour la sortie des vignettes. C'est parce que l'image ombrée contiendra beaucoup de pixels semi-transparents, que le GIF ne peut pas gérer. (Oui, je me répète, mais c'est important). Si vous prévoyez d'utiliser le format GIF ou JPG, vous devrez utiliser une couleur « [-background](https://imagemagick.org/command-line-options/#background) » plus appropriée pour la page web ou le canevas plus grand sur lequel vous prévoyez d'afficher votre vignette, car ces formats ne gèrent pas les couleurs semi-transparentes. Attention : si ce qui précède fonctionne pour des vignettes individuelles, cela échouera généralement lorsque vous voudrez superposer plusieurs vignettes les unes sur les autres. La raison est que les ombres ne s'accumulent pas ensemble de la même manière que les images normales. Pour voir comment gérer les ombres de plusieurs images en couches, voir Couches d'ombres.
Ajout d'une certaine épaisseur
Ajouter de l'épaisseur à une image ou à une forme ressemble un peu à l'ajout d'une ombre dure (voir ci-dessus), mais ce n'est pas tout à fait la même chose et cela demande un travail supplémentaire pour bien faire. C'est en réalité très délicat, car nous créons un masque coloré de l'image, qui est ensuite répliqué plusieurs fois et disposé en couches sous l'image originale (à l'aide de la composition « DstOver ») avec des décalages croissants, pour donner de l'épaisseur à l'image. |
magick thumbnail.gif -alpha set \
\( +clone -fill DarkSlateGrey -colorize 100% -repage +0+1 \) \
\( +clone -repage +1+2 \) \
\( +clone -repage +1+3 \) \
\( +clone -repage +2+4 \) \
\( +clone -repage +2+5 \) \
\( +clone -repage +3+6 \) \
-background none -compose DstOver -mosaic thickness.gif
![]()
Vous saisissez l'idée. Chaque ligne « \( +clone ... \) » ajoute un pixel supplémentaire à l'image dans une direction sud à sud-est. De plus, comme aucun pixel semi-transparent n'est impliqué (du moins pour une image rectangulaire), vous pouvez utiliser le format d'image GIF pour le résultat. Le principal problème de cette technique est qu'il est difficile de spécifier une épaisseur en tant qu'argument variable ou selon différents angles, à moins d'écrire un script spécifique pour ajouter l'épaisseur. De plus, le bord des parties inclinées de l'épaisseur n'est pas anti-aliasé, il y a donc une grande marge d'amélioration.
Vignettes de type Polaroid
Vous pouvez faire en sorte que votre vignette ressemble à une photo Polaroid, lui donner une ombre et même la faire pivoter un peu, afin qu'elle paraisse simplement posée sur une table. |
magick thumbnail.gif \
-bordercolor white -border 6 \
-bordercolor grey60 -border 1 \
-background none -rotate 6 \
-background black \( +clone -shadow 60x4+4+4 \) +swap \
-background none -flatten \
poloroid.png
![]()
Une version plus complexe de ce qui précède a été ajoutée à IM v6.3.1-6 sous la forme d'un opérateur de transformation « [-polaroid](https://imagemagick.org/command-line-options/#polaroid) ». Par exemple... |
magick thumbnail.gif -bordercolor snow -background black +polaroid \
poloroid_operator.png
![]()
Notez que non seulement l'image possède le cadre Polaroid, mais que la photo a aussi reçu un léger « gondolement » avec des ajustements d'ombre appropriés, donnant plus de profondeur à l'image résultante. La forme plus (+) utilise un angle aléatoire, tandis que la forme moins (-) normale vous permet de fournir l'angle de rotation. Un merci tout particulier à Timothy Hunter pour l'idée à l'origine de cette technique. Vous pouvez même ajouter une « [-caption](https://imagemagick.org/command-line-options/#caption) », définir votre propre couleur d'ombre, indiquer votre propre rotation (ou aucune du tout). |
magick -caption '%c' hatching_orig.jpg -thumbnail '120x120>' \
-font Ravie -gravity center -bordercolor Lavender \
-background navy -polaroid -0 poloroid_caption.png
![]()
Pour plus d'informations sur l'utilisation de cet opérateur, voir Transformation Polaroid complexe. Pour ces exemples cependant, je continuerai d'utiliser une méthode de création faite maison, car j'ai besoin d'un contrôle plus fin des bords et des effets d'ombre pour démontrer un bon « empilement » de photos. Et c'est parti... En faisant plusieurs copies de la photographie (ou en utilisant d'autres images), et en ajoutant des bords Polaroid, vous pouvez ensuite les faire pivoter aléatoirement et les empiler pour produire une jolie pile de photos. |
magick thumbnail.gif \
-bordercolor white -border 6 \
-bordercolor grey60 -border 1 \
-bordercolor none -background none \
\( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
\( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
\( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
\( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
-delete 0 -border 100x80 -gravity center \
-crop 200x160+0+0 +repage -flatten -trim +repage \
-background black \( +clone -shadow 60x4+4+4 \) +swap \
-background none -flatten \
poloroid_stack.png
![]()
| La commande embarquée « magick ... » dans l'exemple ci-dessus génère un nombre à virgule flottante aléatoire compris entre -15 et +15. Pour plus d'informations sur l'utilisation d'IM comme calculatrice mathématique, voir Expressions FX. Une alternative consiste à affecter des nombres aléatoires à des variables shell et à les substituer dans la commande ci-dessus.
---|---
Bien sûr, vous pourriez substituer un ensemble d'images différentes plutôt que de répéter la même image lors de la création de la pile. Ou sélectionner un ensemble d'angles de rotation de sorte qu'ils soient tous raisonnablement différents, ou plus agréables à regarder. Si vous êtes vraiment doué, vous pouvez même décaler les images pivotées (perturber un peu leur position) afin qu'elles ne soient pas toutes empilées parfaitement centrées. Mais vous avez saisi l'idée de base. Si vous tenez vraiment à éviter l'usage du format PNG, en raison de ses problèmes actuels avec certains navigateurs, vous pouvez utiliser le format d'image GIF. Pour cela, vous devez accepter certaines limitations de couleur et connaître la couleur d'arrière-plan exacte sur laquelle l'image sera affichée. La couleur « LightSteelBlue » dans le cas de ces pages. |
magick thumbnail.gif \
-bordercolor white -border 6 \
-bordercolor grey60 -border 1 \
-background none -rotate -9 \
-background black \( +clone -shadow 60x4+4+4 \) +swap \
-background LightSteelBlue -flatten poloroid.gif
![]()
Pour des détails sur cette technique (et bien plus), voir Images GIF sur un arrière-plan de couleur unie. La technique de « Polaroid empilés » ci-dessus est aimablement fournie par Ally de Ally's Trip et Stefan Nagtegaal pour Muziekvereniging Sempre Crescendo, qui utilisent tous deux abondamment des vignettes de type Polaroid sur leurs sites web. Dans le forum des utilisateurs d'IM, l'utilisateur grazzman est allé un peu plus loin en superposant des images sur un canevas en rotation pour créer un étalement de photos. |
magick -size 150x150 xc:none -background none \
-fill white -stroke grey60 \
-draw "rectangle 0,0 130,100" thumbnail.gif \
-geometry +5+5 -composite -rotate -10 \
-draw "rectangle 0,0 130,100" thumbnail.gif \
-geometry +5+5 -composite -rotate -10 \
-draw "rectangle 0,0 130,100" thumbnail.gif \
-geometry +5+5 -composite -rotate +10 \
-trim +repage -background LightSteelBlue -flatten \
poloroid_spread.gif
![]()
Bien sûr, pour un étalement de photos comme celui-ci, vous devez vraiment utiliser un ensemble de photos différentes plutôt que d'utiliser sans cesse la même image comme je l'ai fait ici. Il y a quelques réserves que vous pourriez vouloir prendre en compte avec cette technique.
- L'encadrement a été codé en dur dans ce qui précède, et dépend de la taille de la vignette. Dans une application réelle, l'encadrement pourrait être déplacé vers l'étape de génération des vignettes plutôt que dans l'étalement de photos ci-dessus.
- Comme «
[-rotate](https://imagemagick.org/command-line-options/#rotate)» agrandit aussi la taille du canevas, la position à laquelle les images sont ajoutées change, à moins que vous ne les placiez à l'aide d'un décalage par rapport à la position «[-gravity](https://imagemagick.org/command-line-options/#gravity) center». - Et enfin, faire pivoter constamment le cadre d'arrière-plan n'est pas une bonne idée en termes de qualité. Faire pivoter une image déjà pivotée ajoute davantage de distorsions au niveau des pixels que d'effectuer une seule rotation pour chaque image distincte avant qu'elle ne soit superposée.
Un empilement aléatoire similaire de photos sur une plus grande surface a été développé pour Stas Bekman's Photography, mais avec une technique de bordure différente. Une méthode plus générale pour créer une disposition ordonnée ou programmée de photos et d'images est montrée et décrite dans Exemples de mise en couches d'images, ainsi que dans Chevauchement de photos.
Techniques d'encadrement
Nous allons voir ici quelques techniques d'encadrement avancées qui s'appuient sur une connaissance très poussée du fonctionnement d'IM pour obtenir les résultats désirés.
Auto-encadrement (externe)
L'auto-encadrement est une technique qui permet d'encadrer une image en utilisant l'image elle-même pour générer les couleurs et les motifs de l'encadrement. Autrement dit, le cadre ajouté n'est pas fixe, mais varie de façon à correspondre approximativement à l'image encadrée. On peut procéder de deux manières. Étendre l'image originale pour créer un cadre externe, ou utiliser une partie de l'image réelle elle-même pour créer un cadre interne. Par exemple, si l'on agrandit l'image et qu'on l'assombrit avant d'y superposer l'image originale, on obtient un très bel encadrement. |
magick thumbnail.gif \
\( -clone 0 -resize 130% +level 20%x100% \) \
\( -clone 0 -bordercolor black -border 1x1 \) \
-delete 0 -gravity center -composite self_bordered.gif
![]()
| Au lieu d'utiliser lesAjustements de niveaux pour éclaircir (ou assombrir) l'image d'encadrement, une autre façon de rendre le bord plus clair ou plus foncé est de teinter en couleur le cadre à l'aide de quelque chose comme...
« -fill white -colorize 30% »
---|---
Une autre façon de teinter l'image pour générer le cadre consiste simplement à faire superposer par IM une Frame semi-transparente au-dessus de l'image agrandie. Cela nécessite cependant de connaître la taille de la miniature afin de la redimensionner exactement de la bonne quantité pour accueillir le cadre généré. |
magick thumbnail.gif \
\( -clone 0 -resize 140x110\! \) \
\( -clone 0 -bordercolor black -border 1x1 \
-mattecolor '#8884' -frame 9x9+0+9 \) \
-delete 0 -composite self_framed.gif
![]()
Une variante de ce qui précède utilise le contrôle spécial viewport et le réglage par défaut Pixel virtuel, Edge pour étendre le bord d'une image floutée afin de générer le cadre externe. |
magick thumbnail.gif \( +clone \
-set option:distort:viewport 150x120-15-15 \
-virtual-pixel Edge -distort SRT 0 +repage \
-blur 0x3 +level 20%,100% \) \
\( -clone 0 -bordercolor white -border 1 \) \
-delete 0 -gravity center -compose over -composite \
self_blurred_edge.gif
![]()
Juste un mot d'avertissement. Un petit défaut sur le bord (comme un arbre ou une feuille) peut produire des résultats indésirables dans un cadre généré uniquement à partir du bord de l'image. Le viewport a besoin de connaître la taille de l'image originale pour agrandir et décaler ce viewport de la quantité appropriée. Toutefois, on peut utiliser les expressions d'échappement FX pour calculer la taille du viewport (voir les exemples ci-dessous). Une alternative consiste à utiliser un Pixel virtuel, Dither flouté dans l'exemple ci-dessus. Cela répartit davantage les couleurs et donne un résultat moins « anguleux ». Mais si l'on ajoute des flous avant et après l'agrandissement, on peut se servir du dither pour produire un effet de tissu. |
magick thumbnail.gif \( +clone -blur 0x3 \
-set option:distort:viewport '%[fx:w+30]x%[fx:h+30]-15-15' \
-virtual-pixel Dither -distort SRT 0 +repage \
-blur 0x0.8 +level 20%,100% \) \
\( -clone 0 -bordercolor white -border 1 \) \
-delete 0 -gravity center -compose over -composite \
self_blurred_dither.gif
![]()
Le premier flou module la couleur moyenne, tandis que le second ajuste le degré de « pixellisation » ou de lissage du motif de dither. Voici un autre exemple, cette fois avec Pixel virtuel, Mirror, assorti d'un Bord adouci (noirci) qui s'est avéré très bien fonctionner pour cette image précise. |
magick thumbnail.gif \( +clone \
-set option:distort:viewport '%[fx:w+30]x%[fx:h+30]-15-15' \
-virtual-pixel Mirror -distort SRT 0 +repage \
-alpha set -virtual-pixel transparent \
-channel A -blur 0x8 +channel \
-background Black -flatten \) \
+swap -gravity center -compose over -composite \
self_mirror.gif
![]()
Dans tous les cas ci-dessus, les cadres sont générés à partir de la même image, qui est ensuite recombinée pour produire un cadre fondé sur les couleurs provenant de l'image originale. Le bord d'encadrement est ainsi unique et correspond à chaque image miniature encadrée. Fred Weinhaus a créé un script « [imageborder](http://www.fmwconcepts.com/imagemagick/imageborder/) » pour faciliter la réalisation d'images auto-encadrées, les bords étant générés à partir d'agrandissements floutés de l'image originale, ou à partir d'un réglage de Pixel virtuel définissant le contenu.
Auto-encadrement (interne)
Plutôt que d'agrandir l'image pour ajouter le nouveau bord, nous pouvons transformer avec magick des parties de l'image elle-même en un bord. Nous avons déjà vu quelques techniques d'ajout d'un cadre à l'intérieur même de l'image. Les techniques du Bouton en relief et du Bouton bulle le font, à l'aide de l'opérateur « [-raise](https://imagemagick.org/command-line-options/#raise) ». Nous générons ici une version plus claire et floutée de l'image originale, qui est ensuite superposée à l'aide d'un masque lui aussi généré à partir de l'image originale. Un bord blanc est ensuite ajouté pour séparer cette version plus claire et floutée de la partie centrale non modifiée de l'image. |
magick thumbnail.gif \( +clone -blur 0x3 +level 20%,100% \) \
\( +clone -gamma 0 -shave 10x10 \
-bordercolor white -border 10x10 \) \
-composite \
\( +clone -gamma 0 -shave 10x10 \
-bordercolor white -border 1x1 \
-bordercolor black -border 9x9 \) \
-compose screen -composite \
self_blurred_border.gif
![]()
Vous pouvez aussi utiliser l'Opérateur Frame pour obtenir un résultat un peu différent des effets de Bouton vus précédemment. L'astuce consiste à d'abord rogner (Shave) l'image originale avant d'appliquer l'opération. Par exemple, je fais ici une copie de l'image originale, je la rogne et je l'encadre avec un cadre transparent, avant de la superposer sur l'image originale. |
magick thumbnail.gif \( +clone -shave 10x10 \
-alpha set -mattecolor '#AAA6' -frame 10x10+3+4 \
\) -composite inside_frame_trans.gif
![]()
Le problème est que l'on « éclaircit » ou « assombrit » toujours (on décontraste) les parties plates du cadre autour de l'image originale. Pour éviter cela, on peut recourir à la même technique que celle du Bouton bulle. Nous générons un cadre sur un canevas gris parfait, puis nous le modifions afin de produire un Masque de composition d'éclairage servant à ajuster les couleurs de l'image originale. Par exemple, j'utilise ici une composition « [VividLight](compose.html#vividlight) » avec l'image de masque encadrée pour mieux préserver les couleurs primaires. |
magick thumbnail.gif \
\( +clone -shave 10x10 -fill gray50 -colorize 100% \
-mattecolor gray50 -frame 10x10+3+4 \
\) -compose VividLight -composite inside_frame_light.gif
![]()
Comme pour le Bouton bulle, vous pouvez aussi flouter le masque d'éclairage avant de l'appliquer. J'ai ici utilisé une composition « [HardLight](compose.html#hardlight) » plus classique, qui n'accentue pas les couleurs primaires, avec un masque d'éclairage à cadre flouté. |
magick thumbnail.gif \
\( +clone -shave 10x10 -fill gray50 -colorize 100% \
-mattecolor gray50 -frame 10x10+3+4 -blur 0x2 \
\) -compose HardLight -composite inside_frame_blur.gif
![]()
| CertainesMéthodes de composition d'éclairage peuvent nécessiter d'échanger les images avant de les composer pour obtenir l'effet d'éclairage correct.
---|---
Pour pousser ce type d'effet encore plus loin et produire des résultats bien plus complexes, voyez le Masque d'effet d'éclairage avancé.
Superposition de bord simple
Un type simple d'encadrement consiste à créer un cadre élaboré, ou une image découpée, dans lequel vous pouvez placer votre image, sous le cadre. Par exemple, nous générons ici un cadre simple, un peu plus grand que notre image, comportant un trou de forme élaborée. La forme a été extraite de la police « WebDings » (le caractère « Y »), mais il existe une multitude de sources possibles de formes élaborées utilisables pour encadrer une image. |
magick -size 120x140 -gravity center -font WebDings label:Y \
-negate -channel A -combine +channel -fill LightCoral -colorize 100% \
-background none -fill none -stroke firebrick -strokewidth 3 label:Y \
-flatten +gravity -chop 0x10+0+0 -shave 0x10 +repage border_heart.png
![]()
Pour d'autres façons de générer un bord sur une image de forme existante, voyez la Transformation de bord. Vous pouvez aussi, en option, donner un peu de profondeur au cadre en utilisant un Effet d'ombre. |
magick border_heart.png \( +clone -background black -shadow 60x3+3+3 \) \
-background none -compose DstOver -flatten border_overlay.png
![]()
Maintenant que nous disposons d'un cadre de superposition simple, nous pouvons placer l'image en dessous, au centre, sous le cadre, à l'aide d'une composition « [DstOver](../static/img/compose/dstover) ». |
magick border_overlay.png thumbnail.gif \
-gravity center -compose DstOver -composite border_overlaid.jpg
![]()
Vous pouvez désormais générer une bibliothèque de cadres préparés à l'avance pour vos images, comme cette image de feuilles d'automne.
magick thumbnail.gif autumn_leaves.png +swap \
-gravity center -compose DstOver -composite \
border_leaves.gif
Notez que j'ai inversé l'ordre des images et utilisé « [DstOver](compose.html#dstover) » pour placer la seconde image, l'image principale, « sous » le cadre. Ainsi, c'est le cadre qui détermine la taille finale de l'image, et non l'image originale. Cependant, procéder de la sorte fait aussi perdre toute métadonnée que possède l'image principale (pour la même raison). Si vous tenez vraiment à préserver les métadonnées de la miniature (comme les étiquettes et les commentaires, par exemple un message de copyright), la meilleure idée est de remplir (Pad) la miniature à la même taille que le cadre, puis d'utiliser la composition « [Over](compose.html#over) » par défaut pour superposer le cadre. De cette façon, la miniature est l'image « de destination » et ses métadonnées d'image sont préservées.
Exemple de superposition de badge
Voici un autre exemple de superposition préparée à l'avance, plus complexe, cette fois avec une image de taille correcte (en utilisant extent comme méthode de rognage), issu de la discussion du forum IM Composite Overlay and Masking.
magick thumbnail.gif -gravity center -extent 90x90 \
badge_overlay.png -composite badge.png
Notez que l'image elle-même n'est pas déformée, seulement légèrement éclaircie et assombrie, un cercle découpé et une ombre ajoutée, le tout dans une seule image de superposition. S'il s'agissait d'un véritable badge, ou d'une « bulle de verre », l'image devrait aussi être un peu déformée (peut-être à l'aide d'une distorsion en barillet), mais cela fonctionne bien sans avoir besoin d'une telle distorsion. Pour l'étape suivante de l'exemple du « badge », voyez Badge par masque et peinture, qui ajoute une transparence de fond autour de l'extérieur du badge.
Technique « masque et peinture »
Dans bien des cas, vous ne voulez pas seulement superposer un bord carré autour d'une image, mais aussi découper les bords de l'image en transparence. Pour cela, vous utiliserez généralement au moins deux images. L'une est la superposition masquée contenant les couleurs, les ombres et les rehauts que vous voulez ajouter à l'image existante. Et une seconde image contenant les parties que vous voulez retirer de l'image originale. Les deux images peuvent s'appliquer de deux manières différentes. Vous pouvez soit « masquer » d'abord pour retirer les parties indésirables de l'image, puis superposer le cadre, soit superposer un cadre, puis masquer en transparence les parties indésirables à la fois de l'image originale et des couleurs superposées. La méthode que vous employez est cruciale, et les images concernées seront conçues pour une technique précise. Vous ne pouvez pas utiliser les images d'une méthode dans le mauvais ordre, sinon les choses ne fonctionneront pas correctement. Par exemple, créons un bord de forme plus complexe, mais cette fois sans nous soucier du réglage du fond. |
magick -size 120x100 xc:none -fill none -stroke black -strokewidth 3 \
-draw 'ellipse 60,50 30,45 0,360 ellipse 60,50 55,30 0,360' \
-strokewidth 3 -draw 'ellipse 60,50 57,47 0,360' \
-channel RGBA -blur 2x1 border_ellipse.png
![]()
J'ai volontairement rendu ce bord flou, afin de rendre les composantes du bord bien plus semi-transparentes. Même sans ce flou supplémentaire, un bord contient de toute façon beaucoup de pixels d'anticrénelage semi-transparents, qui rendent le bord plus lisse et moins crénelé. Il est vital, lors du traitement d'image, de tenir compte de ces pixels semi-transparents, afin de les préserver et de les définir correctement. Pour rendre les choses plus intéressantes, donnons à ce bord « flou » un peu de couleur aléatoire. |
magick border_ellipse.png \
\( -size 120x100 plasma:Tomato-FireBrick -alpha set -blur 0x1 \) \
-compose SrcIn -composite border_ellipse_red.png
![]()
Bon, nous avons un bord, mais il nous faut encore un moyen de définir ce qui doit représenter l'extérieur et l'intérieur du bord. Fondamentalement, il nous faut un masque pour définir ces deux zones. |
magick -size 120x100 xc:none -fill black \
-draw 'ellipse 60,50 30,45 0,360 ellipse 60,50 55,30 0,360' \
border_ellipse_mask.png
![]()
La couleur de cette image « masque » n'a pas d'importance, seule sa forme compte, car elle définit essentiellement quelles parties seront classées comme intérieures et lesquelles seront extérieures. Le masque peut être un masque en niveaux de gris, ou un masque de forme comme celui montré ci-dessus. Ce dernier est toutefois généralement plus utile, et peut même être la forme des parties à effacer, ou des parties à conserver (comme ci-dessus). Dans ce cas, les images sont conçues selon la technique « masque et peinture », ce qui signifie que vous devez d'abord effacer les parties indésirables, puis superposer les couleurs de bord supplémentaires (qui comportent elles aussi un masque de transparence). Par exemple...
magick thumbnail.gif -alpha set -gravity center -extent 120x100 \
border_ellipse_mask.png -compose DstIn -composite \
border_ellipse_red.png -compose Over -composite \
border_mask_paint.png
Deux opérations de composition alpha de Duff-Porter sont toujours nécessaires. L'une pour rendre certaines parties transparentes, et l'autre pour superposer les couleurs supplémentaires qui soulignent le bord ou le cadre. Deux images sont nécessaires et doivent donc être conservées séparément. Certains formats comme MIFF et GIF permettent d'enregistrer les deux images dans le même fichier, pour un stockage plus simple. Bien sûr, vous pouvez combiner les deux images pour créer une unique image d'encadrement de superposition simple, mais seulement si vous voulez utiliser une couleur non transparente fixe pour les parties extérieures du résultat. Par exemple, prédéfinissez l'extérieur avec une couleur DodgerBlue... |
magick border_ellipse_mask.png -alpha extract -negate \
-background DodgerBlue -alpha shape \
border_ellipse_red.png -compose Over -composite \
border_ellipse_overlay.png
![]()
Mais dans ce cas, vous pourriez simplement glisser une couleur unie ou une autre image de fond sous l'image doublement masquée générée précédemment... |
magick border_double_masked.png \
\( -size 120x100 plasma:Green-Green -blur 0x1 \) \
+swap -compose Over -composite border_background.png
![]()
Le point important, avec deux images — une image « masque » et une image « superposition » —, c'est que vous disposez de bien plus de liberté dans la façon d'ajouter le bord à l'image. Vous pourriez même définir plusieurs images « masque », pour définir les différentes « fenêtres » de l'image de bord « superposée ». Vous pouvez aussi ajouter en option des rehauts et des ombres, plutôt que de les coder en dur dans une seule image d'encadrement de superposition. Voici maintenant une mise en garde importante. Les bords de l'image de masquage ne doivent pas coïncider avec les bords de l'image de superposition. S'ils coïncident, vous n'obtiendrez pas le traitement correct des couleurs le long des bords qui se recoupent, ou vous générerez d'autres effets étranges de « halo ». Vous devez donc veiller à ce que les bords du masque tombent quelque part à l'intérieur de la région parfaitement opaque de l'image de superposition. Prudence et anticipation sont nécessaires pour les deux opérations de masquage.
Bord à coins arrondis
Comme vous l'avez vu plus haut, la Technique « masque et peinture » peut servir à la fois à ajouter des couleurs ou des « fioritures » à une image, mais aussi à en retirer des parties, de façon à donner sa forme à l'image finale. Cela nous offre une autre façon d'ajouter des coins arrondis à une image. L'opérateur « [-draw](https://imagemagick.org/command-line-options/#draw) » d'IM propose une méthode « roundrectangle » qui permet de fournir un cadre intéressant autour de l'image. Vous devez toutefois dimensionner les paramètres de cette méthode de dessin pour qu'ils correspondent à l'image. IM fournit des méthodes pour extraire la taille de l'image et même effectuer des calculs mathématiques basés sur celle-ci. Les coordonnées où placer le rectangle correspondent au « centre » exact de l'épaisseur de trait (stroke-width) utilisée pour définir le rectangle (ce peut être une valeur à virgule flottante). Elles sont en outre données en « coordonnées de pixel » (voir Coordonnées de pixel vs coordonnées d'image), ce qui signifie qu'une valeur de 1,1 désigne le deuxième pixel à partir des bords supérieur et gauche, mais surtout qu'elle désigne le « centre » de ce pixel, qui se trouve en réalité à 1,5 unité des véritables bords supérieur et gauche. Nous allons maintenant utiliser une épaisseur de trait (SW) de 3, ce qui agrandit l'image de 3 pixels sur tous les côtés. Cela signifie alors que le rectangle sera positionné à SW/2 - 0.5, soit 1,0 pixel, du coin supérieur gauche, et à ImageSize + SW*1.5 - 0.5, soit la taille de l'image + 4 pixels, du coin inférieur droit. Nous utilisons ici IM lui-même pour effectuer ces calculs, en générant la commande draw exacte nécessaire à l'aide d'astucieuses échappements FX. Cela est enregistré dans un fichier Magick Vector Graphics directement utilisable par draw dans les commandes ultérieures.
magick thumbnail.gif \
-format 'roundrectangle 1,1 %[fx:w+4],%[fx:h+4] 15,15'\
info: > rounded_corner.mvg
| Si vous parvenez à déterminer la taille de l'image d'une autre manière (à l'aide du shell, ou d'un autre langage d'encapsulation d'API), vous pouvez substituer directement les paramètres de draw appropriés dans les exemples suivants, plutôt que d'utiliser une expression mathématique FX. Fondamentalement, ce qui précède rend tout ce processus indépendant de la taille réelle de la miniature. Toute autre méthode, y compris le codage en dur direct, est également acceptable.
---|---
Nous pouvons maintenant nous en servir pour générer une image de superposition et une image de masque. Dans le cadre de cette étape, nous créons un canevas transparent à partir de l'image originale (d'abord agrandie de l'épaisseur de trait), afin d'obtenir la bonne taille.
magick thumbnail.gif -border 3 -alpha transparent \
-background none -fill white -stroke none -strokewidth 0 \
-draw "@rounded_corner.mvg" rounded_corner_mask.png
magick thumbnail.gif -border 3 -alpha transparent \
-background none -fill none -stroke black -strokewidth 3 \
-draw "@rounded_corner.mvg" rounded_corner_overlay.png
Et voilà, nous avons l'image de bord de superposition et l'image de masque de transparence dont nous avons besoin pour la technique de double masquage. Notez que les masques sont destinés à une image plus grande que l'image originale de l'épaisseur de trait, et que le masque de forme d'effacement (en blanc) ne couvre pas la totalité de la zone agrandie, puisqu'il subsiste un espace d'un pixel tout autour. Appliquons-le donc à l'aide de la technique de Double masquage... |
magick thumbnail.gif -alpha set -bordercolor none -border 3 \
rounded_corner_mask.png -compose DstIn -composite \
rounded_corner_overlay.png -compose Over -composite \
rounded_border.png
![]()
Et voilà, nous avons encadré notre image avec des coins arrondis. Voici comment réaliser tout ce qui précède en une seule commande, avec un peu de raffinement supplémentaire. Cette commande tout-en-un génère cependant toujours un fichier temporaire contenant les commandes draw générées nécessaires pour une image de la taille donnée. |
magick thumbnail.gif \
-format 'roundrectangle 1,1 %[fx:w+4],%[fx:h+4] 15,15' \
-write info:tmp.mvg \
-alpha set -bordercolor none -border 3 \
\( +clone -alpha transparent -background none \
-fill white -stroke none -strokewidth 0 -draw @tmp.mvg \) \
-compose DstIn -composite \
\( +clone -alpha transparent -background none \
-fill none -stroke black -strokewidth 3 -draw @tmp.mvg \
-fill none -stroke white -strokewidth 1 -draw @tmp.mvg \) \
-compose Over -composite rounded_border_in_one.png
rm -f tmp.mvg # Nettoyage du fichier temporaire
![]()
Une meilleure façon de réaliser des coins arrondis, en particulier avec de très grandes images, consiste à utiliser une technique d'images de masquage de coin séparées, que nous verrons plus bas dans Superpositions de coins élaborées. À bien des égards, c'est une extension de la méthode précédente, mais qui utilise un masquage distinct pour chaque coin de l'image, afin de garder de petites tailles pour les images de travail.
Badge par masque et peinture
Voici un exemple de « masque et peinture » bien plus complexe, développé à partir de l'image utilisée précédemment dans l'exemple de Superposition de badge ci-dessus. La génération des deux images a été « bricolée » et a été discutée sur les forums IM Composite Overlay and Masking. Idéalement, les deux images auraient été développées ensemble.
magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
badge_mask.png -compose DstIn -composite \
badge_shading.png -compose Over -composite \
badge_trans_bg.png
Notez que j'ai dit plus haut qu'il fallait éviter de chercher à aligner les bords de transparence et les bords du masque. Dans l'exemple ci-dessus, j'ai fait exactement cela, et les bords de l'image résultante ne seront pas tout à fait corrects. Cependant, comme la mise en couleur n'est vraiment qu'un ombrage subtil plutôt qu'un bord marqué, cela semble bien fonctionner dans cet exemple. La prudence reste toutefois de mise. Pour l'étape suivante des exemples de « badge », voyez Badge par peinture et masque, qui inverse l'ordre des deux opérations de composition et nécessite un jeu d'images différent.
Technique « peinture et masque »
Plutôt que de « masquer puis peindre », vous pouvez utiliser un jeu d'images différent et superposer d'abord les couleurs supplémentaires, avant de masquer le fond. Autrement dit, vous pouvez effectuer un « peindre puis masquer ». C'est-à-dire que vous prenez votre image et vous superposez le bord, qui définit non seulement toutes les couleurs finales du bord, mais masque et colore aussi une partie ou la totalité des parties extérieures à l'image originale. Vous utilisez ensuite un masque « extérieur » ou de « détourage » distinct pour retirer toutes les parties indésirables de l'image résultante. Notez aussi que l'image « superposition » comme l'image « masque » définissent le bord intérieur séparément du bord extérieur. Par conséquent, une seule image ne définit pas complètement l'ensemble du bord en une seule image, ce qui peut la rendre un peu plus difficile à utiliser. Elle peut toutefois être plus simple à mettre en œuvre. Par exemple...
magick -size 120x90 xc:none -fill black -stroke black -strokewidth 0 \
-draw 'ellipse 45,45 55,37 0,360' \
-channel RGBA -negate -blur 0x3 +channel \
\( granite: -auto-level -blur 0,0.7 \) \
-compose ATop -composite border_paint.png
magick -size 120x90 xc:none -fill black -stroke black -strokewidth 5 \
-draw 'ellipse 59,45 56,40 0,360' border_mask.png
magick thumbnail.gif -alpha set \
border_paint.png -compose Over -composite \
border_mask.png -compose DstIn -composite \
border_paint_mask.png
Remarquez comment certaines parties des couleurs superposées sont retirées. C'est la caractéristique clé de la technique peinture et masque, qui permet d'utiliser une superposition plus simple, ensuite ajustée par le masque. Cette méthode de masquage d'image est celle employée dans le prochain jeu d'exemples des Coins de page cornée, et à nouveau plus loin dans les Bords de coins élaborés ci-dessous.
Coins de page cornée
Fred Weinhaus a créé un script shell spécial appelé PageCurl qui ajoute une simple corne de page à une image existante, à l'aide de mathématiques très complexes (en shell). Par exemple... |
pagecurl thumbnail.gif pagecurl.png
![]()
En interne, il utilise en réalité la technique peinture et masque. C'est-à-dire qu'il superpose d'abord une « superposition de corne » légèrement trop grande, puis efface (masque) le reste de l'image, y compris une petite partie de la superposition, qui deviendra le coin transparent. Cependant, si vous voulez appliquer une corne de page à un grand nombre d'images, utiliser le script complet (ci-dessus) est une technique assez lente. Après tout, il effectue une énorme quantité de traitement mathématique (en utilisant IM lui-même comme calculatrice à virgule flottante) pour réellement calculer et générer les images de superposition et de masquage appropriées. Pour appliquer une corne de page à un grand nombre d'images, il vaut mieux utiliser le script une seule fois afin de ne générer qu'une seule fois l'image de superposition et l'image de masque de transparence. Extrayons donc ces deux images pour de plus petites images de 64x64 pixels (en utilisant une option spéciale « -i "pagecurl" » ajoutée au script à cette fin). |
magick -size 64x64 xc: miff:- | pagecurl -e 0.3 -i "pagecurl" - null:
![]()
La commande ci-dessus crée deux fichiers image : « pagecurl_overlay.png » et « pagecurl_mask.png » montrés ici. L'image d'entrée elle-même n'a pas d'importance, car ce sont les images de masquage que nous voulons. Le résultat « corné » est simplement jeté à l'aide du format de fichier image spécial « [null:](files.html#null) ». |
magick thumbnail.gif -alpha set -gravity SouthEast \
-define compose:outside-overlay=false \
pagecurl_overlay.png -composite \
pagecurl_mask.png -compose DstIn -composite \
pagecurl_thumbnail.png
![]()
Bien sûr, ces images ne sont pas de la même taille que notre miniature ni, probablement, que toute image à laquelle vous voulez les appliquer, mais cela n'a pas d'importance, car nous pouvons recourir à quelques options supplémentaires pour garantir qu'elles fonctionnent comme prévu. Plus précisément, le réglage « [-gravity](https://imagemagick.org/command-line-options/#gravity) » garantit que les deux images de superposition sont positionnées dans le coin inférieur droit. Et le réglage Define spécial « compose:outside-overlay=false » empêche l'image de masque d'effacer les parties de l'image non couvertes par l'image plus petite. Voyez Réglage Outside-Overlay pour une description complète. Si vous souhaitez appliquer cela à un grand nombre d'images, vous pouvez utiliser « magick mogrify », à l'aide d'une technique spéciale faisant appel à « [-draw](https://imagemagick.org/command-line-options/#draw) » pour réaliser la composition alpha de Mogrify. Cette méthode de composition ne comprend toutefois pas le réglage define spécial, elle ne fonctionnera donc qu'avec des images, superpositions et masques ayant tous la même taille.
pagecurl -e 0.5 -i /tmp/pagecurl {_une image_} null:
magick mogrify {_options -format et -path de magick mogrify_} -alpha set \
-draw 'image Over 0,0 0,0 "/tmp/pagecurl_overlay.png"' \
-draw 'image DstIn 0,0 0,0 "/tmp/pagecurl_mask.png"' \
{_toutes les images à corner_}...
Superposition de coins élaborée
Nous examinons ici un peu plus en profondeur l'utilisation de cette technique de « double masquage » pour modifier une image de différentes manières dans différentes zones, plutôt que d'appliquer un seul grand masque ou cadre à l'ensemble de l'image. Dans ce cas, nous ne doublerons le masquage que sur les coins. Le reste du bord (pour l'harmoniser) est ajouté séparément.
Les images de coin que je vais utiliser ont été générées à partir de la source originale (montrée à droite), que j'ai trouvée dans la section DIY Frames de la bibliothèque d'icônes d'Anthony. Il y en a d'autres dans cette section, vous voudrez peut-être y jeter un œil. Si vous trouvez quelque chose sur le net, faites-le-moi savoir, car j'aime collectionner les coins et les techniques de bordure intéressants.
Une image de superposition de couleur et une image de masquage ont été générées à partir de cette image initiale, afin de pouvoir utiliser une technique peinture et masque pour superposer le coin sur l'image. Remarquez que ces images n'utilisent en réalité aucun pixel semi-transparent, ni même aucun dégradé de couleurs. Aussi ce bord élaboré peut-il servir à produire des miniatures « GIF » à l'aspect net pour les pages web. La difficulté, avec les masques de coin, c'est qu'ils ne masquent que les coins de l'image originale. Pour cette raison, l'image originale doit d'abord recevoir le jeu approprié de couleurs de bord supplémentaires. Ensuite, les deux masques de coin doivent être composés sur chacun des coins de l'image agrandie. |
magick thumbnail.gif -alpha set -compose Copy \
-bordercolor Black -border 2 \
-bordercolor Sienna -border 3 \
-bordercolor Black -border 1 \
-bordercolor None -border 2 \
-bordercolor Black -border 2 \
-bordercolor Peru -border 3 \
-bordercolor Black -border 1 \
\
-compose Over \
\( fancy_add.gif \) -gravity NorthWest -composite \
\( fancy_add.gif -flip \) -gravity SouthWest -composite \
\( fancy_add.gif -flop \) -gravity NorthEast -composite \
\( fancy_add.gif -flip -flop \) -gravity SouthEast -composite \
-compose DstOut \
\( fancy_sub.gif \) -gravity NorthWest -composite \
\( fancy_sub.gif -flip \) -gravity SouthWest -composite \
\( fancy_sub.gif -flop \) -gravity NorthEast -composite \
\( fancy_sub.gif -flip -flop \) -gravity SouthEast -composite \
fancy_border.gif
![]()
| Notez que pour préserver le bord transparent qui est ajouté, vous devez régler le paramètre «[-compose](https://imagemagick.org/command-line-options/#compose)» sur «Copy» plutôt que sur la valeur par défaut «Over». Sinon, la transparence sera comblée par la prochaine couleur de bord ajoutée, dans ce cas « Black ». Voyez l'Opérateur Border pour les détails.
---|---
La beauté de n'utiliser que des masques de coin, c'est que n'importe quelle taille d'image peut être encadrée avec cette technique, du moment qu'elle est assez grande pour les masques de coin ajoutés. Autrement dit, vous n'êtes pas limité par la taille des images d'encadrement dont vous disposez. Bien sûr, chacune des quatre images de coin et les bords sont identiques tout autour de l'image, simplement pivotés. C'est-à-dire que l'effet d'ombre ou d'épaisseur est entièrement « vers l'intérieur ». Pour corriger cela, il vous faudrait générer une pièce de coin différente pour chaque coin, et l'ajout des bords supplémentaires autour de l'image originale devrait être asymétrique. Fondamentalement, cela devient bien plus complexe, afin de produire de véritables effets d'ombrage. Une meilleure solution serait peut-être de retirer l'effet d'ombre de la pièce de coin, de l'appliquer comme précédemment, puis d'ajouter les effets d'ombre de façon globale. La prudence est de mise.
Badge par peinture et masque
Le même traitement d'image de badge vu précédemment dans Superposition de badge et Badge par masque et peinture peut aussi s'effectuer en peignant puis en masquant. Nous peignons ici d'abord toutes les couleurs et les nuances sur l'image, puis nous masquons la transparence finale de l'image.
magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
badge_paint.png -composite badge_shape.png -compose DstIn -composite \
badge_paint_mask.png
Si cela vous paraît malcommode pour cette image précise, vous avez raison, ça l'est. La raison en est que nous devons non seulement ombrer et rehausser l'image originale, mais aussi remplir de noir toute zone qui contiendra des effets d'ombre. Plus précisément, toute partie qui deviendra entièrement transparente (et uniquement les pixels réellement entièrement transparents) devra être peinte en noir. En revanche, les pixels semi-transparents porteurs d'effets d'ombre auront à la fois un effet de nuance partiel et un masque de transparence partiel. Autrement dit, les ombres rendent malcommode une technique de peinture et de masque par ailleurs simple, dans la répartition des effets de peinture et de masquage. C'est pourquoi une technique de peinture et de masque n'est généralement pas employée lorsqu'on a affaire à des ajouts semi-transparents à une image, comme lors de l'ajout d'ombres ou d'étoiles de reflet. Si l'image ne contenait aucun effet de transparence, alors le processus de peinture ne paraît pas si horrible, et peut dans bien des cas être plus simple que d'autres techniques, car vous pouvez « découper » les superpositions peintes avec le masque une fois terminé. L'exemple de la Page cornée était un tel cas, où nous utilisons le masque pour rogner la superposition de corne afin d'en faire un tout homogène. Notez aussi l'écart entre la région noire dure et les effets d'ombrage dans l'image de peinture. Cet écart reflète l'avertissement que j'ai mentionné plus haut, à savoir veiller à ne pas faire chevaucher les résultats d'un masquage interne quelconque avec les bords d'un masque externe de peinture/superposition. Ce n'est que dans ce cas précis que cet écart requis devient si évident. Pour l'étape suivante des exemples de « badge », voyez Badge par effets d'éclairage, qui fusionne les deux images de masquage en une seule image de masque/ombrage.
Technique du masque d'éclairage
Bouton en bulle de verre
Le niveau de complexité suivant dans le traitement des miniatures est l'application d'effets d'éclairage très complexes. La difficulté ici tient moins à l'application d'un effet d'éclairage à une image qu'à la génération de l'effet d'ombrage approprié. Par exemple, avec un effet Aqua, vous pouvez donner à une miniature un effet d'ombrage très complexe qui lui donne l'air d'être enfermée dans une « bulle » de verre. De plus, cela fonctionne mieux avec une miniature à coins arrondis. Générons donc d'abord un masque à coins arrondis pour notre image miniature, en utilisant une couleur grise pure. |
magick thumbnail.gif -alpha off -fill white -colorize 100% \
-draw 'fill black polygon 0,0 0,15 15,0 fill white circle 15,15 15,0' \
\( +clone -flip \) -compose Multiply -composite \
\( +clone -flop \) -compose Multiply -composite \
-background Gray50 -alpha Shape thumbnail_mask.png
![]()
Maintenant que nous disposons d'un « masque de forme » gris pur à utiliser, je peux appliquer l'effet Aqua pour générer une superposition d'éclairage, pour cette forme. |
magick thumbnail_mask.png -bordercolor None -border 1x1 \
-alpha Extract -blur 0x10 -shade 130x30 -alpha On \
-background gray50 -alpha background -auto-level \
-function polynomial 3.5,-5.05,2.05,0.3 \
\( +clone -alpha extract -blur 0x2 \) \
-channel RGB -compose multiply -composite \
+channel +compose -chop 1x1 \
thumbnail_lighting.png
![]()
Avec une image de superposition lumière/ombre finale comme celle ci-dessus, nous pouvons facilement l'appliquer à n'importe quelle image miniature de la bonne taille. |
magick thumbnail.gif -alpha Set thumbnail_lighting.png \
\( -clone 0,1 -alpha Opaque -compose Hardlight -composite \) \
-delete 0 -compose In -composite \
glass_bubble.png
![]()
Non seulement cela ajoute les effets d'ombrage appropriés à toute miniature de cette taille, mais la même image d'éclairage masque aussi la miniature pour lui donner la forme voulue. Il est important de noter que seuls les canaux de couleur servent à appliquer l'effet d'éclairage, le canal alpha n'est pas utilisé dans ce processus. De même, lors du masquage, seul le canal alpha est utilisé, pas les canaux de couleur. Sans cette séparation des canaux pour les différents effets, vous n'obtiendrez pas le résultat correct. Pour une discussion sur l'extraction d'un effet d'éclairage à partir d'images, voyez le sujet du forum des utilisateurs d'IM Extracting light layer from two images.
Cela peut cependant être poussé bien plus loin, en ce sens que nous pouvons aussi ajouter directement des effets d'ombre à ce masque d'éclairage. La couleur ajoutée doit toutefois être un noir pur, et vous devez veiller à ce que la composition d'effet d'éclairage choisie rende une image parfaitement noire lorsque le masque d'éclairage est noir. Or c'est en réalité ainsi que les effets d'ombre sont normalement ajoutés à une image, aussi pouvez-vous simplement ajouter les ombres directement au « masque d'effet d'éclairage », et tout ira bien ! Il en va de même pour l'ajout de « reflets » d'éclairage, mais en utilisant uniquement des pixels blancs pour la superposition de reflet. En somme, une « image d'effet d'éclairage » peut là encore fusionner les deux images masque et peinture en une seule image. Comme vous le verrez dans l'exemple suivant.
Badge par effets d'éclairage
En utilisant les images de la technique Badge par masque et peinture, je les ai appliquées à une image de canevas gris pur, afin de générer rapidement une image d'« effet d'éclairage masqué ». En réalité, j'aurais tout aussi bien pu utiliser l'autre style de masquage (Badge par peinture et masque). J'applique ensuite l'unique image de masquage à la miniature, reproduisant le résultat désiré.
# fusionner les images « masque et peinture » avec une image grise,
# pour créer un « masque d'éclairage »
magick -size 90x90 xc:gray50 -alpha set \
badge_mask.png -compose DstIn -composite \
badge_shading.png -compose Over -composite \
badge_lighting.png
# Appliquer l'unique « masque d'éclairage »
magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
badge_lighting.png \
\( -clone 0,1 -alpha Opaque -compose Hardlight -composite \) \
-delete 0 -compose In -composite \
badge_final.png
En fait, j'aime plutôt bien cette forme de masquage, car l'image de masque elle-même paraît presque identique à l'image que vous recherchez, seules les couleurs manquant. C'est, après tout, ainsi qu'un masque d'éclairage est créé : appliquez simplement les effets à une image grise parfaite, et vous obtenez une image de « masque d'éclairage ». Souvenez-vous seulement qu'avec cette technique particulière, l'ombre semi-transparente doit être d'un noir pur pour fonctionner correctement. Vous ne pouvez pas utiliser une couleur grise pour un pixel qui ne contient pas au moins une partie de l'image originale. Toutes les zones transparentes et semi-transparentes doivent être d'une couleur blanche ou noire pure, avec le niveau approprié de transparence alpha. Pourquoi une seule image suffit-elle ? Auparavant, il nous fallait deux images ! La réponse est que l'image de masquage est limitée à n'ajouter que des nuances de couleur noir ou blanc pur. Ce faisant, l'effet d'ombrage (d'éclairage) et son masque sont pour l'essentiel fusionnés dans la composante couleur du « masque d'effet d'éclairage ». Il en résulte que le canal alpha devient libre de contenir le masque de transparence auparavant distinct pour l'image finale. La limitation est toutefois que vous ne pouvez ajouter à l'image que des nuances de blanc et de noir. Vous ne pouvez pas, par exemple, ajouter une couleur grise à l'image masquée. Notez cependant qu'il est possible d'ajouter certaines teintes de couleurs primaires et secondaires d'un espace colorimétrique, mais seulement de façon limitée, et je ne l'ai jamais vu employé. En résumé, vous ne pouvez pas ajouter de couleurs spécifiques ni de bords élaborés à l'image, seulement des nuances et des ombres, des rehauts et des reflets, ou du simple texte noir ou blanc. Vous ne devriez toutefois pas chercher à mélanger ou à faire se chevaucher les effets ajoutés en blanc et en noir, car les pixels gris d'anticrénelage résultant entre les deux produisent une couleur ombrée issue de l'image sous-jacente, et non la couleur grise attendue. C'est là l'inconvénient de cette technique !
Masquer des images avec des distorsions...
Plus incroyable encore : comme la couleur d'ombrage n'est qu'une image en niveaux de gris, vous pouvez comprimer les effets d'éclairage sur un seul canal de couleur et le masque du canal alpha. Cela permet alors de libérer deux canaux de couleur de l'image pour d'autres effets de traitement d'image ! Autrement dit, vous pouvez stocker d'autres choses dans l'unique « image de masquage ». Concrètement, vous pouvez ajouter des effets de distorsion dans la même image de masque ! Pour plus d'informations à ce sujet, voyez Image de distorsion unifiée, qui fait exactement cela ! Une sorte d'image de masquage ultime.
Encadrement à l'aide d'images de bordure
Une manière courante d'ajouter une bordure complexe à une image consiste à utiliser des images d'encadrement préparées à l'avance, afin de produire un cadre tel que l'exemple montré (à droite). Cependant, il faut aussi être prudent lors de la génération des cadres. Si vous examinez attentivement l'exemple donné, vous remarquerez qu'il n'est pas tout à fait correct. L'ombrage du cadre généré est en réalité erroné. Les bordures gauche et inférieure du cadre devraient être échangées pour produire un cadre correctement ombré pour une source de lumière typique en haut à gauche. Ainsi, avant même de commencer, je tiens à souligner l'importance d'utiliser l'image correcte, ou l'image correctement modifiée, pour chaque bordure lors de l'encadrement de votre vignette ou de votre photo. Il est très facile de se tromper, alors vérifiez bien vos résultats quand vous pensez avoir réussi.
Les images de bordure du cadre
Il existe de nombreux types d'images pouvant servir à encadrer une image. Par exemple, voici un cadre « noir fin à liseré doré » qui a été modifié à partir d'images fournies par Michael Slate
Il y a deux images, pour fournir deux effets d'éclairage différents, l'une pour les bordures supérieure et gauche, l'autre pour les bordures inférieure et droite. Cependant, les couleurs le long de l'image ne varient pas. Vous pouvez donc soit juxtaposer en tuiles, soit étirer ce cadre pour produire la longueur nécessaire. Un ensemble similaire de pièces d'encadrement est constitué de ces images de bordure « or fin ornementé » juxtaposables en tuiles.
Comme ces images comportent des détails fins, vous ne pouvez pas simplement étirer l'image à la longueur voulue. Vous ne pouvez pas non plus vous contenter d'une rotation rectangulaire de ces pièces pour produire les pièces des autres bordures, car cela donnerait un ombrage erroné des détails fins. Une distorsion de transposition diagonale devrait toutefois donner l'ombrage correct pour les autres bordures. Une prudence supplémentaire est conseillée lors de la vérification de vos résultats, afin de vous assurer que l'ombrage global comme l'ombrage des détails fins sont corrects sur les quatre côtés de l'image. Enfin, une image d'encadrement peut n'être constituée que d'une seule image utilisable pour générer toutes les bordures du cadre, comme cette image de cadre en tuiles « bambou ».
La raison pour laquelle une seule image suffit est que le cadre n'a pas d'« intérieur » ni d'« extérieur » spécifique. Le cadre présente cependant des effets d'éclairage à la fois globaux et de détail fin, qui vous obligent à nouveau à faire attention à la manière dont vous faites pivoter/retournez/transposez l'image pour les autres bordures. Le plus gros problème avec ce cadre est que, si vous le juxtaposez simplement en tuiles, le détail macroscopique devient très régulier ; il se peut donc que vous deviez rendre aléatoire le décalage des tuiles, ou même rendre aléatoires les longueurs des pièces à assembler, afin de lui donner un aspect plus naturel. Nous y reviendrons plus loin. Comme vous pouvez le voir, les images d'encadrement se présentent dans une variété de styles, et il faut prendre soin de traiter les images de bordure choisies de la bonne façon (au regard de l'image d'éclairage) lors de la génération des autres images de bordure manquantes.
Allonger les pièces d'encadrement
Or, quelle que soit l'utilisation de ces images d'encadrement, nous devrons créer des pièces plus longues couvrant la longueur des dimensions de l'image. Il n'existe que deux méthodes de base pour y parvenir. Vous pouvez simplement étirer l'image du cadre à l'aide du redimensionnement (sans préservation du rapport d'aspect) afin d'obtenir les bonnes longueurs. Cela fonctionne pour le premier ensemble de pièces montré ci-dessus, qui n'ont pas de détail interne, mais ce n'est adapté à aucune des autres images d'encadrement présentées. Fondamentalement, cela déforme le détail interne et peut devenir une distraction dans l'aspect de l'image finale. Cependant, l'autre méthode d'allongement, la juxtaposition en tuiles, peut être utilisée pour toute image d'encadrement présentant un motif ou un détail répétitif, ce qui est le cas de toutes les images présentées ci-dessus. Si vous créez vos propres pièces d'encadrement, veillez à ce que les tuiles se raccordent correctement, et à une limite de pixel, afin de garantir une couleur uniforme et un cyclage correct du détail dans vos images d'encadrement. Sinon, vous pouvez obtenir une jointure d'aspect artificiel entre les tuiles, qui devient évidente à cause de la répétition des tuiles. Dans le monde réel, les encadreurs rencontrent aussi le même problème pour assembler des pièces afin d'en faire de plus longues. Fondamentalement, il est très facile d'obtenir deux teintes de bois différentes, ou des motifs de grain très différents, qui, une fois assemblés « en queue d'aronde », rendent la jointure très visible. Alors, vous n'êtes vraiment pas seul face à ce problème. Les images d'encadrement « bambou » devront être juxtaposées en tuiles. Cependant, comme le détail est restreint à une petite zone de l'image, vous pouvez obtenir des effets de juxtaposition aléatoires intéressants, qu'il faudra peut-être supprimer par un allongement et un raccourcissement aléatoires des pièces. Je n'entrerai toutefois pas dans ce sujet et le laisserai en exercice à ceux que cela intéresse. Pour nos exemples, et parce que cela fonctionne pour à peu près toutes les images d'encadrement, j'utiliserai une simple méthode de juxtaposition à pas constant pour générer les longueurs de bordure plus longues nécessaires.
Un append trop simpliste
Nous pouvons simplement allonger le cadre « bambou » simple ci-dessus en le juxtaposant en tuiles à la bonne longueur, puis en effectuant un append (concaténation) des images ensemble. La juxtaposition se fait simplement grâce au générateur d'image spécial Canevas en tuiles « [tile:](canvas.html#tile) » pour juxtaposer une image en cours de lecture. |
magick thumbnail.gif \
\( -size 90x14 tile:bamboo.gif -transpose \) \
\( -size 90x14 tile:bamboo.gif -transpose \) -swap 0,1 +append \
\( -size 148x14 tile:bamboo.gif \) \
\( -size 148x14 tile:bamboo.gif \) -swap 0,1 -append \
frame_append.gif
![]()
Notez que les tailles utilisées dans les deux exemples ci-dessus ont été calculées à partir de la largeur connue (10 pixels) de l'image d'encadrement et de la taille de l'image à encadrer (120x100 pixels). Vous devrez ajuster les arguments de redimensionnement de manière appropriée pour vos images. Un problème lié à la juxtaposition des pièces d'encadrement (comme le bambou) est que toutes les bordures semblent être des copies exactes les unes des autres ! Autrement dit, l'encadrement paraît artificiel. Dans la vraie vie, le cadre aura été découpé avec des décalages pratiquement aléatoires, à partir de pièces plus longues de bois réel, ou dans ce cas de bambou. Pour corriger cela, vous devrez également donner à ces tuiles un décalage de tuile légèrement différent pour chaque bordure de l'image. |
magick thumbnail.gif \
\( -size 90x14 -tile-offset +50+0 tile:bamboo.gif -transpose \) \
\( -size 90x14 -tile-offset +0+0 tile:bamboo.gif -transpose \) \
-swap 0,1 +append \
\( -size 148x14 -tile-offset +70+0 tile:bamboo.gif \) \
\( -size 148x14 -tile-offset +25+0 tile:bamboo.gif \) \
-swap 0,1 -append frame_tile_offset.gif
![]()
Cette méthode d'encadrement n'est pas trop mauvaise pour ce type particulier d'image de bordure, mais pour d'autres types de cadres, elle peut paraître très ridicule. Fondamentalement, les coins ne sont pas corrects, et pour la plupart des cadres, vous voulez vraiment que les images de bordure se rejoignent selon une jointure à 45 degrés, exactement comme dans un véritable cadre. Une solution consiste à générer à la main, à l'avance, des images de coin appropriées que nous pouvons désormais superposer à cette image pour la rendre correcte. Cela fonctionne bien pour une image d'encadrement simple et étirable (comme l'image d'encadrement « noir fin »), mais échoue plutôt mal pour une image juxtaposable en tuiles comme le « bambou », car l'image de coin ne s'ajustera probablement pas correctement à l'image en tuiles. La meilleure méthode consiste à générer les jointures de coin directement à partir des images de bordure juxtaposées. Et je vous montrerai plus loin comment procéder.
Encadrement par superposition étendue
Vous pouvez aussi rendre ce type d'encadrement par bordure encore meilleur en étendant les cadres au-delà des limites de l'image d'origine. On voit souvent cela pour un tableau de type « Home-Sweet-Home ». Pour ce faire, vous devrez d'abord agrandir l'image d'origine avec beaucoup d'espace supplémentaire dans lequel superposer les pièces de cadre plus longues.
magick thumbnail.gif -alpha set -bordercolor none -border 34 \
\( -size 144x14 -tile-offset +30+0 tile:bamboo.gif -transpose \) \
-geometry +20+10 -composite \
\( -size 144x14 -tile-offset +45+0 tile:bamboo.gif -transpose \) \
-geometry +154+0 -composite \
\( -size 178x14 -tile-offset +60+0 tile:bamboo.gif \) \
-geometry +0+20 -composite \
\( -size 178x14 -tile-offset +0+0 tile:bamboo.gif \) \
-geometry +10+124 -composite \
frame_overlaid.gif
Notez que les mesures et le positionnement pour ce type d'encadrement ne sont pas simples et pourraient bénéficier d'une certaine randomisation, telle que celle que j'ai codée en dur dans l'exemple ci-dessus. Vous pouvez aussi améliorer davantage l'aspect en arrondissant les extrémités des longueurs de cadre, avec un ombrage supplémentaire et approprié. Une bien meilleure manière d'encadrer les images de cette façon consiste à générer l'image d'encadrement comme une unité complète, et à simplement la superposer sur une image de taille fixe (voir Superposition de bordure simple). Toutefois, procéder ainsi signifie que vous ne pouvez plus randomiser légèrement les longueurs et la position de chaque pièce d'encadrement.
Jointures de coin à 45 degrés
La meilleure solution consiste à ajouter d'une manière ou d'une autre les images d'encadrement autour de la vignette de façon à créer réellement une jointure à 45 degrés dans chacun des coins du cadre. Ce n'est pas facile, et j'ai essayé plusieurs méthodes de dessin et de masquage jusqu'à ce que je redécouvre un opérateur magique appelé Frame, bordures façon 3D. La solution était alors simple. Lire l'image et lui appliquer « [-frame](https://imagemagick.org/command-line-options/#frame) », pour créer un gabarit des zones à encadrer. |
magick thumbnail.gif -alpha set -bordercolor none \
-compose Dst_Out -frame 15x15+15 frame_template.gif
![]()
Notez maintenant que ce gabarit présente quelques caractéristiques intéressantes. Premièrement, il est transparent au centre, là où se placera l'image principale. Deuxièmement, il possède quatre couleurs distinctes, et seulement quatre, définissant chaque zone dans laquelle nous voulons placer nos images d'encadrement. Il ne génère pas de pixels d'« anticrénelage » de couleurs variées dans les coins. Notez que, pour simplifier les choses, la largeur de ces zones (15 pixels) est la largeur des pièces d'encadrement que nous ajouterons à l'image. Si les bordures verticales avaient une épaisseur différente des bordures horizontales, cette technique ne fonctionnerait pas très bien. En fait, peu de méthodes fonctionneraient bien dans une telle situation. Cette image est le gabarit d'encadrement et, en juxtaposant chacune de nos pièces d'encadrement dans les quatre zones de couleurs différentes à l'aide des primitives de remplissage de couleur, nous obtiendrons nos jointures de coin à 45 degrés, très simplement et facilement. Par exemple... |
magick frame_template.gif \
-tile blackthin_top.gif -draw 'color 1,0 floodfill' \
frame_top_filled.gif
![]()
Vous pouvez répéter ce processus pour les trois autres bordures. En utilisant des transpositions pour garantir que les hautes lumières et les ombres du détail interne restent correctes. |
magick frame_template.gif \
-tile blackthin_top.gif -draw 'color 1,0 floodfill' \
-tile-offset +0+105 -tile blackthin_btm.gif \
-draw 'color 15,105 floodfill' \
-transpose \
-tile blackthin_top.gif -draw 'color 1,0 floodfill' \
-tile-offset +0+135 -tile blackthin_btm.gif \
-draw 'color 15,135 floodfill' \
-transpose \
-gravity center thumbnail.gif -composite frame_filled.gif
![]()
À partir d'une discussion sur le forum IM, 45 degree frame joints, une solution plus simple, consistant à pré-pivoter la bordure inférieure, a été trouvée. Voici l'exemple complet utilisant le registre en mémoire pour sauvegarder les images intermédiaires. |
magick thumbnail.gif -write mpr:image +delete \
goldthin_top.png -write mpr:edge_top +delete \
goldthin_btm.png -rotate 180 -write mpr:edge_btm +delete \
\
mpr:image -alpha set -bordercolor none \
-compose Dst -frame 25x25+25 -compose over \
\
-tile mpr:edge_btm \
-transverse -draw 'color 1,0 floodfill' \
-transpose -draw 'color 1,0 floodfill' \
-tile mpr:edge_top \
-transverse -draw 'color 1,0 floodfill' \
-transpose -draw 'color 1,0 floodfill' \
\
mpr:image -gravity center -composite frame_gold.png
![]()
Comme vous pouvez le voir, nous avons toujours un problème : cela paraît très artificiel dans le coin supérieur gauche et le coin inférieur droit, à cause d'un effet miroir diagonal résultant de la juxtaposition. Pour corriger cela, nous devons ajouter un « [-tile-offset](https://imagemagick.org/command-line-options/#tile-offset) » randomisé, afin de supprimer cet effet miroir. | Le réglage du décalage de tuile était défectueux avant la version IM 6.3.9-9, en ce sens que le décalage « X » était utilisé à la fois pour les valeurs de décalage « X » et « Y » (la valeur « Y » donnée était ignorée). Cela signifie que l'exemple ci-dessus juxtaposera probablement de manière incorrecte les bordures inférieure et droite, dans les anciennes versions d'IM.
---|---
Version scriptéeCeci doit être réécrit en utilisant le dernier exemple comme gabarit Vous pouvez bien sûr faire tout ce qui précède en une seule commande. Mais faisons-le de manière scriptée. Cette version utilise du code en ligne pour générer des images de bordure appropriées à partir des images de base fournies, à l'aide de distorsions simples et de quelques roulements d'image randomisés pour améliorer l'aspect global de l'image juxtaposée. Ceux-ci peuvent être ajustés selon le type d'image de bordure d'encadrement fournie. Les images de bordure traitées sont ensuite juxtaposées en tuiles à l'aide d'une technique d'image en tuiles en mémoire, et le gabarit de cadre (généré) est utilisé pour masquer ces images, comme nous l'avons fait ci-dessus.
image=thumbnail.gif
image_w=`magick $image -format %w info:`
image_h=`magick $image -format %h info:`
top=goldthin_top.png
btm=goldthin_btm.png
width=`magick $top -format %h info:`
length=`magick $top -format %w info:`
# Taille de la nouvelle image ( en utilisant l'arithmétique entière de BASH )
new_size=$(($image_w+$width*2))x$(($image_h+$width*2))
# Options IM pour lire une version « roulée aléatoirement » des pièces de bordure
lft="( $top -roll +$(($RANDOM % $length))+0 -transpose )"
rht="( $btm -roll +$(($RANDOM % $length))+0 -transpose )"
# Options IM pour « rouler aléatoirement » les pièces du haut et du bas
top="( $top -roll +$(($RANDOM % $length))+0 )"
btm="( $btm -roll +$(($RANDOM % $length))+0 )"
# Encadrer l'image en une seule commande IM....
magick -page +$width+$width $image +page -alpha set \
\( +clone -compose Dst -bordercolor none -frame ${width}x$width+$width \
-fill none -draw "matte 0,0 replace" \
-flip -draw "matte 0,0 replace" -flip \) \
\( $top $btm -append -background none -splice 0x${image_h}+0+$width \
-write mpr:horz +delete -size $new_size tile:mpr:horz +size \
-clone 1 -compose DstOut -composite \) \
\( $lft $rht +append -background none -splice ${image_w}x0+$width+0 \
-write mpr:vert +delete -size $new_size tile:mpr:vert +size \
-clone 1 -compose DstIn -composite \) \
-delete 1 -compose Over -mosaic framed_script.png
Et voilà, nous avons une image parfaitement encadrée avec des jointures de coin à 45 degrés, avec des décalages de juxtaposition randomisés. Oui, c'est un exemple complexe. Mais c'est pour permettre l'utilisation des images en tuiles en mémoire, afin de pouvoir prétraiter les images d'encadrement, le tout en une seule commande. Cela le rend plus complexe mais aussi plus polyvalent. Le code ci-dessus a été intégré dans un script shell, que vous pouvez télécharger (« [frame_edges.tar.gz](../static/img/scripts/frame_edges.tar.gz) » depuis le répertoire IM Example Scripts). Ce fichier tar comprend le script et un ensemble d'images d'encadrement que le script sait traiter et utiliser. Il ajoute aussi une bordure de « carton » entre le cadre et l'image proprement dite.
Exemple à venir
Utiliser des bordures en tuiles avec des pièces de coin correspondantes. Les images de bordure devront correspondre à des pièces de coin préparées à l'avance, mais aussi se juxtaposer proprement sur la longueur fixe de l'image. Cela signifie que l'ensemble de la bordure juxtaposée pourra nécessiter un certain étirement ou une certaine compression afin d'aligner les tuiles de bordure avec ses pièces de coin. Pour fonctionner correctement, les tuiles de bordure doivent se répéter au moins 3 ou 4 fois sur la plus petite bordure de l'image. Un exemple de ce type de bordure/coin en tuiles est l'implémentation d'une bordure à effets de « feuilles » ou de « fleurs ».
![[IM Text]](../static/img/images/autumn_leaves.png)
![[IM Text]](../static/img/images/badge_overlay.png)
![[IM Text]](../static/img/images/badge_mask.png)
![[IM Text]](../static/img/images/badge_shading.png)
![[IM Image]](../static/img/images/blackthin_top.gif)
![[IM Image]](../static/img/images/blackthin_btm.gif)
![[IM Image]](../static/img/images/goldthin_top.png)
![[IM Image]](../static/img/images/goldthin_btm.png)
![[IM Image]](../static/img/images/bamboo.gif)