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

Exemples ImageMagick -- Divers

Exemples ImageMagick : préface et index
Interpolation (recherches de couleur inter-pixel)

Interpolation de pixels ou recherche de couleur inter-pixel

Le réglage « [-interpolate](https://imagemagick.org/command-line-options/#interpolate) » sert lorsqu'on recherche une couleur dans une image source, mais que ce « point de recherche » tombe entre les pixels de l'image source. Cela se produit dans diverses opérations d'image, comme « [-fx](https://imagemagick.org/command-line-options/#fx) » (opérateur d'effets spéciaux DIY) et « [-distort](https://imagemagick.org/command-line-options/#distort) » (opérateur de distorsion d'image généralisée), ainsi que d'autres opérateurs apparentés tels que les distorsions circulaires. Fondamentalement, l'« interpolation » indique à IM comment interpréter une recherche de couleur directe dans une image lorsque le point ne correspond pas exactement à un pixel réel de l'image, mais tombe dans l'espace entre les pixels. Par exemple, si vous recherchez la couleur à la position de pixel 3,4, vous devez obtenir la couleur exacte de ce pixel. Mais que doit renvoyer IM si vous recherchez la couleur d'une image au point 3.23,4.75 ? Devez-vous obtenir la couleur du pixel 3,4 ou celle de 3,5 ? Ou peut-être un mélange des couleurs des pixels environnants, et dans ce cas comment les couleurs doivent-elles être combinées ? L'interpolation de pixels définit ce qu'ImageMagick doit faire lorsqu'il recherche une couleur unique à une position en virgule flottante (en coordonnées de pixel). L'interpolation ressemble à certains égards au rééchantillonnage de pixels, comme celui que fournissent les filtres de rééchantillonnage. La différence essentielle est que le rééchantillonnage dispose d'une « échelle », d'une « aire » ou d'une « fenêtre » variable à partir de laquelle est renvoyée une couleur représentant tous les pixels de la zone. L'interpolation ne fait pas intervenir d'« échelle », seulement un unique « point » de recherche et une « aire » de taille fixe autour de ce point à partir de laquelle déterminer la couleur à utiliser en ce point. Bien sûr, la plupart des algorithmes de rééchantillonnage par aire tendent à dégénérer en une méthode interpolative lorsque l'aire de rééchantillonnage atteint une « fenêtre » de travail minimale, ce qui se produit naturellement lorsque les images sont agrandies ou suréchantillonnées. C'est pourquoi les filtres interpolés et les filtres de flou gaussien tendent à mieux fonctionner pour agrandir les images. L'interpolation est fondamentalement une forme inférieure d'échantillonnage, utilisée essentiellement lorsqu'on veut une réponse simple et rapide à la question « quelle couleur ? ».

Méthodes d'interpolation simples

Ce sont des méthodes simples et directes, qui essaient d'en faire le moins possible pour renvoyer une couleur à utiliser à partir d'une « interpolation ponctuelle ». Les plus simples, « Nearest » et « Integer », se contentent de choisir la couleur d'un seul pixel de l'image source, telle quelle, sans aucun mélange ni autre effet de fusion. Cela préserve les valeurs de couleur d'origine de l'image, mais au prix d'effets de crénelage et, généralement, d'un rendu peu lisse. Depuis IM v6.7.6-2, vous pouvez utiliser « Nearest » comme abréviation du réglage d'interpolation « Nearest-Neighbour ».
Les deux sont très semblables et ne diffèrent que par le pixel que la coordonnée de recherche extrait de l'image source. Concrètement, « Integer » arrondit simplement le point de recherche vers le bas pour sélectionner le pixel, ce qui produit une translation générale d'un demi-pixel vers la droite et vers le bas. On ne l'utilise généralement que pour une « mise à l'échelle » simplifiée de l'image source. En revanche, « Nearest » sélectionne le pixel le plus proche de la coordonnée de recherche en virgule flottante et produit ainsi un résultat plus correct. « Blend » fusionne (moyenne) les 1, 2 ou 4 pixels les plus proches selon leur distance au point d'échantillonnage. Le résultat est que la couleur du pixel d'origine est toujours présente, mais réduite de moitié, tandis qu'un damier de couleurs fusionnées remplit l'espace intermédiaire. (voir l'exemple ci-dessous) « Average » ne produit jamais réellement une correspondance de couleur exacte, mais mélange toujours les 4 pixels environnants pour produire une moyenne locale. Cela peut être utile dans les situations de recherche de couleur. « Average4 » peut aussi servir d'alias pour cette méthode d'interpolation. « Average9 » est similaire mais moyenne les 9 pixels les plus proches autour du point d'échantillonnage, produisant un résultat flou. « Average16 » moyenne les 16 pixels les plus proches autour du point d'échantillonnage, produisant un résultat extrêmement flou. Voici un récapitulatif des différentes méthodes d'interpolation simples, appliquées à l'agrandissement d'un petit groupe de pixels colorés ou d'un unique pixel blanc. L'image d'origine ressemble au résultat « Nearest », mais en beaucoup plus petit.
  for method in  integer nearest blend average average9 average16 ; do
    magick \( xc:red xc:blue +append \) \
            \( xc:yellow xc:cyan +append \) -append \
            -bordercolor black -border 1 \
            -filter point -interpolate $method \
            +distort SRT 20,0 ip_color_${method}.jpg
    magick xc: -bordercolor black -border 2 \
            -filter point -interpolate $method \
            +distort SRT 16,0 ip_pixel_${method}.jpg
  done

