Exemples ImageMagick -- Déformation des images
- Exemples ImageMagick : préface et index
- Déformation simple d'images (réorganiser l'ordre des pixels)
- Retournement et miroir des images
- Transposition et transversale, en diagonale
- Rotations rectangulaires
- Défilement des images (comme un mauvais téléviseur)
-
Rotation des images (rotations d'image simples)
- Cisaillement des images (déplacement linéaire)
-
Ondulation des images (déplacement en sinusoïde)
- Explosion des images
-
Animations (exemples ludiques) Dans cette section, nous allons examiner les opérateurs de déformation et de distorsion d'images généraux et plus simples fournis par ImageMagick. C'est une façon de vous mettre en appétit pour les distorsions plus avancées et complexes que nous verrons dans les sections suivantes.
Déformation simple d'images
Les opérateurs de déformation simple d'images se contentent de réorganiser les pixels de l'image. Le nombre de pixels, et même la taille de l'image, restent inchangés. La caractéristique essentielle est que l'image ne perd aucune information ; elle est simplement réorganisée et pourrait très facilement être ramenée à son état normal sans aucune perte de qualité (à l'exception de la compression avec perte de type JPEG lors de l'enregistrement). Fondamentalement, elle ne fait que réorganiser les pixels, sans détruire, écraser, copier, fusionner les couleurs ni modifier autrement le contenu de l'image d'origine. Elle ne fait que déplacer la position des pixels au sein de l'image.
Retournement et miroir
Pour ces exemples, utilisons cette adorable image de koala. La distorsion d'image la plus simple consiste à réorganiser les pixels de l'image afin de la retourner de haut en bas avec « -flip ». |
magick koala.gif -flip flip.gif
![[IM Output]](../static/img/warping/flip.gif)
Ou bien, en utilisant « -flop », vous pouvez générer une image miroir. |
magick koala.gif -flop flop.gif
![[IM Output]](../static/img/warping/flop.gif)
| Avant IM v6.6.6-5, ni l'opérateur « [-flip](https://imagemagick.org/command-line-options/#flip) » ni l'opérateur « [-flop](https://imagemagick.org/command-line-options/#flop) » ne modifiaient le décalage du canevas virtuel de l'image, par rapport à un canevas virtuel plus grand qui pouvait être présent
---|---
Transposition et transversale, en diagonale
Les opérations d'image « -transpose » et « -transverse » produisent des miroirs diagonaux de l'image. « -transpose » applique un miroir le long de la diagonale allant du coin supérieur gauche au coin inférieur droit de l'image. |
magick koala.gif -transpose transpose.gif
![[IM Output]](../static/img/warping/transpose.gif)
Tandis que « -transverse » applique un miroir le long de la diagonale allant du coin inférieur gauche au coin supérieur droit de l'image. |
magick koala.gif -transverse transverse.gif
![[IM Output]](../static/img/warping/transverse.gif)
| Avant IM v6.6.6-5, ni l'opérateur « [-transpose](https://imagemagick.org/command-line-options/#transpose) » ni l'opérateur « [-transverse](https://imagemagick.org/command-line-options/#transverse) » ne modifiaient le décalage du canevas virtuel de l'image, par rapport à un canevas virtuel plus grand qui pouvait être présent
---|---
Rotations rectangulaires
Les quatre types d'opérations présentés ci-dessus produisent essentiellement une image miroir de l'original. L'opérateur « -rotate » fournit les autres versions non inversées de l'image, y compris l'image d'origine elle-même.
magick koala.gif -rotate 0 rotate_0.gif
magick koala.gif -rotate 90 rotate_90.gif
magick koala.gif -rotate 180 rotate_180.gif
magick koala.gif -rotate -90 rotate-90.gif
magick koala.gif -rotate 360 rotate_360.gif
Notez que « -rotate » n'est une distorsion simple que si vous utilisez un angle de rotation multiple de 90 degrés. Tout autre angle introduit dans l'image des distorsions plus complexes au niveau des pixels. Voir Rotation ci-dessous. |
Vous remarquerez peut-être qu'un angle de rotation positif correspond au sens horaire, ce qui peut sembler logiquement incorrect. En interne toutefois, c'est mathématiquement correct : cela vient de l'utilisation d'un axe Y inversé. Autrement dit, l'axe Y part de 0 en haut et devient positif vers le bas. De ce fait le système de coordonnées est inversé, et l'angle de rotation est donc lui aussi inversé sur le plan mathématique. |
|---|---|
Les photos numériques peuvent également être pivotées pour correspondre à l'orientation de l'appareil photo enregistrée, à l'aide de l'opérateur « -auto-orient ». Cela a été ajouté dans IM v6.2.7-8. |
|
| --- | --- |
Défilement des images à la manière d'un mauvais téléviseur
Vous pouvez également faire défiler « -roll » une image horizontalement (comme un téléviseur désynchronisé). La quantité de défilement (le déplacement de l'image) est indiquée en pixels. |
magick koala.gif -roll +0+20 roll_horiz.gif
![[IM Output]](../static/img/warping/roll_horiz.gif)
Vous pouvez bien sûr aussi faire défiler l'image latéralement. |
magick koala.gif -roll +30+0 roll_vert.gif
![[IM Output]](../static/img/warping/roll_vert.gif)
Ou bien, en utilisant un nombre de pixels négatif, vous pouvez la faire défiler dans la direction opposée. |
magick koala.gif -roll +0-20 roll-horiz.gif
![[IM Output]](../static/img/warping/roll-horiz.gif)
Les défilements sont particulièrement importants pour les images en mosaïque, car ils repositionnent l'origine de la tuile sans détruire la « capacité de mise en mosaïque » des images. C'est d'ailleurs exactement ce que définit le réglage « -tile-offset » : la quantité de défilement à appliquer à une image en mosaïque lorsqu'elle est lue par l'option « -tile ».
Résumé de la déformation simple d'images
L'aspect le plus important de tous ces opérateurs est que vous pouvez les combiner de très nombreuses façons de sorte que le résultat soit exactement le même que si aucune opération n'avait été effectuée. |
magick koala.gif -roll +25+0 -rotate 90 -flop \
-roll +0-25 -flip -rotate 90 original.gif
Rotation et cisaillement
Alors que les opérateurs de distorsion simple (ci-dessus) préservent la taille et les couleurs de l'image, l'ensemble suivant ne le fait pas. Les résultats de ces opérateurs ne tiennent pas dans la taille d'origine, ni même dans la grille matricielle d'origine de l'image.
Rotation des images -- rotation d'image simple
Comme vous l'avez vu ci-dessus, l'opérateur « -rotate » peut effectuer des distorsions simples et préservant l'image lorsque vous la faites pivoter par unités de 90 degrés. Avec d'autres angles cependant, l'image pivotée ne tiendra pas correctement dans une image rectangulaire. Par conséquent, pour garantir qu'aucune donnée d'image n'est perdue, la taille de l'image finale est agrandie juste assez pour accueillir l'image pivotée. |
magick koala.gif -rotate 30 rotate.jpg
![[IM Output]](../static/img/warping/rotate.jpg)
Notez que le sens de rotation est le sens horaire. Cela peut sembler illogique sur le plan mathématique, jusqu'à ce que vous réalisiez que le système de coordonnées de l'image est relatif au coin supérieur gauche de l'image, au lieu de la norme mathématique du coin inférieur gauche. Il en résulte que l'angle de rotation est l'opposé de celui auquel vous pourriez logiquement vous attendre. C'est un point important à garder à l'esprit lorsqu'on manipule toute forme de rotation d'image, par comparaison avec une rotation mathématique. L'espace supplémentaire ajouté par ImageMagick est coloré avec le réglage de couleur « -background » courant. Cela vous permet de spécifier la couleur qui remplira les coins. |
magick koala.gif -background lightskyblue -rotate 30 rotate_color.png
![[IM Output]](../static/img/warping/rotate_color.png)
Bien sûr, si vous souhaitez remplir avec une couleur transparente, vous devrez vous assurer que l'image peut gérer la transparence (en activant et en ajoutant un canal alpha), et qu'elle est enregistrée dans un format d'image capable de gérer la transparence. |
magick koala.gif -alpha set -background none -rotate 30 rotate_trans.png
![[IM Output]](../static/img/warping/rotate_trans.png)
Si l'espace supplémentaire apparaît en noir, c'est que le format de votre image de sortie n'autorise pas l'utilisation d'un canal alpha (très probablement le format JPEG), de sorte que la transparence prend par défaut la couleur noire. | Avant la version 6.1.2, « -rotate » ne gérait pas correctement la transparence, produisant des bandes noires et transparentes dans les coins de l'image pivotée. La solution de contournement à ce problème était plutôt complexe, car elle impliquait de faire pivoter le canal alpha séparément des couleurs.
---|---
Mais que faire si vous ne voulez pas de cet espace supplémentaire et souhaitez préserver la taille d'origine de l'image ? Eh bien, vous pouvez utiliser un « -crop » centré pour ramener l'image à sa taille d'origine. Si vous ne connaissez pas la taille d'origine, vous pouvez recourir à une astuce de composition alpha (voir la méthode de composition « [Src](compose.html#src) ») pour restaurer l'image à sa taille d'origine. |
magick koala.gif -alpha set \( +clone -background none -rotate 30 \) \
-gravity center -compose Src -composite rotate_resized.png
![[IM Output]](../static/img/warping/rotate_resized.png)
L'opérateur « -rotate » comprend également deux indicateurs supplémentaires. Si un symbole « > » est ajouté à l'argument de rotation (avant ou après le nombre), l'image ne sera pivotée que si elle est plus large que haute. Autrement dit, « 90> » ne fera pivoter que les images de style « paysage » (larges) en images de style « portrait » (hautes), de sorte que toutes les images soient de style « portrait ». L'autre indicateur, « < », fait l'inverse : il ne fait pivoter que les images plus hautes que larges. Par exemple, « 90< » garantit que toutes les images sont en « paysage ». Une autre utilisation de cet indicateur consiste à faire pivoter les images « portrait » et « paysage » de quantités différentes. C'est-à-dire que vous pouvez simplement donner deux opérations « -rotate » différentes afin d'incliner les « portraits » dans une direction et les « paysages » dans une autre. Les photos numériques peuvent également être pivotées pour correspondre à l'orientation de l'appareil photo (d'après les métadonnées EXIF de l'image) à l'aide de l'opérateur « -auto-orient ». Rappelez-vous cependant qu'un réenregistrement au format JPEG n'est peut-être pas une bonne idée.
Fonctionnement interne de l'opérateur Rotate
Depuis IMv6.7.3-4, l'opérateur Rotate utilise désormais l'opérateur Distort et la distorsion Scale-Rotate-Translate (SRT). Voici la rotation plus directe qui s'appuie sur la distorsion SRT sous-jacente. |
magick koala.gif -virtual-pixel background -background lightskyblue \
-distort SRT 30 +repage rotate_srt.jpg
![[IM Output]](../static/img/warping/rotate_srt.jpg)
Ou bien en utilisant la version « + » de l'opérateur de distorsion pour ajuster la taille du canevas. |
magick koala.gif -virtual-pixel background -background lightskyblue \
+distort SRT 30 +repage rotate_srt2.jpg
![[IM Output]](../static/img/warping/rotate_srt2.jpg)
L'opérateur de distorsion générale offre de nombreux autres réglages, pour des choses comme le positionnement exact du centre de rotation, la mise à l'échelle, le contrôle des filtres, la taille de l'image de sortie, ainsi que des réglages pour la superposition d'images, que l'opérateur Rotate, plus simple, ne fournit pas. Avant IMv6.7.3-4, l'opérateur Rotate était implémenté à l'aide de distorsions de rotation simples à 90° suivies de trois cisaillements d'image, une technique connue sous le nom de « rotation par cisaillement » (Rotate by Shear, RBS). Une technique publiée pour la première fois dans des articles de recherche par Alan Paeth. Malheureusement, comme elle nécessite 3 opérations de cisaillement distinctes, on obtient des effets de flou très variables et importants, en particulier lors du cisaillement de lignes fines, ce qui explique pourquoi la rotation est désormais implémentée à l'aide de Distort. Vous pouvez constater les effets néfastes de ce procédé dans les animations de rotation ci-dessous. La fonction de bibliothèque qui réalisait les rotations par « cisaillements » est toujours disponible dans l'API, mais n'est plus accessible depuis la ligne de commande, à moins d'effectuer vous-même les cisaillements. Voir l'opérateur Shear ci-dessous pour tous les détails de la technique. Pour une compréhension plus approfondie des divers algorithmes de rotation d'image, de leur fonctionnement et des problèmes qu'ils posent, voir Leptonica Rotation. Ainsi que les exemples utilisés dans les techniques générales de distorsion.
Cisaillement des images -- déplacement linéaire
L'opérateur « -shear » prend chaque ligne (ou colonne) de pixels et la fait glisser, de sorte que chaque ligne (ou colonne) soit déplacée d'une même quantité par rapport à la ligne (ou colonne) voisine. Ses deux arguments sont exprimés en angles. Tout comme avec « -rotate », l'opération augmente la taille de l'image résultante afin de ne perdre aucune information. Le cisaillement est toutefois plus complexe, car il s'agit en réalité d'une double opération.
magick koala.gif -background Blue -shear 20 shear_rot.gif
magick koala.gif -background Blue -shear 20x0 shear_x.gif
magick koala.gif -background Blue -shear 0x50 shear_y.gif
magick koala.gif -background Blue -shear 20x50 shear_xy.gif
magick koala.gif -background Blue -shear 20x0 -shear 0x50 shear_xy2.gif
magick koala.gif -background Blue -shear 0x50 -shear 20x0 shear_yx.gif
Si vous examinez les résultats, vous verrez qu'un « -shear » complet X-Y (quatrième image) équivaut en fait à effectuer d'abord le cisaillement X, suivi du cisaillement Y (avec un rognage approprié de l'image), comme le montre la cinquième image, c'est-à-dire l'avant-dernière. Notez que l'ordre des cisaillements produit des résultats différents. Si un seul nombre est fourni (sans « x » dans l'argument, comme dans la première image), alors « -shear » l'appliquera à la fois dans les directions X et Y, comme une sorte de rotation du pauvre. Le réglage de couleur « -background » est bien sûr utilisé comme couleur pour l'espace supplémentaire ajouté. |
magick koala.gif -background none -shear 30 shear_trans.png
![[IM Output]](../static/img/warping/shear_trans.png)
| Avant la version IM 6.1.2, « -shear » ne gérait pas la transparence. La solution de contournement à ce problème était plutôt complexe, car elle impliquait de cisailler le canal alpha séparément des couleurs.
---|---
Notez qu'utiliser « -shear » de cette manière n'est pas une méthode correcte pour faire pivoter une image. Pour utiliser réellement le cisaillement afin de faire pivoter correctement une image, vous devriez effectuer plusieurs opérations de cisaillement sous la forme « -shear {X}x{Y} -shear {X}x0 -crop ... », mais déterminer les valeurs appropriées de « {X} », « {Y} » et du rognage final nécessite un peu de trigonométrie. L'« opérateur Rotate » était d'ailleurs autrefois implémenté de cette façon, et la fonction de l'API qui le fait est toujours disponible, mais plus depuis la ligne de commande. | Notez qu'un cisaillement dans la direction X n'affectera pas la hauteur d'une image, tandis qu'un cisaillement dans la direction Y n'affectera pas sa largeur. Il en résulte que la surface couverte par un objet quelconque dans l'image ne changera pas (seul change le conteneur environnant qui abrite l'image).
---|---
| _L'opérateur Shear est implémenté comme une « déformation » directe (distorsion des pixels des seules lignes et colonnes individuelles) de l'image source. Par conséquent, il n'utilise ni le réglage d'interpolation ni le réglage de pixel virtuel.
De ce fait, les zones ajoutées à l'image ne sont remplies que par la couleur « -background » courante, et aucune méthode n'est fournie pour préserver les couleurs d'origine de l'image._
---|---
Pour une méthode alternative permettant l'utilisation des filtres d'image, de l'interpolation et des pixels virtuels, voir la distorsion affine. Pour des informations sur l'utilisation des matrices affines afin d'implémenter des cisaillements, voir le cisaillement affine. Aucune de ces deux méthodes ne permet toutefois de spécifier les cisaillements à l'aide d'arguments d'angle.
Cube isométrique à l'aide de cisaillements
Bien que les cisaillements ne soient pas les opérateurs les plus agréables ni les plus simples à utiliser, cela ne signifie pas que vous ne pouvez pas réaliser des choses élaborées avec eux. Voici un exemple d'utilisation de « -shear » pour créer un cube isométrique. |
# Créer quelques images carrées pour le cube
magick logo: -resize 256x256^ -gravity center -extent 256x256 top.jpg
magick ../img_photos/pagoda_sm.jpg -resize 256x256 left.jpg
magick ../img_photos/mandrill_orig.png -resize 256x256 right.jpg
# cisaillement de l'image du dessus.
magick top.jpg -resize 260x301! -alpha set -background none \
-shear 0x30 -rotate -60 -gravity center -crop 520x301+0+0 \
top_shear.png
# cisaillement de l'image de gauche
magick left.jpg -resize 260x301! -alpha set -background none \
-shear 0x30 left_shear.png
# cisaillement de l'image de droite
magick right.jpg -resize 260x301! -alpha set -background none \
-shear 0x-30 right_shear.png
# les combiner.
magick left_shear.png right_shear.png +append \
\( top_shear.png -repage +0-149 \) \
-background none -layers merge +repage \
-resize 30% isometric_shears.png
# nettoyage
rm -f top.jpg left.jpg right.jpg
rm -f top_shear.png left_shear.png right_shear.png
![[IM Output]](../static/img/warping/isometric_shears.png)
Ce qui précède a été développé à partir d'un exemple de batch Windows similaire de Wolfgang Hugemann ImageMagick@Hugemann.de, tiré de sa contribution Using IM under Windows aux exemples IM. Notez que les images ci-dessus ne sont PAS correctement jointes. Elles devraient utiliser la composition Plus Alpha, mais utilisent over à la place. Pour plus d'informations, voir Aligner deux images masquées. En conséquence, vous pouvez rencontrer des problèmes pour aligner correctement les trois images, ce qui produit des espaces ou des chevauchements d'images. Comme le positionnement est limité à des valeurs entières, ce problème peut être particulièrement gênant. Utiliser une taille bien plus grande avec des coordonnées plus faciles à gérer, et truquer un peu les calculs, peut aider dans ce cas. Une fois les images fusionnées, réduire le résultat à sa taille finale affinera et corrigera les légers défauts d'alignement le long des jointures. Un autre exemple similaire, mais utilisant les distorsions affines et une composition alpha correcte, est Cubes 3D par superposition affine. Une méthode qui simplifie grandement le traitement d'image nécessaire pour générer des cubes comme ci-dessus.
Ondulation des images - déplacement en sinusoïde
L'opérateur « -wave » ressemble à « -shear » en ce qu'il ajoute un « déplacement linéaire » aux images. Cependant, cet opérateur ne déplace verticalement les colonnes de pixels que selon une fonction sinusoïdale. L'opérateur « -wave » prend deux arguments. Le premier est la hauteur maximale, ou amplitude, du déplacement des pixels vers le haut ou vers le bas, tandis que le second est la longueur d'onde de la fonction sinusoïdale, exprimée en pixels. |
magick koala.gif -background Blue -wave 10x64 wave.jpg
![[IM Output]](../static/img/warping/wave.jpg)
Notez que, comme les pixels peuvent être déplacés jusqu'à l'amplitude donnée, cet espace supplémentaire sera toujours ajouté en haut comme en bas de l'image, même s'il n'est pas réellement nécessaire. Par exemple, en ajustant les arguments de sorte que la longueur d'onde soit le double de la largeur de l'image, vous pouvez transformer l'image en un arc. |
magick koala.gif -background Blue -wave 20x150 arched.jpg
![[IM Output]](../static/img/warping/arched.jpg)
Dans ce genre de cas, l'espace inutilisé peut être supprimé à l'aide d'une opération « -chop », « -shave » ou éventuellement même « -trim ». Nettoyons l'exemple précédent en utilisant une amplitude négative pour retourner l'arc, et « -chop » pour supprimer l'espace inutilisé ajouté par l'opérateur « -wave ». |
magick koala.gif -background Blue -wave -20x150 \
-gravity South -chop 0x20 arched_2.jpg
![[IM Output]](../static/img/warping/arched_2.jpg)
Bien sûr, le réglage de couleur « -background » peut être utilisé pour définir l'espace supplémentaire ajouté à l'image. |
magick koala.gif -alpha set -background none -wave 10x75 wave_trans.png
![[IM Output]](../static/img/warping/wave_trans.png)
Comme vous pouvez le constater d'après les exemples ci-dessus, « -wave » ne s'applique que dans la direction verticale, ou « Y ». Si vous voulez ajouter une onde dans la direction X, vous devrez faire pivoter l'image avant et après avoir appliqué l'onde. |
magick koala.gif -rotate -90 -background Blue -wave -10x75 \
-rotate +90 wave_y.jpg
![[IM Output]](../static/img/warping/wave_y.jpg)
Cette technique peut servir à ajouter un motif ondulé ou une vibration à une image sous n'importe quel angle. Des exemples en sont donnés dans la police Vibrato et dans la police Smoking. Une autre limitation de « -wave » est que l'onde commence toujours à zéro. C'est-à-dire que la colonne la plus à gauche n'est pas déplacée, tandis que les quelques rangées suivantes sont déplacées vers le bas (direction X positive), à moins que vous ne donniez une amplitude négative pour un décalage vertical initial. Fondamentalement, l'opérateur « -wave » ne permet pas (à l'heure actuelle) de spécifier un décalage pour le début de la fonction sinusoïdale. Cela peut toutefois être corrigé en ajoutant, puis en supprimant, un décalage d'image à l'aide de « -splice ». |
magick koala.gif -splice 19x0+0+0 -background Blue -wave 10x75 \
-chop 19x0+0+0 wave_offset.jpg
![[IM Output]](../static/img/warping/wave_offset.jpg)
Bien que « -wave » n'utilise pas le réglage de pixel virtuel courant pour définir la couleur des zones ajoutées, il tiendra compte du réglage d'interpolation courant pour mapper les couleurs de la source vers l'image générée. Cela signifie que l'onde aura tendance à flouter légèrement les pixels en bandes verticales sur toute l'image.
Distorsions circulaires
Jusqu'à présent, les distorsions d'image ont été plutôt douces, avec très peu d'étirement, d'expansion ou de compression des données de l'image. Autrement dit, les données restent à peu près inchangées. Les quelques opérateurs d'image suivants peuvent produire une image si déformée que l'image d'origine ne peut plus être reconnue. Les couleurs sont tordues en un fouillis flou. Il se trouve également qu'ils limitent les effets de distorsion à une zone circulaire, avec peu ou pas de distorsion de l'image d'origine sur les bords du rectangle de l'image. Cela signifie que vous pouvez utiliser ces opérateurs sur une zone plus petite à l'aide de l'opérateur Region, et que le résultat se fondra tout de même dans l'image d'origine sans donner l'impression d'avoir été : découpé, déformé, puis recollé à sa place. Autrement dit, ces opérateurs sont connus comme des distorsions « locales », car ils peuvent servir à déformer de plus petites zones d'une image.
Implosion des images
L'opérateur « -implode » déforme l'image de manière à attirer tous les pixels vers le centre. C'est un peu comme si l'on plantait un aspirateur, ou un « trou noir », au centre de l'image et que l'on aspirait les pixels vers lui. La prudence est toutefois de mise : commencez par n'utiliser que de très petites valeurs, puis augmentez-les lentement jusqu'à obtenir le résultat souhaité. La plupart des utilisateurs novices ont tendance à employer une valeur trop grande et sont déçus par le résultat. Par exemple, voici une implosion d'image typique. |
magick koala.gif -implode .6 implode.gif
![[IM Output]](../static/img/warping/implode.gif)
En utilisant des valeurs de plus en plus grandes, vous aspirerez essentiellement tous les pixels du cercle dans le néant. |
magick koala.gif -implode 5 implode_big.gif
![[IM Output]](../static/img/warping/implode_big.gif)
Attention cependant : l'utilisation d'une valeur « -implode » supérieure à « 1.0 » est également affectée par le réglage de pixel virtuel, car l'algorithme commence à faire des références de couleur au-delà des limites de l'image elle-même. Comme le réglage « -virtual-pixel » par défaut est « edge », la couleur du bord ou le cadre entourant une image peut avoir un effet majeur sur le résultat. Par exemple, ces deux images sont identiques, à ceci près que l'une s'est vu ajouter une bordure blanche. Cela montre en substance la zone qui utilise des couleurs cherchées au-delà des limites de l'image proprement dite. La zone normalement définie par le réglage « -virtual-pixel ». |
magick rose: -gravity center -crop 46x46+0+0 +repage \
-implode 3 implode_rose.gif
magick rose: -gravity center -crop 44x44+0+0 +repage \
-bordercolor white -border 1 -implode 3 implode_rose_2.gif
![[IM Output]](../static/img/warping/implode_rose_2.gif)
L'utilisation de réglages de pixel virtuel différents, tels que « [Background](misc.html#background) », produira le même effet que l'ajout d'une « -border », mais sans agrandir l'image. D'autres réglages de pixel virtuel peuvent produire des effets bien plus intéressants dans la région centrale implosée. Par exemple, un réglage « [Tile](misc.html#tile) » peut ajouter des copies fortement déformées de l'image. Par exemple, j'implose ici une simple image de boîte à l'aide de ce réglage. |
magick -size 94x94 xc:red -bordercolor white -border 3 \
-virtual-pixel tile -implode 4 implode_tiled_box.gif
![[IM Output]](../static/img/warping/implode_tiled_box.gif)
D'autres effets de « -virtual-pixel » sont explorés dans Effets d'implosion des pixels virtuels. À mesure que le nombre de pixels implosés dans une petite zone augmente et que la taille du paramètre d'implosion devient très grande, les résultats commencent à prendre un aspect « pixellisé ». Pour obtenir un résultat meilleur et plus régulier, vous pouvez augmenter le nombre de pixels avec lesquels l'implosion travaille, à l'aide d'une technique appelée suréchantillonnage. Fondamentalement, en utilisant une image plus grande (en agrandissant l'image source si nécessaire), en appliquant la distorsion, puis en réduisant le résultat à sa taille finale, vous produirez un bien meilleur résultat. |
magick -size 94x94 xc:red -bordercolor white -border 3 \
-virtual-pixel tile -resize 400% -implode 4 -resize 25% \
implode_tiled_ss.gif
![[IM Output]](../static/img/warping/implode_tiled_ss.gif)
Comme vous pouvez le voir, vous obtenez un résultat bien plus lisse et plus réaliste, qui montre bien mieux les détails internes de la distorsion. Cependant, même le suréchantillonnage finit par échouer sur des images extrêmes comme celle-ci, car il fait intervenir des infinis. Si vous regardez attentivement, vous verrez qu'un aspect « pointillé » réapparaît, mais uniquement plus près du centre. En utilisant une « -border » plus grande autour de l'image à imploser, puis en la retirant à nouveau, vous pouvez également déformer les bords d'une image vers l'intérieur, en direction du centre. |
magick koala.gif -bordercolor blue -border 20x20 \
-implode .5 -shave 18x18 implode_border.jpg
![[IM Output]](../static/img/warping/implode_border.jpg)
Depuis la version IM 6.2.1, vous pouvez également utiliser une bordure transparente, ou une image comportant de la transparence. |
magick koala.gif -bordercolor none -border 20x20 \
-implode .5 -shave 18x18 implode_border_trans.png
Explosion des images
En utilisant une valeur négative avec l'opérateur « -implode », vous pouvez faire exploser l'image. Cela ressemble toutefois davantage à un agrandissement du centre de l'image, poussant tous les pixels de rayon intermédiaire vers les bords, qu'à une véritable explosion. |
magick koala.gif -implode -2 explode.jpg
![[IM Output]](../static/img/warping/explode.jpg)
L'utilisation d'une valeur plus grande agrandira essentiellement les pixels les plus centraux de l'image en un cercle dont la taille correspond aux deux tiers de la plus petite dimension de l'image. |
magick koala.gif -implode -30 explode_big.jpg
![[IM Output]](../static/img/warping/explode_big.jpg)
Et voici une version « suréchantillonnée ». |
magick koala.gif -resize 400% -implode -30 \
-resize 25% explode_big_ss.jpg
![[IM Output]](../static/img/warping/explode_big_ss.jpg)
La couleur centrale de l'« explosion » interne est définie par la couleur du centre de l'image (ou de la région). Cela signifie qu'en changeant les couleurs autour de ce point avant l'explosion, vous pouvez contrôler un effet de « flash » de l'explosion. Voir les animations ci-dessous pour un exemple animé de ce contrôle des couleurs. Pour un autre exemple d'images implosées, voir les contributions de l'utilisateur hh sur Flickr.
Tourbillons d'image
L'opérateur « -swirl » agit comme un batteur à pâtisserie. Il déformera l'image en la faisant tourner en cercle du nombre de degrés que vous lui donnez en argument. |
magick koala.gif -swirl 180 swirl.jpg
![[IM Output]](../static/img/warping/swirl.jpg)
En ajoutant une bordure et en combinant avec « -implode », vous pouvez donner l'aspect d'un tourbillon aspirant l'image dans le néant. |
magick koala.gif -bordercolor white -border 20x20 \
-swirl 180 -implode .3 -shave 20x20 whirlpool.jpg
![[IM Output]](../static/img/warping/whirlpool.jpg)
La nature essentielle de cette distorsion est que l'image se retrouve pivotée en son centre de l'angle que vous spécifiez, tandis que le bord circulaire (comme avec l'opérateur Implode ci-dessus) reste inchangé. Il n'existe pour l'instant aucun paramètre permettant de spécifier un « rayon interne » afin de limiter le tourbillon à un anneau, plutôt qu'à un disque complet. J'ai animé ces effets de tourbillon, que vous pouvez voir ci-dessous dans les animations.
Animations (exemples ludiques)
Pour terminer, générons quelques animations GIF de certaines de ces distorsions. Pour celles-ci, j'ai créé quelques scripts shell simples permettant de générer l'image animée, que vous pouvez aussi télécharger et manipuler avec vos propres images de test. Cela m'amène à un point important. Si vous générez une série d'images à l'aide de ces distorsions, il vaut mieux toujours déformer à partir de l'image de départ d'origine, plutôt que de déformer l'image de manière incrémentale, encore et encore. C'est particulièrement vrai pour les images pivotées, où le résultat présente un certain flou, minime pour chaque opération individuelle ; mais si vous le faites encore et encore, voici le résultat. Tous les scripts utilisent une technique de « commande "magick" générée » pour créer l'animation. C'est-à-dire qu'un script shell crée une seule longue commande, qui est ensuite exécutée. Cela évite d'avoir à générer des fichiers temporaires, mais peut compliquer le débogage. Une autre solution consiste à utiliser une méthode connue sous le nom de flux d'images MIFF, qui génère les images individuelles dans une boucle et les « redirige » vers une commande finale de « fusion ». Cela est illustré plus clairement dans les exemples Positionnement programmé d'images superposées et Épingles sur une carte. ![]() |
Dans le script shell « animate_mixer », chaque image est générée en appliquant « -swirl » à l'image d'origine. Le tourbillon est animé dans une direction, puis revient en arrière pour former un cycle continu. C'est en fait un exemple très typique d'animation de déformation dans IM. Une variante consiste à faire en sorte que l'animation défasse la déformation pour aboutir à une image différente mais similaire. |
|---|---|
![]() |
Le script shell « [animate_whirlpool](../static/img/warping/animate_whirlpool) » n'utilise pas seulement « [-swirl](https://imagemagick.org/command-line-options/#swirl) » sur chaque image de la séquence, mais aussi « -implode » avec une taille d'argument croissante. J'ai utilisé une couleur de bordure « lightblue » pour l'espace ajouté afin de montrer que l'image entière va être « aspirée dans le siphon », même si j'aurais dû utiliser à la place la même couleur d'arrière-plan blanche, pour un effet meilleur et plus réaliste. |
| --- | --- |
![]() |
Une explosion au milieu de l'image (voir le script « animate_explode »). L'image est de nouveau agrandie de sorte que l'image entière soit explosée, et un point coloré est dessiné au centre pour définir la couleur finale. |
| --- | --- |
![]() |
À l'aide du script shell « animate_flex », le centre de l'image se plie vers le haut et vers le bas en faisant varier l'amplitude de la fonction « -wave », de façon positive comme négative. |
| --- | --- |
![]() |
À l'aide du script shell « animate_flag », je crée une animation d'« onde décalée » pour faire onduler l'image comme un drapeau. L'animation peut être améliorée en décalant aussi verticalement chaque image de la séquence pour que le bord gauche reste constant, et peut-être en ajoutant une hampe de drapeau. Cela nécessite toutefois de déterminer mathématiquement ce décalage, ce qui peut s'avérer délicat. |
| --- | --- |
![]() |
Le script « animate_rotate » a généré cette animation de rotation, mais rogne chaque image avec l'image d'origine, comme décrit ci-dessus, afin de préserver la taille de l'image d'origine. |
| --- | --- |
![]() |
À titre de comparaison, voici une rotation de koala générée à l'aide des réglages par défaut et de la commande « -distort SRT {angle} ». Le script utilisé pour la générer est « animate_distort_rot ». Notez à quel point l'image est plus nette avec cette méthode de rotation, et l'absence de « scintillement » rotationnel évident dans la version précédente. |
| --- | --- |
Animations et vidéos bonus
En bonus, Florent Monnier, de France, a créé une belle vidéo utilisant l'opérateur de distorsion « [-swirl](https://imagemagick.org/command-line-options/#swirl) », réalisée à l'aide d'un script utilisant l'API OCaml d'IM. Sélectionnez l'animation GIF à droite pour télécharger la version complète de la vidéo. Pouvez-vous réaliser une bonne vidéo illustrant une technique de carte de distorsion ? En connaissez-vous une ailleurs sur le net ? Écrivez-moi.
![[IM Output]](../static/img/warping/rotate_0.gif)
![[IM Output]](../static/img/warping/rotate_90.gif)
![[IM Output]](../static/img/warping/rotate_180.gif)
![[IM Output]](../static/img/warping/rotate-90.gif)
![[IM Output]](../static/img/warping/rotate_360.gif)
![[IM Output]](../static/img/warping/original.gif)
![[IM Output]](../static/img/warping/shear_rot.gif)
![[IM Output]](../static/img/warping/shear_x.gif)
![[IM Output]](../static/img/warping/shear_y.gif)
![[IM Output]](../static/img/warping/shear_xy.gif)
![[IM Output]](../static/img/warping/shear_xy2.gif)
![[IM Output]](../static/img/warping/shear_yx.gif)
![[IM Output]](../static/img/warping/implode_border_trans.png)
![[IM Output]](../static/img/warping/animated_mixer.gif)
![[IM Output]](../static/img/warping/animated_whirlpool.gif)
![[IM Output]](../static/img/warping/animated_explode.gif)
![[IM Output]](../static/img/warping/animated_flex.gif)
![[IM Output]](../static/img/warping/animated_flag.gif)
![[IM Output]](../static/img/warping/animated_rotate.gif)
![[IM Output]](../static/img/warping/animated_distort_rot.gif)