[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
Integer Nearest Blend Average Average9 Average16

| Avant IM v6.7.7-6, « Average » équivalait en réalité à ce qui est aujourd'hui « Average16 ». Les deux autres interpolateurs par moyenne, ainsi que « Blend » et « Background », ont été ajoutés à ce moment-là.
---|---
Une autre méthode d'interpolation simple est également proposée : « Background », qui renvoie simplement la couleur d'arrière-plan actuelle pour tout « échantillonnage » de l'image source. À bien des égards, c'est plutôt inutile, car on se retrouve généralement avec une simple image de couleur unie. Son usage principal est de vérifier des fonctions de rééchantillonnage plus complexes, comme un échec de rééchantillonnage, où le filtre de rééchantillonnage EWA (typiquement employé par l'opérateur de distorsion générale) se rabat sur une recherche interpolée lorsque le rééchantillonnage ne trouve aucun pixel dans son « support » ou aire de rééchantillonnage. En réglant l'interpolation sur « Background » et en choisissant une couleur d'arrière-plan bien voyante (comme « red »), vous pouvez ensuite repérer dans l'image obtenue les endroits où le rééchantillonnage a « échoué » ou a « manqué tous les pixels de l'image source » pour une raison ou une autre. Généralement à cause d'un réglage de support trop petit, ou en jouant avec les options de filtre expertes. AVENIR : une future option d'interpolation par sélection « aléatoire » sur l'aire interpolée est envisageable. Elle pourrait être utile pour des effets interpolés sophistiqués !

Bilinear

« Bilinear » (ou interpolation linéaire) est la méthode d'interpolation par défaut et probablement l'une des façons les plus simples d'obtenir un véritable résultat interpolé, en combinant les couleurs des pixels autour du point de recherche ou d'échantillonnage. Voici un schéma expliquant le fonctionnement d'une interpolation bilinéaire.

[diagram]

C'est-à-dire qu'elle relie simplement des lignes droites dans les directions orthogonales pour localiser la couleur du point d'échantillonnage donné. Le résultat est également équivalent à un filtre de rééchantillonnage triangulaire lorsqu'il est utilisé avec le redimensionnement. |

  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap  -fx 'v.p{i/(w-1),j/(h-1)}' \
          interpolate_bilinear.jpg

[IM Output]
|

  magick \( xc:white xc:black +append \) \
          \( xc:black xc:white +append \) -append \
          -size 100x100 xc: +swap -fx 'v.p{i/(w-1),j/(h-1)}' \
          interpolate_saddle.jpg

[IM Output]
Cette dernière image montre comment un dégradé linéaire se forme le long des bords entre les quatre points connus, puis comment un second dégradé linéaire se forme entre ces bords. Autrement dit, les couleurs entre les pixels environnants sont générées à l'aide de dégradés linéaires horizontal et vertical. Cela produit à son tour un dégradé bidimensionnel courbe, communément appelé « selle », en ce qu'il est relevé sur deux coins opposés et abaissé sur les deux autres. Vous pouvez même utiliser cette méthode pour générer plus directement un dégradé linéaire incliné à 45 degrés, mais cela demande de spécifier la couleur intermédiaire pour les coins diagonalement opposés. |

  magick \( xc:blue xc:navy +append \) \
          \( xc:navy xc:black +append \) -append \
          -size 100x100 xc: +swap -fx 'v.p{i/(w-1),j/(h-1)}' \
          interpolate_45linear.jpg

[IM Output]
L'aspect le plus important de cette méthode d'interpolation par défaut est que le pixel exactement au centre de l'image sera toujours une moyenne des quatre couleurs de coin, avec des dégradés linéaires parfaits sur les bords et une correspondance de couleur exacte aux coins.

Mesh

Le réglage « [-interpolate](https://imagemagick.org/command-line-options/#interpolate) » à « Mesh » est une variante de l'interpolation « [Bilinear](#bilinear) ». Alors que « Bilinear » produit une surface courbe tridimensionnelle, « Mesh » a été conçu pour diviser l'aire inter-pixel en deux surfaces triangulaires planes. La division de l'aire en deux triangles repose sur la diagonale reliant les deux couleurs de coin les plus « proches ». Pour les détails de l'algorithme « Mesh », voir l'article Image Interpolation by Pixel-Level Data-Dependent Triangulation.
Par exemple, réutilisons le même jeu de couleurs de coin qu'auparavant.
  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap   -interpolate Mesh \
          -fx 'v.p{i/(w-1),j/(h-1)}'    interpolate_tri-mesh.jpg

[IM Output]
Comme vous pouvez le voir, l'algorithme « Mesh » a produit presque exactement le même jeu d'interpolations de couleur que « [Bilinear](#bilinear) ». Mais si nous inversons les couleurs jaune et cyan… |

  magick \( xc:red xc:blue +append \) \
          \( xc:cyan xc:yellow +append \) -append \
          -size 100x100 xc: +swap   -interpolate Mesh \
          -fx 'v.p{i/(w-1),j/(h-1)}'    interpolate_tri-mesh2.jpg

[IM Output]
Cette fois, l'algorithme « Mesh » a décidé que les couleurs « blue » et « cyan » étaient les deux coins les plus proches et a créé un dégradé linéaire en diagonale entre ces deux coins. Le reste des couleurs forme alors un simple dégradé triangulaire plat depuis cette ligne vers les deux autres coins. Cela peut sembler une interpolation inhabituelle, mais la méthode garantit que les bords nets restent assez nets lorsque les images en couleur sont légèrement redimensionnées, pivotées ou cisaillées. De fait, une opération de redimensionnement adaptatif[-adaptive-resize](https://imagemagick.org/command-line-options/#adaptive-resize) ») exploite ce fait pour les petits redimensionnements afin de réduire le flou excessif du résultat. Par exemple, si nous avons un unique coin « blanc », « mesh » suppose qu'un bord a été trouvé et ajuste les couleurs interpolées pour faire ressortir ce bord. |

  magick \( xc:black xc:black +append \) \
          \( xc:white xc:black +append \) -append \
          -size 100x100 xc: +swap    -interpolate Mesh \
          -fx 'v.p{i/(w-1),j/(h-1)}'    interpolate_tri-mesh3.jpg

[IM Output]
Bien sûr, si les couleurs produisent un dégradé raisonnablement cohérent, l'interpolation « mesh » produit elle aussi un dégradé raisonnablement cohérent. |

  magick \( xc:blue xc:navy +append \) \
          \( xc:black xc:black +append \) -append \
          -size 100x100 xc: +swap    -interpolate Mesh \
          -fx 'v.p{i/(w-1),j/(h-1)}'    interpolate_tri-mesh4.jpg

[IM Output]
Comme vous pouvez le voir, le résultat est un dégradé assez satisfaisant, même si, en regardant attentivement, on distingue la jonction diagonale des deux triangles distincts. La transition n'est pas aussi lisse que le bilinéaire (qui n'est d'ailleurs pas parfaitement lisse non plus), mais ces méthodes ne cherchent pas non plus à préserver les bords nets dans les images redimensionnées ou distordues.

Catrom (Catmull-Rom)

Le réglage « [-interpolate](https://imagemagick.org/command-line-options/#interpolate) » à « Catrom » (généralement connu, de façon imprécise, sous le nom d'interpolation « BiCubic ») est plus complexe dans la détermination des couleurs d'une recherche ponctuelle. En gros, il ne se contente pas de regarder les couleurs aux coins de l'aire inter-pixel, mais va plus loin en examinant les couleurs au-delà de ces pixels les plus proches. Au total, 16 pixels dans une aire de 4x4 autour du point d'échantillonnage. Fondamentalement, il ajuste une courbe à l'ensemble de l'aire concernée afin de déterminer la meilleure couleur globale à utiliser. Voici un schéma qui explique probablement mieux le procédé…

[diagram]

Et voici les couleurs interpolées pour nos quatre couleurs standard. |

  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap   -interpolate Catrom \
          -fx 'v.p{i/(w-1),j/(h-1)}'    interpolate_catrom.jpg

[IM Output]
L'image ci-dessus peut ressembler beaucoup à une interpolation « [Bilinear](#bilinear) », mais le résultat présente une courbe de fusion plus lisse plutôt que des lignes droites pour produire la couleur interpolée. Ce que cette image ne montre pas, en revanche, c'est l'effet des autres pixels entourant nos quatre proches voisins. Pour cela, il faut examiner une aire un peu plus grande. Dans cet exemple précis (très petit), les pixels environnants sont contrôlés par le réglage pixel virtuel.

  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap -interpolate Catrom -virtual-pixel edge \
          -fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}'   interpolate_catrom_edge.jpg
  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap -interpolate Catrom -virtual-pixel White \
          -fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}'   interpolate_catrom_white.jpg
  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap -interpolate Catrom -virtual-pixel Black \
          -fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}'   interpolate_catrom_black.jpg

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

| Dans une image réelle, les effets des pixels virtuels n'affectent généralement que les résultats situés tout près des bords de l'image. Comme cette image ne fait que 2 pixels de large, l'exemple ci-dessus en est fortement affecté. Ce n'est pas le cas dans des images plus grandes et plus typiques.
---|---
Comme vous pouvez le voir, la courbe est fortement influencée par les couleurs environnantes, ce qui donne soit un changement de couleur très net et abrupt, soit un changement plus fondu défini par les couleurs environnantes. Vous pouvez toutefois constater aussi que de fortes variations dans les couleurs des pixels environnants peuvent produire de petites zones de la couleur inverse ou négative. Il s'agit d'un artéfact de rebond (ringing), que l'on n'observe typiquement que sur les bords extrêmement nets de couleurs complémentaires dans une image réelle. | _Cet effet de rebond sur des bords de couleur très très marqués peut être écrêté et produire une ligne de pixels affreux. On peut éviter ce problème en effectuant les redimensionnements et l'interpolation dans un espace colorimétrique autre que « RGB », comme les espaces « Lab » ou « Luv ».

Pour plus d'informations et d'exemples sur ce problème, voir Redimensionner dans l'espace colorimétrique LAB.

_
---|---
| _Notez que « BiCubic » (le filtre cubique interpolé) désigne une très grande famille de filtres et que son sens est de ce fait très imprécis. Il reste néanmoins disponible, mais son usage est déconseillé au profit de noms plus précis.

Depuis IM v6.7.7-7, « BiCubic » est simplement un alias de « Catrom », généralement considéré comme un bon « interpolateur cubique » (b=0, c=1/2). Vous devriez utiliser le nom « Catrom » plutôt que « BiCubic » afin qu'il soit clair ce que vous employez pour l'interpolation.

Avant IM v6.7.7-7, « BiCubic » utilisait en réalité un filtre « Cardinal Cubic » extrême (b=0, c=1) doté d'un effet de rebond négatif trop marqué. Il a été entièrement remplacé par « Catrom » et n'est plus disponible comme fonction d'interpolation.

Avant IM v6.3.5-3, « BiCubic » était implémenté comme un interpolateur cubique « Spline » très flou. Ce filtre a été renommé dans cette version d'ImageMagick. (voir ci-après)

_
---|---

Spline

La méthode d'interpolation « Spline », comme « [Catrom](#catrom) » ci-dessus, utilise elle aussi les 16 pixels les plus proches. Il s'agit toutefois d'une interpolation très floue, de type gaussien. |

  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap   -interpolate spline \
          -fx 'v.p{i/(w-1),j/(h-1)}'    interpolate_spline.jpg

[IM Output]
Comme vous pouvez le voir, les couleurs aux coins mêmes de l'interpolation « Spline » ci-dessus sont atténuées, car la surface interpolée ne passe pas réellement par la couleur d'origine de ces pixels. Elle est essentiellement trop « floutée » et se nomme plus exactement une surface « B-Spline ». Cette surface reste un type de filtre cubique (b=1, c=0), car elle est générée à l'aide d'une technique de courbes cubiques par morceaux. Cette courbe ne fait toutefois qu'approcher les couleurs d'origine des pixels, en particulier dans les zones de forts changements de couleur. Autrement dit, une recherche interpolée à une position de pixel entière exacte ne renverra pas la couleur réelle de ce pixel, mais un mélange flouté de sa couleur avec celles des pixels environnants. On considère souvent cela comme un défaut, mais cela peut servir de fonction de lissage générale. Comme « [Catrom](#catrom) », elle est également affectée par les pixels environnants.

  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap -interpolate Spline -virtual-pixel edge \
          -fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}'   interpolate_spline_edge.jpg
  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap -interpolate Spline -virtual-pixel White \
          -fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}'   interpolate_spline_white.jpg
  magick \( xc:red xc:blue +append \) \
          \( xc:yellow xc:cyan +append \) -append \
          -size 100x100 xc: +swap -interpolate Spline -virtual-pixel Black \
          -fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}'   interpolate_spline_black.jpg

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

| Dans une image réelle, les effets des pixels virtuels ne se manifestent qu'aux bords de l'image, des pixels réels entourant l'aire inter-pixel à partir de laquelle la recherche est effectuée.
---|---
On voit ici les effets de l'atténuation des couleurs qui résulte du mauvais ajustement des courbes « spline » aux couleurs des pixels. Il en découle généralement des bords plus flous pour les zones colorées et les lignes fines. En revanche, elles ne présenteront jamais l'effet de « rebond » négatif que peut donner une interpolation « [Catrom](#catrom) ».

Interpolation d'arrière-plan

Comme les effets de l'interpolation s'étendent souvent sur de plus grandes aires, voici un agrandissement des quatre principales méthodes d'interpolation avec des pixels environnants blancs ou noirs.

  for method in   bilinear mesh catrom spline  ; do
    for vpixel in   white black  ; do
      magick \( xc:red xc:blue +append \) \
              \( xc:yellow xc:cyan +append \) -append \
         -size 100x100 xc: +swap -interpolate $method -virtual-pixel $vpixel \
         -fx 'v.p{3*i/(w-1)-1, 3*j/(h-1)-1}' ip_area_${method}_$vpixel.jpg
    done
  done

[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output]
Bilinear Mesh Catrom Spline

Comme vous pouvez le voir, la couleur d'arrière-plan environnante n'a pas de réel effet sur les couleurs interpolées en « [bilinear](#bilinear) ». On dirait qu'elles sont simplement superposées à la couleur d'arrière-plan présente, quelle qu'elle soit. Vous pouvez toutefois voir comment « [mesh](#mesh) » génère des bords plus marqués et plus nets, mais peut décider d'inverser la diagonale selon la couleur environnante lorsqu'il intervient aux bords de l'image. Regardez la jonction entre le rouge et le bleu, entre les arrière-plans blanc et noir, pour observer cette « inversion ». La courbe interpolée de « [catrom](#catrom) » et « [spline](#spline) » est affectée par les pixels environnants, en particulier dans les cas de test faisant intervenir des couleurs absolues. Enfin, l'interpolation « [spline](#spline) » n'est en réalité qu'un flou de type gaussien appliqué à l'image (avec un sigma de 0.65). Un flou suffisant pour éliminer tout effet de « rebond » ou de crénelage, bien qu'il soit généralement trop flou pour la plupart des usages. Voir filtres gaussiens.

Interpolation d'une ligne pivotée

Je démontre ici les différentes méthodes d'interpolation en créant l'image d'une ligne verticale, puis en utilisant une distorsion affine pour faire pivoter la ligne de 17 degrés, avant d'agrandir la vue afin de laisser voir les pixels d'anticrénelage générés.

  magick -size 10x20 xc: -draw 'line 4,0 4,20' \
          -scale 50x100 ip_line_none.gif
  for method in integer nearest bilinear mesh catrom spline;  do
    magick -size 10x20 xc: -draw 'line 5,0 5,20' \
            -interpolate $method -filter point -distort SRT 17 \
            -scale 50x100 ip_line_${method}.gif
  done

[IM Output]
Sans rotation | | [IM Output]
Integer | [IM Output]
Nearest | [IM Output]
Bilinear | [IM Output]
Mesh | [IM Output]
Catrom | [IM Output]
Spline
---|---|---|---|---|---|---|---

Comme vous pouvez le voir, les méthodes de recherche de couleur directe « Interger » et « NearestNeighbor » produisent un résultat très crénelé, mais n'emploient que les couleurs d'origine présentes dans l'image. La principale différence entre les deux est que « Interger » tend à décaler l'image résultante d'un demi-pixel vers le bas et vers la gauche. « Bilinear », « Mesh » et « Catrom » produisent en général de très bons résultats, similaires entre eux (nous y reviendrons), le dernier donnant une ligne pivotée très nette. Chacune de ces méthodes est généralement considérée comme une bonne solution. Les méthodes d'interpolation « Spline » produisent un flou marqué des lignes fines afin de supprimer les effets de crénelage. Mais « Spline » tend à trop flouter les résultats et convient bien mieux au lissage des dégradés qu'aux lignes pivotées. Le réglage spécial « [-filter](#filter) point » de l'exemple ci-dessus sert à garantir que l'opérateur de distorsion n'utilise qu'une interpolation « ponctuelle » unique pour déterminer la couleur finale du pixel. Sans lui, un rééchantillonnage par aire serait utilisé à la place d'une recherche interpolée, ce qui produit d'ailleurs aussi de très bons résultats.
_Notez que je n'ai pas utilisé l'opérateur « [-rotate](https://imagemagick.org/command-line-options/#rotate) » pour ces exemples, car cet opérateur emploie une méthode de cisaillement de pixels pour faire pivoter les images. De ce fait, l'interpolation de pixels n'est pas utilisée.

Voir Faire pivoter une ligne fine pour un exemple d'utilisation de l'opérateur « [-rotate](https://imagemagick.org/command-line-options/#rotate) » ainsi employé, et les effets qui en résultent au niveau des pixels.

Mise à jour : depuis IMv6.7.3-4, l'opérateur rotate utilise désormais en interne l'opérateur de distorsion, de sorte que ce qui précède n'est peut-être plus vrai.

_
---|---

Interpolation d'un bord pivoté

Les résultats diffèrent légèrement lorsque c'est le bord d'une zone qui est distordu, plutôt qu'une simple ligne de pixels.

  magick -size 10x20 xc: -draw 'rectangle 0,0 4,19' \
          -scale 50x100 ip_edge_none.gif
  for method in  integer nearest bilinear mesh catrom spline; do
    magick -size 10x20 xc: -draw 'rectangle 0,0 4,19' \
            -interpolate $method -filter point  -distort SRT -17 \
            -scale 50x100 ip_edge_${method}.gif
  done

[IM Output]
Sans rotation | | [IM Output]
Integer | [IM Output]
Nearest | [IM Output]
Bilinear | [IM Output]
Mesh | [IM Output]
Catrom | [IM Output]
Spline
---|---|---|---|---|---|---|---

Ce qui précède parle généralement de lui-même. « Bilinear » et « Mesh » produisent des bords raisonnablement nets pour les rotations courantes, tandis que « Catrom » donne un bord plus net dans l'image distordue. « Spline », en revanche, produit des bords plus flous. La différence entre « Bilinear » et « Mesh » est extrêmement mineure dans les cas ci-dessus. Les deux méthodes ne génèrent vraiment de différences visibles que dans les cas d'agrandissement extrême pendant l'opération de distorsion. Autrement, vous ne verrez que de légers changements d'intensité des pixels, à peine perceptibles.


Pixels virtuels : recherche de couleur hors image

De nombreux opérateurs ont souvent besoin de rechercher des couleurs qui tombent hors des limites de l'image proprement dite. C'est le cas des opérateurs de flou d'image, de distorsion d'image générale, des opérateurs de morphologie et de convolution, de l'opérateur de distorsion générale et même du très ancien opérateur d'implosion. Quelle couleur faut-il alors renvoyer si vous demandez un pixel en -22,-3 ? Un tel pixel n'existe pas réellement, mais la valeur de couleur renvoyée peut avoir des répercussions considérables sur l'effet global de votre traitement d'image, en particulier sur les couleurs des pixels proches du bord réel de l'image. Le réglage « [-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) » définit ce qu'IM doit renvoyer lorsqu'on accède à un pixel situé hors des limites normales de l'image. [IM Output] Par exemple, nous utilisons ici l'opérateur FX DIY « [-fx](https://imagemagick.org/command-line-options/#fx) » pour « rechercher » et afficher tous les pixels de la petite image et de ses alentours, afin de voir ce que renvoie le réglage « [-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) » par défaut. |

  magick -size 70x70 xc:  tree.gif \
                  -fx 'v.p[-19,-19]'  virtual_default.gif

[IM Output]
Le réglage « [-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) » « Edge » renvoie la couleur du pixel réel le plus proche de l'emplacement « virtuel » demandé, autrement dit la couleur du « bord » le plus proche. Cette fois, j'utiliserai une distorsion d'image avec viewport plus rapide pour montrer les pixels virtuels environnants, plutôt que l'opérateur FX beaucoup plus lent. La méthode de distorsion « SRT 0 » ne distord pas réellement l'image résultante ; elle se contente de regarder quels pixels l'opérateur d'image voit effectivement, en particulier les pixels « virtuels » entourant l'image source. |

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Edge -filter point   -distort SRT 0 \
          +repage  virtual_edge.gif

[IM Output]
Le réglage de pixel virtuel « Edge » est le réglage par défaut ; ce qui précède devrait donc être identique à l'exemple précédent. Ce réglage a généralement l'impact le plus minime (en termes d'effets de bord) lors du traitement des images, ce qui explique aussi pourquoi il a été choisi comme réglage par défaut. C'est particulièrement important lors de l'utilisation du flou ou d'autres opérateurs de morphologie et de convolution qui exploitent un « voisinage » de pixels pour le traitement. Il importe de noter que la couleur du pixel de coin finit par remplir complètement les zones diagonalement adjacentes entourant l'image réelle. Ainsi, un unique pixel de coin peut avoir un effet important sur diverses transformations d'image. Cet effet de « coin » est particulièrement visible lorsqu'on floute des images. Le réglage VP « Tile » est très utile pour générer les effets de bord du traitement d'image en les faisant se replier autour des limites de l'image, et pour le garantir. |

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Tile  -filter point  -distort SRT 0 \
          +repage virtual_tile.gif

[IM Output]
Cela vous permet de garantir que les images sur lesquelles vous travaillez restent « carrelables », ou le deviennent davantage à mesure que l'image est modifiée. Pour d'autres exemples, voir Modifier des images en tuiles. « Mirror » est très similaire à « [tile](#tile) » et peut convenir mieux que le « [edge](#edge) » par défaut pour certains effets. |

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Mirror -filter point   -distort SRT 0 \
          +repage virtual_mirror.gif

[IM Output]
C'est particulièrement utile pour réduire l'effet de bord et de coin des images que l'on floute. Mais cela peut aussi produire d'autres effets. | _Jusqu'à IM v6.5.0-1, seules les images directement attenantes à l'image d'origine étaient reflétées. Les autres copies virtuelles, plus éloignées de l'original, restaient non reflétées (motif de tuiles normal). Cela a été corrigé, de sorte que tout l'espace de canevas virtuel est désormais correctement carrelé en miroir, et pas seulement les copies virtuelles voisines.

Cela ne devient important que lorsqu'on utilise le carrelage en miroir avec l'opérateur de distorsion générale pour refléter en tuiles une très grande aire, comme lorsqu'on regarde des horizons lointains_
---|---
« Transparent » renvoie simplement la couleur transparente pour les pixels situés hors des limites réelles de l'image. |

  magick tree.gif -alpha set  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Transparent  -filter point  -distort SRT 0 \
          +repage virtual_trans.gif

[IM Output]
L'opérateur Alpha « set » ci-dessus est nécessaire pour garantir que l'image possède un canal de détourage (matte) ou alpha, afin que la couleur transparente s'y applique correctement. Sans ce réglage, ce qui précède pourrait renvoyer une couleur « noire » au lieu de transparente, car la couleur « none » (ou « noir totalement transparent ») est la couleur transparente par défaut. Par exemple, je désactive ici par erreur la transparence… |

  magick tree.gif  -alpha off  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Transparent -filter point  -distort SRT 0 \
          +repage virtual_trans2.gif

[IM Output]
Le réglage « Transparent » est particulièrement utile pour les distorsions d'image, où l'image distordue sera ensuite « superposée » pour composer de plus grandes images. Par exemple, les cubes affines 3D et les boîtes en perspective 3D. Les réglages « white », « gray » et « black » sont semblables au réglage « Transparent » précédent. Ils se contentent de renvoyer cette couleur précise pour tout pixel qui sort des limites. |

  magick tree.gif  -alpha off  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel White -filter point  -distort SRT 0 \
          +repage virtual_white.gif

[IM Output]
|

  magick tree.gif  -alpha off  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Gray -filter point  -distort SRT 0 \
          +repage virtual_gray.gif

[IM Output]
|

  magick tree.gif  -alpha off  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Black -filter point  -distort SRT 0 \
          +repage virtual_black.gif

[IM Output]
Si vous voulez toute autre couleur unie, vous devez définir cette couleur dans le réglage « [-background](https://imagemagick.org/command-line-options/#background) » et utiliser un réglage « [-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) » « Background ». |

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Background -background coral \
          -filter point -distort SRT 0     +repage virtual_bgnd.gif

[IM Output]

Le réglage VP « HorizontalTile » a été ajouté dans IM v6.4.2-6 comme une forme particulière de carrelage utile pour les distorsions « [Arc](distorts.html#arc) » et « [Polar](distorts.html#polar) » sur 360 degrés complets. L'image n'est carrelée qu'horizontalement, tandis que les pixels virtuels au-dessus et en dessous des tuiles sont définis à partir de la couleur « [-background](https://imagemagick.org/command-line-options/#background) » actuelle. |

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel HorizontalTile  -background coral \
          -filter point -distort SRT 0     +repage virtual_horizontal.gif

[IM Output]
Cela vous permet de garantir que les images transformées restent « carrelables » horizontalement. Pour d'autres exemples, voir Modifier des images en tuiles. Le « HorizontalTileEdge » (ajouté dans IM v6.5.0-1) carrelle lui aussi l'image horizontalement à travers l'espace virtuel, mais réplique les pixels du bord latéral sur les autres parties de l'espace de canevas virtuel. |

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel HorizontalTileEdge  -background coral \
          -filter point -distort SRT 0     +repage virtual_horizontal_edge.gif

[IM Output]
Ces deux méthodes VP ont été ajoutées pour mieux gérer les distorsions « [Arc](../static/img/distorts#arc) » et « [Polar](../static/img/distorts#polar) » en cercle complet, où l'image encerclée « s'enroule » et se rejoint bout à bout.
De même, le réglage VP « VerticalTile » (également ajouté dans IM v6.4.2-6, par souci d'exhaustivité) ne carrelle l'image que verticalement, la couleur « [-background](https://imagemagick.org/command-line-options/#background) » actuelle servant à remplir les côtés de l'image. |

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel VerticalTile  -background coral \
          -filter point -distort SRT 0     +repage virtual_vertical.gif

[IM Output]
Le « VerticalTileEdge » a été ajouté dans IM v6.5.0-1 et réplique les pixels du bord latéral sur le reste de l'espace de canevas virtuel. |

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel VerticalTileEdge  -background coral \
          -filter point -distort SRT 0     +repage virtual_vertical_edge.gif

[IM Output]
Dans IM v6.5.0-1, « CheckerTile » a été ajouté pour carreler une image comme si l'on remplissait un damier. Les autres cases sont simplement remplies avec la couleur d'arrière-plan (qui peut être transparente). |

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel CheckerTile  -background coral \
          -filter point -distort SRT 0     +repage virtual_checker.gif

[IM Output]
En rendant l'arrière-plan transparent et en superposant cette image à une autre image entièrement carrelée de même taille, vous pouvez combiner les deux carrelages pour produire un damier entrelaçant les deux images. |

  magick -size 96x96 tile:balloon.gif \
          \( tree.gif -alpha set  -set option:distort:viewport 96x96 \
             -virtual-pixel CheckerTile  -background none \
             -filter point -distort SRT 0 \) \
          -flatten  virtual_checker_2.gif

[IM Output]

Il existe aussi quelques réglages « [-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) » plus inhabituels. « random » se contente de choisir au hasard un pixel de l'image à utiliser. |

  magick tree.gif  -set option:distort:viewport 70x70-19-19 \
          -virtual-pixel Random -filter point   -distort SRT 0 \
          +repage virtual_random.gif

[IM Output]
On l'utilise souvent avec « [-blur](https://imagemagick.org/command-line-options/#blur) » pour générer une couleur moyenne d'image, grossière et marbrée, dans les effets de bord qui en résultent. Notez que la valeur du pixel n'est pas constante et produira un effet différent à chaque recherche, voire à chaque exécution de l'opération, à moins de fournir une graine initiale au générateur de nombres aléatoires via « [-seed](https://imagemagick.org/command-line-options/#seed) ». C'est particulièrement fâcheux avec le traitement d'image par convolution ou morphologie, car chaque recherche le long du bord de l'image contribuera une valeur différente, même si c'est la même recherche de pixel qui est utilisée. J'ai toutefois trouvé le motif aléatoire très bon pour générer un horizon en perspective, car le motif donne un résultat plus flou à mesure qu'on s'approche de l'horizon. Ce flou confère à la texture aléatoire résultante une profondeur qui ne serait pas visible autrement avec une simple couleur unie.
« dither » renvoie en revanche un motif de couleurs à tramage ordonné basé sur les pixels situés à moins de 32x32 pixels de la position demandée. Cela signifie qu'une fois passés au-delà de 32 pixels de l'image, le résultat n'est de nouveau que la couleur du pixel de coin de l'image. C'est un peu une fusion entre « [edge](#edge) » et « [random](#random) ». |

  magick tree.gif  -set option:distort:viewport 120x120-44-44 \
          -virtual-pixel Dither -filter point  -distort SRT 0 \
          +repage virtual_dither.gif

[IM Output]
Ci-dessus, on voit que le jaune du soleil, dans un coin de cette image de 32x32 pixels, parvient à être sélectionné jusqu'au coin inférieur droit lointain, mais pas au-delà. C'est là la limite du « voisinage » de 32 pixels pour la sélection des couleurs par tramage ordonné. Si cette image était plus grande, la couleur jaune du soleil n'atteindrait pas les autres coins. Ce motif n'est pas « aléatoire » et produira toujours le même résultat pour la même image. Vous pouvez le voir comme une forme plus ordonnée du VP « [random](#random) » à proximité de l'image, mais dont l'effet se rapproche davantage de « [edge](#edge) » une fois que l'on traite au-delà de 32 pixels de l'image proprement dite.

Pixels virtuels et infinis

Vous pouvez voir bien plus clairement les effets de « [-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) » dans les résultats de l'opérateur de distorsion générale, et surtout avec une distorsion en perspective, qui permet de créer une vue distordue s'étirant vers une distance infinie. Par exemple, je montre ici les résultats d'un réglage « [-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) dither » sur une vue en perspective de l'arbre. Cela montre comment ce réglage peut affecter les pixels renvoyés jusqu'à l'infini.

  magick tree.gif -mattecolor DodgerBlue   -virtual-pixel dither \
          -set option:distort:viewport  150x100-50-50 \
          -distort perspective '0,0 9,0  31,0 38,0  0,31 0,18  31,31, 40,18' \
          perspective_dither.gif

[IM Output]

Essayez ce qui précède avec d'autres réglages « [-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) » pour mieux comprendre leur fonctionnement. On trouvera d'autres exemples dans Regarder des horizons lointains. Notez que le « ciel » de la vue ci-dessus est en réalité généré par le réglage « [-mattecolor](https://imagemagick.org/command-line-options/#mattecolor) », que distort utilise pour représenter les zones « non valides », en l'occurrence le « ciel » d'une distorsion en perspective. Il ne provient pas du réglage « [-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) ».

Couleurs des pixels virtuels

Aucune des méthodes « [-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) » ne renvoie réellement une couleur différente ou composite de celles déjà présentes dans l'image, sauf si cette couleur a été spécifiquement demandée via l'une des méthodes de couleur unie : « [background](#background) », « [transparent](#transparent) », « [background](#background) », « [black](#black) », « [white](#white) », « [gray](#gray) ». Autrement dit, aucune couleur nouvelle n'est jamais générée, même si une couleur précise peut être ajoutée (deux pour l'opérateur de distorsion générale). Bien sûr, si les pixels demandés font l'objet d'une interpolation de pixels ou d'un rééchantillonnage par aire, comme dans la vue distordue en perspective ci-dessus, ces méthodes peuvent fusionner les couleurs renvoyées selon le réglage « [-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) » choisi.

Effets des pixels virtuels sur les opérateurs

J'explore ici les effets du réglage « [-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) » avec divers opérateurs. « [-blur](https://imagemagick.org/command-line-options/#blur) »… |

  magick -size 70x70 xc:lightblue  -fill black -draw 'circle 35,65 25,55' \
          -virtual-pixel edge   -blur 0x8     vp_blur.png

[IM Output]
|

    magick -size 70x70 xc:lightblue  -fill black -draw 'circle 35,65 25,55' \
            -virtual-pixel mirror  -blur 0x8  vp_blur_2.png

[IM Output]
Notez, dans ce qui suit, comment l'image peut être contaminée d'un côté à l'autre en utilisant « [-blur](https://imagemagick.org/command-line-options/#blur) » avec le réglage « [-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) » à « tile ». Bien sûr, si l'image était carrelable au départ, cela peut être souhaité. |

  magick -size 70x70 xc:lightblue  -fill black -draw 'circle 35,65 25,55' \
          -virtual-pixel tile  -blur 0x8  vp_blur_3.png

[IM Output]
Définir une couleur précise pour le « [-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) » de l'image ouvre des effets et des possibilités très intéressants. |

  magick -size 70x70 xc:lightblue  -fill black -draw 'circle 35,65 25,55' \
          -virtual-pixel background  -background blue \
          -blur 0x8     vp_blur_4.png

[IM Output]
|

  magick -size 70x70 xc:lightblue  -fill black -draw 'circle 35,65 25,55' \
          -virtual-pixel transparent  -channel RGBA  -blur 0x8 \
          -background red  -flatten       vp_blur_5.png

[IM Output]
Remarquez comment l'arrière-plan « red » que j'ai placé derrière l'image est visible sur les bords, là où l'image floutée résultante a fait usage des pixels virtuels qui entourent les pixels réels de l'image. « [-gaussian](https://imagemagick.org/command-line-options/#gaussian) » donne fondamentalement les mêmes résultats que « [-blur](https://imagemagick.org/command-line-options/#blur) », ce qui se comprend puisqu'ils sont mathématiquement identiques. |

  magick -size 70x70 xc:lightblue  -fill black -draw 'circle 35,65 25,55' \
          -virtual-pixel background   -background blue \
          -gaussian 0x8     vp_gaussian.png

[IM Output]
« [-radial-blur](https://imagemagick.org/command-line-options/#radial-blur) » (en réalité un flou rotationnel), en revanche, produit des effets de bordure plus intéressants… |

  magick -size 70x70 xc:lightblue \
     -virtual-pixel background  -background blue \
     -radial-blur 0x30    vp_radial.png

[IM Output]
Ce dernier, avec le « bord transparent » par défaut, génère probablement un bord lisse lorsqu'on l'emploie avec des angles de flou radial plus grands. Il peut produire une image de « vignette » ou de bordure douce plus propre que d'autres techniques. Voir Bords doux et flous pour des exemples d'utilisation de cet effet. Notez que « [-motion-blur](https://imagemagick.org/command-line-options/#motion-blur) » peut être très fortement affecté par les effets de bord. | Cela est aggravé par le fait que « [-motion-blur](https://imagemagick.org/command-line-options/#motion-blur) » ne comprend pas actuellement l'usage de « [-channel](https://imagemagick.org/command-line-options/#channel) » pour limiter ses effets à des canaux précis.
---|---
|

  magick -size 70x70 xc:none  -virtual-pixel edge \
     -fill yellow  -stroke red  -strokewidth 3 -draw 'circle 45,55 35,45' \
     -channel RGBA -motion-blur 0x12+65  vp_motion.png

[IM Output]
|

  magick -size 70x70 xc:none  -virtual-pixel transparent  \
     -fill yellow  -stroke red  -strokewidth 3  -draw 'circle 45,55 35,45' \
     -channel RGBA -motion-blur 0x12+65  vp_motion_2.png

[IM Output]
|

  magick -size 70x70 xc:none  -virtual-pixel background -background blue \
     -fill yellow  -stroke red  -strokewidth 3  -draw 'circle 45,55 35,45' \
     -channel RGBA -motion-blur 0x12+65  vp_motion_3.png

[IM Output]

Effets d'implosion des pixels virtuels

Voici quelques exemples plus intéressants d'implosions de grandes valeurs diverses (>1.0) utilisant différents réglages « -virtual-pixel ».

  for v in edge tile mirror dither random gray; do
    for i in 2 5 10 50 500; do \
      magick koala.gif -virtual-pixel $v \
              -implode $i  implode_${v}_${i}.gif
    done
  done

Implode Edge Tile Mirror Dither Random Gray
2 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
5 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
10 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
50 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
500 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

La nature « pointillée » des résultats ci-dessus découle directement de l'« échantillonnage interpolé » direct qu'emploie l'opérateur « -implode ». Voir Recherche interpolée directe. Cela pourrait changer dans une future version d'IM, en utilisant le rééchantillonnage par aire. Pour l'instant, il vous faudra recourir à une technique de suréchantillonnage pour améliorer les résultats. Le réglage « edge » est le réglage le plus courant et celui utilisé par défaut, afin d'éviter la plupart des effets étranges. Les autres (à l'exception de « background ») produisent essentiellement un motif répliqué à partir des pixels existants de l'image, et les effets sont très variables. Notez aussi que l'argument exige une augmentation exponentielle de sa valeur pour des augmentations d'effet similaires. En outre, pour des arguments supérieurs à environ 200, un cercle noir peut apparaître au centre de l'image résultante. Cela est dû à l'atteinte de la limite mathématique de l'ordinateur. Employer de telles grandes valeurs est un effet que nous vous déconseillons d'utiliser.


Taches aléatoires de couleur unie

En floutant un canevas « plasma:fractal », puis en réduisant les couleurs à des valeurs très faibles, vous pouvez produire des images simples contenant des zones aléatoires de couleurs différentes. Les résultats varient toutefois beaucoup selon le nombre final de couleurs demandé et le réglage pixel virtuel (voir plus haut). J'avais deux choix pour l'image aléatoire initiale de cette expérience : une image plasma fractale et une image de bruit aléatoire. L'image aléatoire produit, par nature, une image qui (avec un réglage « [-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) » à « tile ») permet de créer une image plus facilement carrelable, tandis que l'image plasma tend à donner des bords rectangulaires à ses taches de couleur. En revanche, l'image plasma produit d'assez jolies taches, ou blobs, aux couleurs pastel, alors que l'image aléatoire tend à produire d'affreuses nuances de gris moyen. C'est pourquoi j'ai choisi d'utiliser l'image plasma pour ces expériences.

  magick -size 80x80 plasma:fractal -normalize   spot_start.gif
  #magick -size 80x80 xc: +noise Random  \
  #        -virtual-pixel tile  -blur 0x5  -normalize  spot_start.gif

  for n in 2 3 4 5; do
    for v in  edge mirror tile white black; do
      magick spot_start.gif -virtual-pixel $v -blur 0x10 \
              +dither -colors $n  spot${n}_${v}.gif
    done
  done

Num Colors Edge Mirror Tile White Black
2 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
3 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
4 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
5 [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

Les trois premières images ont des effets très spécifiques sur la façon dont les « taches » de couleur interagissent avec les bords de l'image. « Edge » et « Mirror » tendent à faire rejoindre les bords aux couleurs selon des angles de 90 degrés. Un réglage « Random » ou « Dither » rattache les blobs de couleur aux bords de l'image de manière semblable mais plus marquée, tous deux introduisant en outre des effets de bord nets près des bords de l'image. Un second cycle flou-quantification peut être nécessaire pour nettoyer et lisser les bords des taches. Le réglage « Tile » tend à laisser les taches s'enrouler autour de l'image. Mais comme l'image source plasma n'est pas elle-même carrelable, le résultat est un changement de couleur général près du bord rectangulaire. Si l'on utilisait comme source l'image aléatoire carrelable, les taches de couleur ignoreraient complètement les bordures de l'image. En utilisant un réglage de pixel virtuel d'arrière-plan « White » ou « Black », les taches de couleur tendent à se centrer dans l'image proprement dite. La réussite de ce « centrage » dépend du degré de différence entre l'image aléatoire d'origine et la « couleur d'arrière-plan » utilisée. La taille du « [-blur](https://imagemagick.org/command-line-options/#blur) » influe essentiellement sur la taille et la douceur des blobs. Un petit flou produit de nombreuses petites taches ; un grand flou, comme celui utilisé ci-dessus, produit une seule tache de couleur plus circulaire.
Vous pouvez aussi produire un jeu de couleurs et d'interactions tout à fait différent en utilisant un autre espace colorimétrique de quantification des couleurs. Par exemple, je reprends ici le dernier exemple ci-dessus (réduction à 5 couleurs), mais avec des espaces colorimétriques « [-quantize](https://imagemagick.org/command-line-options/#quantize) » plus inhabituels pour la sélection des couleurs. (Voir Quantification des couleurs et espace colorimétrique)

Color Space Edge Mirror Tile White Black
RGB [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
YIQ [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
HSL [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
XYZ [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
OHTA [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

Rappelez-vous que toutes les images ci-dessus ont été générées à partir de la même image source aléatoire. Les différents effets que vous voyez résultent de manières différentes de réduire le nombre de couleurs de l'image. Vous pouvez constater que le réglage « [-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) », qui définit quelles couleurs de pixel le flou perçoit dans les zones au-delà des limites de l'image, a une forte influence sur la forme des zones de couleur.


Utilisation des arguments d'Annotate

IM version 6 a introduit une nouvelle option en ligne de commande pour le dessin de texte, « [-annotate](https://imagemagick.org/command-line-options/#annotate) », qui contourne l'ancienne méthode « [-draw](https://imagemagick.org/command-line-options/#draw) » pour utiliser directement l'API Annotate(). Cela apporte quelques nouvelles fonctionnalités aux utilisateurs de la ligne de commande. Pour cet exemple, je choisis la police Arial Black, pour son lettrage droit, afin que la rotation soit bien nette. |

    magick -font ArialB -pointsize 24 -gravity center \
            -size 55x55 xc:white -annotate 0x0+0+0 'Text' \
            annotate_source.jpg

[IM Output]
Le format de cette option est…

**-annotate {_SlewX_}x{_SlewY_}+{_X_}+{_Y_} 'Text String' **

Les décalages X et Y ci-dessus correspondent à la position, influencée par la gravity, du texte annoté à dessiner. En revanche, SlewX et SlewY représentent une forme de rotation. Si ces deux valeurs sont identiques, une rotation normale est effectuée. Mais si elles diffèrent, des effets très intéressants peuvent en résulter…

[IM Output]

Comme vous pouvez le voir, certains arguments n'ont abouti à aucun texte dessiné, essentiellement lorsque le texte aurait été dessiné entièrement sur une seule ligne. C'est attendu. Vous pouvez toutefois constater que l'on peut dessiner le texte retourné verticalement, retourné horizontalement, pivoté, mis en italique, de toutes les manières possibles. Un opérateur d'image des plus utiles.


Splice : création d'un nouvel opérateur d'image

Juste après la première sortie d'ImageMagick version 6, une discussion s'est développée en réponse à une question. La question portait sur l'ajout d'espace supplémentaire (lignes et colonnes) au milieu d'une image. L'exemple ci-dessous est l'ensemble complexe de commandes issu de cette discussion, faisant appel à la puissante magie d'IM version 6, et détaillant exactement ce qu'il fallait faire. C'est de cet exemple qu'est né l'opérateur « [-splice](https://imagemagick.org/command-line-options/#splice) » (pour les détails, voir les exemples dans Insérer et découper des lignes et des colonnes dans les images). Cette ligne de commande constitue donc les opérations qui définissent cette nouvelle commande, et les deux devraient fonctionner exactement de la même façon. |

  magick rose: -size 20x10 xc:blue   -background blue \
          \( -clone 0  -crop 40x0 +repage +clone -insert 1 +append \) \
          -swap 0,-1 +delete +repage \
          \( -clone 0  -crop 0x30 +repage +clone -insert 1 -append \) \
          -delete 0 -delete 0 +repage  splice_rose_seq.gif

[IM Output]
Ci-dessus, nous découpons la rose en de nombreuses tranches verticales, puis nous insérons une image d'espacement dans cette séquence avant de toutes les reconcaténer. En somme, nous avons ajouté une colonne verticale de pixels dans l'image de la rose. Puis, en remplaçant notre image d'origine par la version modifiée, nous avons répété les mêmes opérations, mais horizontalement. Un petit nettoyage des images de travail et c'est terminé. Cet exemple a aussi mis en évidence auprès de la liste de diffusion l'utilité du nouveau traitement ordonné de la ligne de commande et des opérations de séquence d'images d'ImageMagick version 6. Dans les anciennes versions d'IM, cela aurait exigé un grand nombre de commandes séparées et d'images temporaires pour obtenir le même résultat.


Border, Frame et l'usage de BorderColor

Un débat existe : « [-bordercolor](https://imagemagick.org/command-line-options/#bordercolor) » ne devrait servir qu'à ajouter une bordure aux images avec « [-border](https://imagemagick.org/command-line-options/#border) » ou « [-frame](https://imagemagick.org/command-line-options/#splice) ». Autrement dit, beaucoup d'utilisateurs estiment qu'il ne devrait pas servir à définir l'arrière-plan derrière des images comportant de la transparence. Par exemple, sous IM, ceci règle les zones transparentes de l'image star sur « [-bordercolor](https://imagemagick.org/command-line-options/#bordercolor) » et ignore complètement le réglage de couleur « [-background](https://imagemagick.org/command-line-options/#background) ». |

  magick star.gif -bordercolor LimeGreen   -background Gold \
                   -border 10       star_border.gif

[IM Output]
La principale raison pour laquelle « [-bordercolor](https://imagemagick.org/command-line-options/#bordercolor) » sert à définir l'arrière-plan des images transparentes est qu'ainsi « magick montage » rend bien lorsqu'on lui fournit un ensemble quelconque d'images pouvant contenir des transparences, avec un minimum de réglages de la part de l'utilisateur. |

    magick montage star.gif  -frame 6  -geometry '64x64+5+5>' star_montage.gif

[IM Output]
Si la transparence était préservée, les résultats « magick montage » ci-dessus seraient loin d'être aussi réussis. Cela ne veut pas dire que vous ne pouvez pas préserver la transparence des images en utilisant les opérateurs « [-border](https://imagemagick.org/command-line-options/#border) » ou « [-frame](https://imagemagick.org/command-line-options/#splice) ». Cela signifie simplement qu'il faut fournir un réglage « [-compose](https://imagemagick.org/command-line-options/#compose) » supplémentaire pour indiquer à IM de préserver la transparence. |

  magick star.gif  -bordercolor LimeGreen \
          -compose Copy  -border 10   star_border_copy.gif
  magick montage star.gif  -bordercolor LimeGreen \
          -compose Copy -background None    -frame 6 \
          -geometry '64x64+0+0>'   star_montage_copy.gif

[IM Output]
[IM Output]
Pour plus d'informations sur la préservation de l'arrière-plan transparent d'une image lors de l'ajout d'un « [-border](https://imagemagick.org/command-line-options/#border) » ou d'un « [-frame](https://imagemagick.org/command-line-options/#splice) », voir ajouter des bordures, et pour « magick montage », voir exemples de gestion de l'arrière-plan et de la transparence dans montage. Une alternative proposée consistait à régler, dans ces opérateurs, l'arrière-plan de la zone d'image sur la couleur « [-background](https://imagemagick.org/command-line-options/#background) », mais cela nuirait à son usage dans « magick montage ». Vous pouvez bien sûr toujours supprimer la transparence de l'image vous-même, avant d'ajouter toute bordure ou tout cadre supplémentaire. Dans ce cas, l'usage de « -compose Copy » devient sans objet. |

  magick montage star.gif -background Gold -alpha remove \
          -frame 6  -geometry '64x64+5+5>' -size 16x16 \
          -bordercolor LimeGreen  -background SeaGreen \
          star_montage_texture.gif

[IM Output]
Il est simplement bien plus facile d'utiliser un réglage « [-compose](https://imagemagick.org/command-line-options/#compose) » pour préserver la transparence, plutôt que de laisser la bordure la préserver au risque de causer d'autres problèmes. Ce n'est peut-être pas évident pour les nouveaux utilisateurs, mais c'est précisément l'objet de ces pages d'exemples.


Test des opérateurs de liste

Toutes les commandes suivantes devraient produire exactement la même image, mais chaque image est produite d'une façon légèrement différente, illustrant les nouveaux opérateurs de liste d'images d'IM version 6. |

  magick eye.gif news.gif  storm.gif  +append  list_test_01.gif

[IM Output]
|

  magick \( \) eye.gif news.gif  storm.gif  +append  list_test_02.gif

[IM Output]
|

  magick eye.gif news.gif  storm.gif \( \) +append  list_test_03.gif

[IM Output]
|

  magick \( eye.gif news.gif  storm.gif \) +append  list_test_04.gif

[IM Output]
|

  magick \( eye.gif news.gif  storm.gif  +append \) list_test_05.gif

[IM Output]
|

  magick eye.gif \( news.gif storm.gif +append \) +append list_test_06.gif

[IM Output]
|

  magick \( eye.gif news.gif +append \) storm.gif +append  list_test_07.gif

[IM Output]
|

  magick \( storm.gif -flop \) \( news.gif -flop \) \( eye.gif -flop \) \
          +append -flop  list_test_08.gif

[IM Output]
|

  magick \( eye.gif -rotate 90 \) \( news.gif  -rotate 90 \) \
          \( storm.gif -rotate 90 \) -append  -rotate -90   list_test_09.gif

[IM Output]
|

  magick eye.gif tree.gif news.gif storm.gif   -delete 1 \
          +append list_test_10.gif

[IM Output]
|

  magick eye.gif tree.gif news.gif storm.gif  -delete -3 \
          +append list_test_11.gif

[IM Output]
|

  magick eye.gif news.gif storm.gif tree.gif   +delete \
          +append list_test_12.gif

[IM Output]
|

  magick news.gif storm.gif eye.gif  +insert  +append list_test_13.gif

[IM Output]
|

  magick eye.gif storm.gif news.gif  -insert 1  +append list_test_14.gif

[IM Output]
|

  magick news.gif eye.gif storm.gif   -swap 0,1  +append list_test_15.gif

[IM Output]
|

  magick storm.gif news.gif eye.gif   -swap 0  +append list_test_16.gif

[IM Output]
|

  magick eye.gif storm.gif news.gif   +swap  +append list_test_17.gif

[IM Output]
|

  magick eye.gif storm.gif news.gif   \( -clone 1 \) \
          -delete 1   +append list_test_18.gif

[IM Output]
|

  magick eye.gif -negate \( +clone -negate \) news.gif  storm.gif \
          -delete 0   +append list_test_19.gif

[IM Output]
|

  magick storm.gif news.gif eye.gif \( -clone 2,1,0 \) \
          -delete 2,1,0   +append  list_test_20.gif

[IM Output]
|

  magick storm.gif news.gif eye.gif \( -clone 2-0 \) \
          -delete 0-2   +append  list_test_21.gif

[IM Output]
|

  magick {balloon,medical,present,shading}.gif  -delete 0--1 \
          {eye,news,storm}.gif   +append  list_test_22.gif

[IM Output]
|

  magick balloon.gif -delete 0,0,0,0,0,0,0,0,0 \
          eye.gif news.gif  storm.gif  +append  list_test_23.gif

[IM Output]
|

  magick eye.gif balloon.gif news.gif storm.gif \
          -delete 1,1,1,1,1   +append  list_test_24.gif

[IM Output]
|

  magick {balloon,medical,present,shading}.gif {eye,news,storm}.gif \
          -delete 0--4   +append   list_test_25.gif

[IM Output]
|

  magick eye.gif news.gif storm.gif \
          -delete 0--4   +append   list_test_26.gif

[IM Output]
|

  magick storm.gif news.gif eye.gif -reverse +append  list_test_27.gif

[IM Output]