⚠️ 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/anim_basics/index.html).

ImageMagick Examples -- Bases de l'animation

ImageMagick Examples préface et index
Animations GIF et métadonnées d'animation
Méthodes de suppression des trames

Animations GIF et métadonnées d'animation

Par défaut, ImageMagick gère la sortie d'une liste d'images en générant une image multipage. Pour le format d'image GIF, cela prend toutefois la forme particulière d'une « animation GIF ». |

  magick -delay 100  -size 100x100 xc:SkyBlue \
          -page +5+10  balloon.gif   -page +35+30 medical.gif  \
          -page +62+50 present.gif   -page +10+55 shading.gif  \
          -loop 0  animation.gif

[IM Output]
Voici un exemple de « scintillement » plus avancé qui utilise un script shell « [star_field](../static/img/scripts/star_field) ». Ce script est issu de mes expériences de génération de champs d'étoiles aléatoires. |

  star_field 70x46  stars1.gif
  star_field 70x46  stars2.gif
  star_field 70x46  stars3.gif
  magick rose:  -compose Screen \
          \( -clone 0 stars1.gif -composite \) \
          \( -clone 0 stars2.gif -composite \) \
          \( -clone 0 stars3.gif -composite \) \
          -delete 0 -set delay 25 -layers Optimize rose_sparkle.gif
  rm stars[123].gif

[IM Output]
Pour l'essentiel, trois champs d'étoiles aléatoires sont générés à la bonne taille, puis superposés sur notre image, le « rose: » intégré à IM, à l'aide d'une composition alpha « [Screen](compose.html#screen) » afin d'éclaircir l'image avec les motifs d'étoiles donnés. L'ensemble est ensuite passé dans l'optimiseur général d'animations GIF d'IM. Ce qui précède peut sembler complexe car il utilise des fonctions IM avancées que je n'ai pas encore présentées, mais le résultat est une animation à trois trames relativement simple, tout en étant bien optimisée. Vous pouvez aussi examiner certaines des animations plus complexes créées à l'aide de simples scripts shell dans les Animations de distorsion. Il existe quelques réglages IM supplémentaires créés spécialement pour les animations GIF, et les connaître est le premier pas dans le monde des animations GIF… [**-dispose**](https://imagemagick.org/command-line-options/#dispose) {method}


| Ce que les images suivantes doivent faire des résultats précédents de l'animation GIF. Les options valides sont « Undefined », « [None](#none) », « [Previous](#previous) » et « [Background](#background) ». (Voir ci-dessous l'explication des réglages.)
[**-loop**](https://imagemagick.org/command-line-options/#loop) {number} | Nombre de fois où l'animation GIF doit parcourir la séquence d'images avant de s'arrêter. C'est un réglage d'« écriture d'image » en sortie, il peut donc être défini n'importe où sur la ligne de commande, mais seul le dernier réglage de ce type sera utilisé. En général, il est défini par défaut à zéro (boucle infinie) ; cependant, si l'une des images lues possède une valeur différente, ce réglage prendra la valeur de cette image. C'est pourquoi je recommande de toujours définir « [-loop](https://imagemagick.org/command-line-options/#loop) » lors de la création d'une animation GIF, après que toutes les images ont été lues. Pour plus d'informations, voir La fin de la boucle ci-dessous.
[**-delay**](https://imagemagick.org/command-line-options/#delay) {time} | Définit le délai temporel (en centièmes de seconde) de pause après le dessin des images lues ou créées une fois ce réglage défini. Vous pouvez spécifier une autre échelle pour le délai en indiquant une mise à l'échelle par « x » (donnée en tics par seconde). Par exemple, « 10x1 » correspond à 10 tics d'une seconde, tandis que « 10x100 » correspond à 10 tics d'un centième de seconde. Pour l'essentiel, le « x » équivaut au signe de fraction « / ». Par exemple, spécifier « 1x160 » définira un délai adapté à 160 trames par seconde. | | Les délais des animations GIF doivent être spécifiés en centièmes de seconde pour fonctionner correctement, ce qui explique que ce soit l'unité de temps par défaut. Le facteur « x » sert davantage à générer d'autres formats plus proches de la vidéo, tels que les MNG et les AVI.
---|---
[**-set**](https://imagemagick.org/command-line-options/#set) dispose {method} [**-set**](https://imagemagick.org/command-line-options/#set) delay {time}
| Alors que les réglages d'option précédents définissent des attributs d'image sur les images nouvellement créées ou lues après que l'option a été donnée, l'option « [-set](https://imagemagick.org/command-line-options/#set) » est un opérateur qui vous permet de définir des attributs d'image sur toutes les images déjà présentes dans la séquence d'images courante. Cela permet de modifier le réglage sur toute une animation, ou sur une seule trame, après que les images ont été chargées ou modifiées.
[**-page**](https://imagemagick.org/command-line-options/#page) {w}x{h}+{x}+{y}
| Ceci vous permet de définir la position de décalage de l'image sur le point d'être lue. Comme il s'agit d'une option de réglage, la géométrie donnée ne s'applique qu'aux images qui suivent le réglage. Elle n'affecte pas les images déjà lues en mémoire. Si elle n'est pas donnée, ou désactivée à l'aide de « [+page](https://imagemagick.org/command-line-options/#page) », le décalage de l'image lue sera préservé. Si l'image n'a pas de décalage, elle sera positionnée à « +0+0 », c'est-à-dire dans le coin supérieur gauche du canevas de travail ou « page ». Elle peut aussi servir à définir un canevas de travail plus grand, en spécifiant une largeur « x » hauteur. Seuls la largeur et la hauteur de page de la première image de la séquence serviront à définir la taille globale du canevas de l'animation GIF ; tous les autres réglages de taille de page seront ignorés lors de l'écriture finale de l'animation. Lorsqu'une animation GIF est lue, la taille du canevas est définie sur toutes les trames de l'animation. Les animations MNG peuvent enregistrer les décalages de trame, mais pas les tailles de canevas. La taille de la première image définit la taille du canevas de toute l'animation. | | _Le format d'image GIF ne peut pas spécifier de décalage négatif pour les images sur un canevas. Si vous essayez d'utiliser un décalage négatif, IM le remettra à zéro lorsque cette image (ou trame d'animation) sera écrite dans un fichier GIF.

Des décalages positifs plus grands que le canevas de l'image sont tout à fait acceptables, mais peuvent avoir pour effet que l'image n'apparaisse pas dans la zone de dessin du canevas lors de l'affichage par magick. La façon dont un programme d'affichage d'animations GIF gère cela n'est pas définie. La prudence est de mise._
---|---
[**-repage**](https://imagemagick.org/command-line-options/#repage) {w}x{h}+{x}+{y}
| Ceci est exactement comme « [-page](https://imagemagick.org/command-line-options/#page) », sauf qu'il s'agit d'un opérateur d'image et non d'un réglage. Cela signifie que vous pouvez l'utiliser pour modifier ou réinitialiser la « géométrie de page » d'une image ou d'une trame d'animation déjà lue en mémoire. La forme plus simple « [+repage](https://imagemagick.org/command-line-options/#repage) » réinitialise simplement la « géométrie de page » de toutes les images à l'image réelle de chaque trame de la séquence d'images courante, avec un décalage nul et la taille réelle de l'image. Cette opération est essentielle lorsque vous extrayez les trames individuelles d'une animation (voir les Exemples d'Adjoin ci-dessous). Cependant, « [+repage](https://imagemagick.org/command-line-options/#repage) » détruira beaucoup d'informations de positionnement stockées dans chaque image ; vous devriez donc probablement aussi extraire ces informations dans un fichier séparé pour les réutiliser plus tard. Voir Informations de liste d'animation ci-dessous.

Point important

N'enregistrez PAS directement en GIF les animations intermédiaires dont le traitement n'est pas terminé. Vous pouvez utiliser le format interne d'IM, MIFF, comme format de fichier temporaire, si vous voulez travailler sur une animation en une série d'étapes de traitement distinctes. Je le répète…

N'utilisez pas le GIF comme format de fichier intermédiaire, utilisez plutôt MIFF

Si vous commettiez la grave erreur d'enregistrer en GIF, vous ne feriez qu'aggraver l'animation résultante, car IM aurait alors effectué une quantification des couleurs automatique afin de réduire le nombre de couleurs présentes. Non seulement cela, mais il l'aurait fait sur chaque trame de manière totalement indépendante des autres, rendant tout traitement ultérieur, en particulier toute optimisation GIF, d'autant plus difficile. Résoudre ce problème est une affaire complexe et à plusieurs niveaux, abordée dans la section suivante, Optimisation d'animation.


Méthodes de suppression des trames

La première chose sur laquelle butent les personnes qui créent une animation GIF est le réglage « [-dispose](https://imagemagick.org/command-line-options/#dispose) ». Ce n'est pas surprenant, car c'est un réglage complexe. Pire encore, beaucoup de programmes d'animation, y compris de nombreux navigateurs web, ne gèrent pas toujours correctement le réglage de métadonnées « GIF disposal ». Cependant, utiliser la bonne méthode de suppression peut faire une grande différence sur le bon fonctionnement et l'optimisation de votre animation. La première chose à retenir dans ImageMagick est que presque toutes les options d'animation spéciales sont des réglages de lecture d'image. C'est-à-dire qu'elles s'appliquent aux images lues après que le réglage a été donné. Le réglage « [-loop](https://imagemagick.org/command-line-options/#loop) » est le seul qui soit habituellement utilisé une fois l'animation terminée, juste avant l'enregistrement. Le rôle fondamental de « [-dispose](https://imagemagick.org/command-line-options/#dispose) » est de définir comment une image doit être retirée après avoir été affichée pendant sa durée « [-delay](https://imagemagick.org/command-line-options/#delay) ». Autrement dit, vous devez donner les réglages « [-dispose](https://imagemagick.org/command-line-options/#dispose) » et « [-delay](https://imagemagick.org/command-line-options/#delay) » d'une image avant de lire l'image de cette trame. Mais l'action est appliquée après l'affichage de cette image. C'est un peu contre-intuitif, mais cela a du sens dans la façon dont IM opère sur les images. Si vous vous en souvenez, vous ne devriez pas avoir de problème. Les formes « plus » de ces options, comme la plupart des autres réglages d'IM, empêchent le réglage de s'appliquer aux images lues. Cela signifie que si vous ne spécifiez pas de réglage, l'image de la trame continuera d'utiliser le réglage lu avec l'image (le cas échéant). Cela peut être important plus tard, lorsque vous voudrez lire une animation GIF pour un traitement ultérieur. Ou lors de la fusion d'une animation GIF dans une autre (la technique d'animation la plus difficile).

Dispose None - chaque trame superposée l'une après l'autre

Le réglage « [-dispose](https://imagemagick.org/command-line-options/#dispose) » par défaut des animations GIF est « **Undefined** », que la plupart des programmes d'animation traitent comme un réglage de suppression « **None** ». Pour l'essentiel, cela indique à l'ordinateur de laisser tel quel tout ce qui est superposé par cette trame précise. Ou plus précisément, de « ne rien faire ». Notez toutefois que l'ensemble du canevas est toujours effacé à la fin de la séquence d'animation, avant qu'elle ne boucle et se répète. Voici par exemple une animation « None dispose » classique… |

  magick -delay 100 -dispose None \
              -page 100x100+5+10  balloon.gif  \
              -page +35+30 medical.gif  \
              -page +62+50 present.gif  \
              -page +10+55 shading.gif  \
          -loop 0  anim_none.gif

[IM Output]
Cette technique de suppression est idéale pour les animations qui ne comportent aucune forme de transparence, comme les animations dessinées sur un fond uni ou à motif. |

  magick -dispose none  -delay 100 \
                -size 100x100 xc:SkyBlue +antialias \
                -fill DodgerBlue -draw 'circle 50,50 15,25' \
                -page +5+10  balloon.gif  \
                -page +35+30 medical.gif  \
                -page +62+50 present.gif  \
                -page +10+55 shading.gif  \
          -loop 0  canvas_none.gif

[IM Output]
Notez que cette technique ne peut qu'ajouter des couleurs visibles à une animation. Elle ne peut jamais rendre une partie de l'animation à nouveau transparente. (Voir Animations par superposition ci-dessous.) Pour gérer aussi la transparence, il faut utiliser l'une des autres méthodes de suppression.

Dispose Previous - préserver le canevas d'arrière-plan

La méthode de suppression « **Previous** » est relativement simple. Lorsque l'image courante est terminée, elle ramène le canevas à l'état où il était avant que l'image ne soit superposée. Si la trame précédente utilisait elle aussi une méthode de suppression « Previous », le résultat sera identique à ce qu'il était avant cette trame… et ainsi de suite… Par exemple, dans cette animation, chacune des trames ultérieures reviendra à la toute première trame de l'image, dont le réglage de suppression est « [None](#none) », avant de superposer l'image associée à cette trame. Le résultat est un canevas d'arrière-plan sur lequel chaque image de trame n'est superposée que pour la durée de cette image… |

  magick -dispose none  -delay 0 \
                -size 100x100 xc:SkyBlue +antialias \
                -fill DodgerBlue -draw 'circle 50,50 15,25' \
          -dispose previous -delay 100 \
                -page +5+10  balloon.gif  \
                -page +35+30 medical.gif  \
                -page +62+50 present.gif  \
                -page +10+55 shading.gif  \
          -loop 0  canvas_prev.gif

[IM Output]
Notez la méthode « [-dispose](https://imagemagick.org/command-line-options/#dispose) » « [None](#none) » utilisée pour la première image. C'est important, sinon la trame « previous » remonterait jusqu'au canevas vide d'origine présent avant la première trame. Notez également que j'ai utilisé un « [-delay](https://imagemagick.org/command-line-options/#delay) » de « 0 » dans l'animation ci-dessus. Cela indique de ne pas attendre avant de superposer la première trame sur ce « canevas d'arrière-plan ». Sans cela, vous verriez un court délai n'affichant que l'image du canevas, sans rien par-dessus. Bien sûr, il faut toujours définir un « [-delay](https://imagemagick.org/command-line-options/#delay) » plus long pour les images ultérieures, sinon elles apparaîtraient et disparaîtraient en un clin d'œil et, accessoirement, consommeraient beaucoup de cycles CPU du spectateur. L'usage de la méthode de suppression « Previous » peut être sujet à un léger scintillement, ou à une pause, dans certains navigateurs web, en particulier sur les machines lentes. Bien que cela se voie assez rarement de nos jours, le scintillement lui-même est toujours présent, et je le considère comme un bug. Voir Trames à délai nul ci-dessous pour plus de précisions. Peu d'animations utilisent un style « dispose previous », la raison étant qu'il est très difficile à optimiser pour les ordinateurs. Le problème est justement de savoir quelle trame l'ordinateur doit choisir pour devenir l'image d'arrière-plan. Il est simple pour nous, humains, de déterminer la meilleure image à utiliser, mais difficile pour un ordinateur de décider. La meilleure image d'arrière-plan à utiliser dans une animation peut même ne pas être destinée à être affichée, comme dans l'exemple courant, et donc ne pas exister dans une version non optimisée de cette animation.

Dispose Background - effacer vers l'arrière-plan

Alors que les deux premières méthodes « [-dispose](https://imagemagick.org/command-line-options/#dispose) » sont relativement simples, la méthode « **Background** » est probablement la plus difficile à comprendre. Lorsque le délai temporel d'une trame donnée est écoulé, la zone qui avait été superposée par cette trame est effacée. Pas l'ensemble du canevas, seulement la zone superposée. Une fois cela fait, le canevas résultant est celui transmis à la trame suivante de l'animation, pour y superposer l'image de cette trame. Ici, par exemple, nous remplaçons simplement chaque trame par la suivante. |

  magick -delay 100 -dispose Background \
              -page 100x100+5+10  balloon.gif  \
              -page +35+30 medical.gif  \
              -page +62+50 present.gif  \
              -page +10+55 shading.gif  \
          -loop 0  anim_bgnd.gif

[IM Output]
Pour que vous voyiez exactement ce qui se passe, ajoutons une image de canevas initiale à l'animation, afin de voir comment un « Background » « supprime » réellement cette trame de l'affichage de l'animation. |

  magick -delay 100 -dispose none \
                -size 100x100 xc:SkyBlue +antialias \
                -fill DodgerBlue -draw 'circle 50,50 15,25' \
          -dispose background \
                -page +5+10  balloon.gif  \
                -page +35+30 medical.gif  \
                -page +62+50 present.gif  \
                -page +10+55 shading.gif  \
          -loop 0  canvas_bgnd.gif

[IM Output]
Comme vous pouvez le voir, à mesure que chaque trame superposée est supprimée, la zone de cette trame est effacée vers la transparence, avant que l'image suivante ne soit superposée. C'est là toute l'importance de cette méthode de suppression GIF, car c'est la seule façon pour une animation GIF d'effacer n'importe quel pixel indépendamment de l'historique des trames de l'animation. La seule autre façon d'effacer des pixels est d'utiliser « [Previous](#previous) » pour revenir à une trame où ces pixels étaient effacés. Mais cela repose sur la connaissance de l'historique de la séquence d'animation, ce qui rend l'optimisation beaucoup plus difficile pour les ordinateurs. | _Certains pensent que, plutôt que d'effacer la zone superposée vers la couleur transparente, cette suppression devrait l'effacer vers le réglage de métadonnées de couleur d'« arrière-plan » stocké dans l'animation GIF. En fait, l'ancien navigateur « Netscape » (versions 2 et 3) faisait exactement cela. Mais il échouait aussi à implémenter correctement la méthode de suppression « Previous ».

D'un autre côté, le canevas initial devrait lui aussi être défini à partir de la couleur d'« arrière-plan » du format, et cela n'est pas fait non plus. Cependant, tous les navigateurs web modernes n'effacent vers la transparence que la zone superposée en dernier ; c'est donc désormais la pratique admise, et celle qu'IM suit maintenant._
---|---
| _Avant la version IM 6.2.6-1, les opérations « [-coalesce](https://imagemagick.org/command-line-options/#coalesce) » et « [-deconstruct](https://imagemagick.org/command-line-options/#deconstruct) » d'IM ne géraient pas les animations qui utilisaient la suppression « Background » pour rendre des pixels transparents, comme le font tous les principaux navigateurs web. Voir Bugs d'animation pour des exemples et des détails.

Ces fonctions marchaient toutefois très bien lorsqu'aucun effacement de pixel n'était appliqué ou prévu. Cela a maintenant été corrigé pour « [-coalesce](https://imagemagick.org/command-line-options/#coalesce) », et la méthode « [-layers](https://imagemagick.org/command-line-options/#layers) [OptimizeFrame](anim_opt.html#optframe) » a été créée pour remplacer l'usage de « [-deconstruct](https://imagemagick.org/command-line-options/#deconstruct) » comme fonction d'optimisation des trames d'animation GIF._
---|---


Étudier les animations

Avant de poursuivre avec les bases de l'animation GIF, leurs types, leurs optimisations et leurs techniques de manipulation, nous avons besoin de quelques techniques pour étudier des animations existantes.

Identify - informations sur une animation

Une animation se compose de beaucoup d'informations condensées dans chaque trame individuelle. Vous pouvez voir une partie de ces informations à l'aide de la commande IM « [identify](basics.html#identify) » par défaut.

  magick identify canvas_prev.gif

[IM Text]

| Si vous n'avez pas vu une sortie comme celle ci-dessus, c'est que votre IM est un peu ancien, et vous devriez vraiment mettre à jour votre version installée d'ImageMagick vers la dernière version. Sinon, vous passerez à côté de beaucoup des nouvelles avancées d'IM en matière de gestion et de contrôle des animations GIF.
---|---
Comme vous pouvez le voir, l'image réellement enregistrée pour la deuxième trame et les suivantes ne fait que 32x32 pixels, mais toutes les trames reposent sur un « canevas virtuel » de 100x100 pixels, avec un « décalage virtuel » sur ce canevas plus grand. Pour voir davantage des diverses métadonnées présentes, vous devez utiliser certains des formats d'échappement en pourcentage plus spécialisés afin qu'IM les affiche.

  magick identify -format "%f canvas=%Wx%H size=%wx%h offset=%X%Y %D %Tcs\n" \
           canvas_prev.gif

[IM Text]

Ce qui montre clairement non seulement la taille du canevas, la taille de l'image et le décalage, mais aussi la suppression et les délais temporels utilisés pour chaque trame individuelle. Notez que la première trame a une suppression et un délai temporel différents, nécessaires au bon usage de la méthode de suppression « Previous » ultérieure.

Adjoin - découper une animation en trames

Comme vous l'avez vu ci-dessus, ImageMagick tente par défaut d'enregistrer plusieurs images dans un seul fichier si le format de fichier le permet. Cependant, comme évoqué dans Écrire une liste d'images multiples, IM vous laisse utiliser le réglage « [+adjoin](https://imagemagick.org/command-line-options/#adjoin) » pour lui indiquer d'enregistrer chaque image sur le disque comme une image individuelle distincte. Par exemple, ici nous lisons l'une des animations GIF et produisons les trames individuelles de la séquence d'animation.

  magick canvas_prev.gif -scene 1 +adjoin  frame_%03d.gif

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

Si vous examiniez les images réelles ci-dessus, vous constateriez que, bien que la plupart des navigateurs web montrent une zone de 100x100 plus grande sur laquelle chaque sous-trame apparaît, la plupart des images réellement affichées ne font en fait que 32x32 pixels, exactement comme le montraient les commandes « identify » précédentes. Autrement dit, la majeure partie de la zone n'est qu'un canevas sur lequel rien n'est dessiné, ce que l'on appelle la « géométrie de page » ou « canevas virtuel » de l'image. La première image de l'animation définit ce « canevas » plus grand, et toutes les autres trames définissent une position de « décalage » sur ce canevas plus grand. Cette information supplémentaire est préservée dans les trames enregistrées par le réglage « [+adjoin](https://imagemagick.org/command-line-options/#adjoin) ». Vous pouvez donc facilement reconstruire l'animation GIF. Non seulement l'information de page est préservée dans chaque trame séparée, mais tout réglage de délai, de bouclage et de suppression GIF l'est également. Cela signifie que pour reconstruire l'animation, il suffit de lire toutes les images. |

  magick frame_???.gif  anim_rebuilt.gif

[IM Output]
Parfois, cependant, vous ne voulez pas préserver cette information de géométrie de page. Par exemple, si vous voulez utiliser les trames individuelles pour d'autres projets. Vous pouvez réinitialiser la taille de page et le décalage à l'aide de l'option « [+repage](https://imagemagick.org/command-line-options/#repage) », pour supprimer l'information de « canevas virtuel » et ne laisser que l'image réelle.
Normalement, lors de l'extraction des sous-images d'une animation, vous réinitialisez aussi en général les réglages de délai et de suppression de l'image, pour vous assurer qu'ils n'interfèrent pas avec l'édition et l'affichage. Par exemple, ici je supprime le canevas virtuel et le décalage indésirables, et je réinitialise les délais de temporisation et les suppressions.

  magick canvas_prev.gif  +repage  -set delay 0   -set dispose None \
          +adjoin  repage_%03d.gif

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

Bien sûr, si vous jetez ces métadonnées, il vous faut un moyen d'enregistrer et d'éditer ces données. Voir Informations de liste d'animation (ci-dessous) pour un script qui extrait à la fois les sous-images et enregistre les métadonnées de l'animation, sous une forme utilisable pour reconstruire l'animation.

Coalesce - reconstituer complètement les trames

Voir une animation sous la forme de ses sous-trames n'est cependant généralement pas très utile pour une animation typique. D'une part, une animation fortement optimisée peut se composer de nombreuses très petites parties, sans aucune indication visuelle de la façon dont elles s'assemblent. Elle peut aussi contenir beaucoup d'autre « bruit » ajouté pour l'optimisation de compression afin de réduire la taille de fichier globale de l'animation. Par exemple, il est très difficile de comprendre ce que faisait réellement cette animation, rien qu'en regardant ses sous-trames individuelles.

  magick script_k.gif  +repage  +adjoin  script_k_%02d.gif

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

L'opération « [-coalesce](https://imagemagick.org/command-line-options/#coalesce) » convertit essentiellement une image en exactement ce à quoi l'animation devrait ressembler après que la trame précédente a été correctement supprimée et que la sous-trame suivante a été superposée. C'est-à-dire qu'au lieu d'une séquence d'animation où chaque trame ne représente que les modifications superposées à la trame « supprimée » précédente, cet opérateur crée une vue complète de l'animation à chaque instant, un peu comme une véritable pellicule de film, plutôt qu'une séquence d'animation. Une telle séquence, appelée Animation fusionnée, est bien plus facile à étudier, éditer, modifier et réoptimiser. Ici, par exemple, nous allons générer un montage de la même séquence d'animation « déroutante » montrée ci-dessus, mais cette fois nous allons « [-coalesce](https://imagemagick.org/command-line-options/#coalesce) » les séquences, afin de voir ce qui se passe réellement. |

  montage script_k.gif -coalesce \
          -tile x1 -frame 4 -geometry '+2+2' \
          -background none -bordercolor none coalesce_k_montage.gif

[IM Output]

[IM Output]

Comme vous pouvez le voir, le résultat ressemble à une pellicule de film de l'animation, vous permettant de voir clairement comment les pièces précédentes s'assemblent pour former une lettre « K » dessinée à la main. Depuis la version IM 6.2.6, la commande « magick montage » comprend l'usage de « [-coalesce](https://imagemagick.org/command-line-options/#coalesce) », vous permettant de créer une image « en pellicule de film » des trames d'animation, exactement comme montré ci-dessus. Cette version contenait aussi des corrections pour coalesce, et tout travail sur une animation GIF devrait utiliser au moins cette version (ou mieux encore, la dernière version). Une technique de montage encore meilleure pour examiner les animations est présentée dans la section d'exemple suivante.
Le réglage « [-dispose](https://imagemagick.org/command-line-options/#dispose) » d'une séquence d'images fusionnées est en réalité sans importance dans une Animation fusionnée. Cependant, pour la tranquillité d'esprit des utilisateurs, l'opérateur « [-coalesce](https://imagemagick.org/command-line-options/#coalesce) » définira le réglage « [-dispose](https://imagemagick.org/command-line-options/#dispose) » de chaque trame sur « [None](#none) » ou « [Background](#background) » selon le cas, afin que la séquence d'images fusionnées continue de s'animer correctement (comme montré ci-dessus). _Une trame avec une suppression « [Background](#background) » signifie que la trame suivante devait effacer au moins un pixel pour s'afficher correctement.

Ainsi, les animations où « [-coalesce](https://imagemagick.org/command-line-options/#coalesce) » a ajouté une suppression « [Background](#background) » ne peuvent pas être enregistrées comme une simple Animation par superposition (voir ci-dessous).

Techniquement, vous pouvez définir tous les réglages de suppression d'une séquence d'images fusionnées sur « [Background](#background) » ou « [Previous](#previous) » pour générer une Animation à trames effacées (voir ci-dessous). Toutes les animations ne s'optimiseront cependant pas bien sous cette forme._
---|---
L'opérateur « [-coalesce](https://imagemagick.org/command-line-options/#coalesce) » a aussi quelques usages hors animation. Voir Coalesce et aplatissement progressif pour des exemples de ces usages.

Montage de trames d'animation - le script « gif_anim_montage »

Alors que l'opérateur « [+adjoin](https://imagemagick.org/command-line-options/#adjoin) » vous permet d'extraire les images réelles d'une animation et que « [-coalesce](https://imagemagick.org/command-line-options/#coalesce) » vous permet de voir les trames résultantes de l'animation, les deux méthodes omettent beaucoup d'informations sur l'animation. En manipulant très soigneusement les images de l'animation, vous pouvez afficher les trames de manière à montrer non seulement les trames réelles, mais aussi le placement de ces trames sur le canevas plus grand. Voici l'une de ces méthodes d'affichage d'une animation.

  magick -dispose Background   script_k.gif  -alpha set \
          -compose Copy -bordercolor black -border 1x1 -compose Over \
          -coalesce  -bordercolor none   -frame 4x4+2+2 \
          -bordercolor none -border 2x2 +append  script_k_parts.gif

[IM Output]

Ici, vous pouvez voir clairement comment fonctionne l'animation. Chaque image de sous-trame est positionnée de façon à s'ajouter à toutes les superpositions précédentes. Le résultat est une image qui grandit lentement. Chaque trame est aussi bien plus petite que le « canevas virtuel » sur lequel elle est positionnée. J'utilise beaucoup cette technique d'affichage lors du développement et du débogage d'animations GIF ; c'est pourquoi je l'ai convertie en un script shell « [gif_anim_montage](../static/img/scripts/gif_anim_montage) », et l'ai étendue pour lister aussi certains des détails ci-dessus au-dessus de chaque trame de l'animation.

  gif_anim_montage   script_k.gif   script_k_frames.gif

[IM Output]

Notez les variations de temporisation utilisées dans les différentes trames, pour marquer une pause comme si le stylo était soulevé de la page puis repositionné. Les animations à temporisation variable peuvent compter parmi les plus intéressantes, mais aussi les plus difficiles à manipuler, comme vous le verrez dans les pages d'exemples IM ultérieures. Le script « [gif_anim_montage](../static/img/scripts/gif_anim_montage) » possède aussi l'option spéciale « -u » qui place en sous-couche une copie semi-transparente de l'animation fusionnée. Cela vous permet de voir comment les nouvelles sous-trames modifient l'animation affichée.

  gif_anim_montage  -u  script_k.gif  script_k_frames.png

[IM Output]

Bien sûr, cela comporte des pixels semi-transparents, donc un format d'image « PNG » était nécessaire ; OU vous pourriez utiliser l'une des nombreuses options d'« arrière-plan » que ce script fournit aussi, vous permettant d'utiliser les formats GIF ou même JPEG pour l'image de synthèse résultante de l'animation. D'autres options vous laissent définir le nombre de lignes ou de colonnes à utiliser, ainsi que définir divers arrière-plans non transparents, ou utiliser un cadre rouge plutôt que le noir par défaut. Ce script sera beaucoup utilisé dans les prochaines pages d'exemples IM. Les suggestions et commentaires sont les bienvenus.

Informations de liste d'animation - les options utilisées pour construire une animation

Comme je l'ai noté, l'usage de « [+adjoin](https://imagemagick.org/command-line-options/#adjoin) » et « [-coalesce](https://imagemagick.org/command-line-options/#coalesce) », ainsi que de « [+repage](https://imagemagick.org/command-line-options/#repage) », sont autant de méthodes utiles pour extraire et examiner les animations GIF. Cependant, elles détruisent toutes des informations sur l'animation d'origine au passage. Vous pouvez voir ces informations supplémentaires sur le cadrage, les délais temporels, la suppression des trames, etc., à l'aide de la commande IM « magick identify » avec une option « [-verbose](https://imagemagick.org/command-line-options/#verbose) ». Cependant, moi, et probablement la plupart des autres utilisateurs, trouve la sortie de cette commande écrasante et pas vraiment directement exploitable. C'est là qu'intervient un autre script shell spécial que j'ai écrit. Le script « [gif2anim](../static/img/scripts/gif2anim) » sépare les trames individuelles de l'animation, mais détermine aussi exactement quelles options IM « magick » seraient nécessaires pour reconstruire l'animation à partir de ces images. Vous pouvez voir « [gif2anim](../static/img/scripts/gif2anim) » comme un désassembleur d'animation, produisant un résumé de l'animation en termes d'options IM. Par exemple, décodons l'exemple d'animation que nous utilisons pour récupérer les réglages « magick » d'origine employés pour la créer, ainsi que les images individuelles utilisées… |

  gif2anim canvas_prev.gif

[IM Text]

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

Par défaut, le script « [gif2anim](../static/img/scripts/gif2anim) » utilise le même nom de fichier de base pour les images individuelles et le fichier d'options « .anim ». Ainsi, le fichier de séquence d'animation généré par la commande ci-dessus est nommé « [canvas_prev.anim](https://usage.imagemagick.org/anim_basics/canvas_prev.anim) », avec les trames individuelles « [canvas_prev_001.gif](../static/img/anim_basics/canvas_prev_001.gif) » à « [canvas_prev_005.gif](../static/img/anim_basics/canvas_prev_005.gif) ». Si vous examinez les résultats de plus près, vous verrez qu'il a réellement réussi à recréer les options d'origine que j'ai utilisées quand j'ai créé cette animation GIF pour la première fois (voir Animation Dispose Previous). De plus, même si ce n'est pas important pour générer réellement une animation, la taille et les temporisations des trames superposées sont aussi listées en commentaire, pour en faciliter l'étude. Plutôt que d'enregistrer les résultats dans un fichier, vous pouvez simplement lister les options de la séquence d'animation à l'écran à l'aide d'un indicateur « -l ». C'est-à-dire n'afficher que le fichier de séquence d'animation, plutôt que de l'enregistrer, ou d'enregistrer les trames individuelles de l'animation.

  gif2anim -l canvas_prev.gif

Étant donné un fichier « .anim » et les images de cadrage individuelles, un script complémentaire « [anim2gif](../static/img/scripts/anim2gif) » peut être utilisé pour reconstruire l'animation. |

  anim2gif canvas_prev.anim

[IM Output]
Par défaut, « [anim2gif](../static/img/scripts/anim2gif) » recrée l'animation GIF avec un suffixe « _anim.gif ». Vous pouvez voir que l'animation « [canvas_prev_anim.gif](../static/img/anim_basics/canvas_prev_anim.gif) » résultante paraît et fonctionne exactement comme l'animation d'origine. Ce script remplace simplement la chaîne spéciale « BASENAME » utilisée dans le « fichier de séquence d'animation », supprime tous les commentaires, puis passe simplement les options convert restantes à la commande « magick ». Autrement dit, il traite le fichier ci-dessus comme une sorte de script « convert » commenté. La raison de l'usage d'une chaîne spéciale est qu'elle vous permet ensuite de spécifier un nom de fichier de base différent de celui du fichier « .anim » lui-même. Vous pouvez ainsi utiliser un jeu de trames complètement différent, comme des versions modifiées des originales, pour recréer une animation différente à partir de l'ancienne. C'est une fonctionnalité très utile, qui sera employée dans un traitement d'animation plus complexe. (Voir Accoler des animations côte à côte pour un exemple.) Comme « [gif2anim](../static/img/scripts/gif2anim) », le script « [anim2gif](../static/img/scripts/anim2gif) » possède un bon nombre d'options utiles pour vous aider à traiter et modifier les animations. Certaines de ces options seront utilisées plus tard. Voir par exemple Accoler des animations. De plus, comme le fichier « .anim » est du texte brut, vous pouvez l'utiliser pour prendre les images décodées d'une animation afin d'ajuster les métadonnées du GIF, comme les temporisations, les positions, les sections répétées d'une animation, ou pour ajouter de nouvelles trames et images à une animation. C'était après tout la raison pour laquelle j'ai écrit ces scripts à l'origine, bien avant de m'impliquer dans les exemples IM. Pour l'instant, « [gif2anim](../static/img/scripts/gif2anim) » sera surtout utile pour examiner une séquence d'animation afin de voir ce qui se passe et les temporisations appliquées entre les trames.

Dispose Images - la forme « GIF dispose » des trames

Cette méthode « [-layers](https://imagemagick.org/command-line-options/#layers) » spéciale, « **Dispose** », montre à quoi la trame devrait ressembler après que le délai temporel est écoulé et que la méthode de suppression GIF a été appliquée, mais avant que l'image de la trame suivante ne soit superposée. Autrement dit, elle montre exactement ce que le réglage de méthode « [-dispose](https://imagemagick.org/command-line-options/#dispose) » GIF fait réellement à la trame, vous permettant de comprendre précisément ce qui ne va pas dans votre animation. Par exemple, voici à quoi ressemble chacune de nos trois Animations d'exemple de méthodes de suppression après application de la méthode de suppression de chaque trame. Rappelez-vous que chacune de ces animations se compose d'une « image de canevas » définie avec un réglage « [-dispose](https://imagemagick.org/command-line-options/#dispose) » « [None](#none) », suivie de quatre images plus petites superposées puis supprimées par les diverses méthodes de suppression GIF. Animation « [None](#none) » dispose…

  magick canvas_none.gif -layers Dispose canvas_none_dispose.gif
  gif_anim_montage canvas_none_dispose.gif canvas_none_dispose_frames.gif

[IM Output]

Animation « [Previous](#previous) » dispose…

  magick canvas_prev.gif -layers Dispose canvas_prev_dispose.gif
  gif_anim_montage canvas_prev_dispose.gif canvas_prev_dispose_frames.gif

[IM Output]

Animation « [Background](#background) » dispose…

  magick canvas_bgnd.gif -layers Dispose canvas_bgnd_dispose.gif
  gif_anim_montage canvas_bgnd_dispose.gif canvas_bgnd_dispose_frames.gif

[IM Output]

Si vous étudiez ce qui précède, vous pouvez voir exactement comment chacune des trois méthodes de suppression GIF efface de l'animation l'image superposée de cette trame. Notez que la première trame de ces trois animations est toujours définie sur une suppression « None » et restera donc inchangée. C'est l'effet de la méthode de suppression dans les trames ultérieures qui importe. L'opération « -layers Dispose » ne génère que la séquence « fusionnée » des trames de suppression. Elle ne réinitialise pas le réglage de suppression lui-même, et le résultat peut donc ne pas s'animer correctement. Pour que ce qui précède s'anime correctement, définissez toutes les méthodes de suppression sur « previous » ou « background », ou optimisez l'animation avant l'enregistrement.
_L'aspect de la dernière trame après la méthode de suppression GIF est normalement sans conséquence pour une animation GIF, car l'ensemble du canevas est complètement effacé avant que l'animation ne se répète (ne boucle). Si elle ne « boucle » pas mais s'arrête à la fin de la séquence d'animation, alors la suppression de la dernière trame n'est pas appliquée.

Autrement dit, l'apparence de la dernière trame (après suppression) telle que montrée ci-dessus, ou même le réglage de suppression réel de la dernière trame, n'a aucun effet sur une animation GIF. IM définit généralement celui-ci comme identique à la trame précédente lorsqu'il tente de déterminer une méthode de suppression appropriée, lors d'une optimisation de trame d'une animation._
---|---

Deconstruct - signaler les zones de différence entre trames

La façon traditionnelle d'optimiser une animation dans ImageMagick, pour rendre le résultat plus petit et plus rapide à télécharger et à animer, est de « [-deconstruct](https://imagemagick.org/command-line-options/#deconstruct) » sa forme « [-coalesce](https://imagemagick.org/command-line-options/#coalesce) ». Cela n'est plus recommandé. Vous devriez plutôt utiliser l'optimiseur GIF général. Cet opérateur prend une séquence d'images fusionnées (les trames de l'animation telles qu'elles apparaissent réellement à l'affichage) et compare la deuxième image et les suivantes à l'image précédente. Il remplace ensuite cette image par la plus petite zone rectangulaire des pixels qui ont changé. Tout changement de pixel comptera, qu'il s'agisse d'un changement de couleur (superposition) ou d'un effacement (effacé). C'est assez simple, et pour une Animation par superposition typique, cela générera une optimisation de trame optimale pour cette animation. Une Animation par superposition n'utilise cependant qu'une seule méthode de suppression, « [None](#none) ». Par exemple, prenons l'animation previous fusionnée que nous avons générée ci-dessus, qui se trouve former une Animation par superposition, et passons-la dans l'opérateur « [-deconstruct](https://imagemagick.org/command-line-options/#deconstruct) ». |

  magick canvas_prev.gif   -coalesce     coalesce.gif
  magick coalesce.gif     -deconstruct   deconstruct.gif
  gif_anim_montage  coalesce.gif     coalesce_frames.gif
  gif_anim_montage  deconstruct.gif  deconstruct_frames.gif

[IM Output]
[IM Output]
[IM Output]
Une « animation previous dispose », si vous vous souvenez, efface chaque trame vers la dernière trame non supprimée en « previous », en l'occurrence le canevas d'arrière-plan initial. Comme vous pouvez le voir, « [-deconstruct](https://imagemagick.org/command-line-options/#deconstruct) » a renvoyé la zone qui a changé d'une trame fusionnée à la suivante. Il en résulte une Animation par superposition optimisée, qui ne nécessite aucun réglage de suppression particulier. C'est loin d'être aussi optimal que l'animation originale générée à la main avec laquelle j'ai commencé, mais c'est utile en soi. Malheureusement, « [-deconstruct](https://imagemagick.org/command-line-options/#deconstruct) » n'a absolument aucune compréhension des réglages de suppression « [-dispose](https://imagemagick.org/command-line-options/#dispose) » de l'animation GIF. Par conséquent, si vous essayez cela sur une animation qui efface des pixels d'une trame à la suivante, comme l'animation « background disposed » que nous avons créée ci-dessus (et montrée à gauche), elle échouera lourdement. | [IM Output]
---|---
Ici, nous prenons l'animation que nous venons de montrer, et la passons dans un cycle « [-coalesce](https://imagemagick.org/command-line-options/#coalesce) » et « [-deconstruct](https://imagemagick.org/command-line-options/#deconstruct) ». |

  magick canvas_bgnd.gif  -coalesce  -deconstruct  deconstruct_erase.gif

[IM Output]
Comme vous pouvez le voir, « [-deconstruct](https://imagemagick.org/command-line-options/#deconstruct) » détruit lentement l'animation. Pour l'essentiel, « [-deconstruct](https://imagemagick.org/command-line-options/#deconstruct) » est conçu pour simplement trouver les différences entre les couches d'images. Il n'a jamais été conçu pour optimiser correctement les animations, et échouera pour les animations qui doivent recourir à diverses techniques de suppression pour effacer (gommer ou rendre transparents) des pixels précédemment superposés.

Frame Comparisons - comparaison plus détaillée des trames

Avec IM v6.2.6-2, un certain nombre de méthodes supplémentaires de comparaison de trames GIF ont été ajoutées. Elles étaient nécessaires en interne pour une optimisation correcte des animations, mais ont été jugées suffisamment utiles pour être rendues disponibles en ligne de commande et via d'autres interfaces API.

Compare_Any

La méthode « [-layers](https://imagemagick.org/command-line-options/#layers) » « **CompareAny** » est en réalité exactement la même que « [-deconstruct](https://imagemagick.org/command-line-options/#deconstruct) ». En fait, l'opérateur « [-deconstruct](https://imagemagick.org/command-line-options/#deconstruct) » n'est qu'un alias fonctionnel de la méthode « CompareAny ». Regardons à nouveau les résultats d'image réels d'un « deconstruct » ou « CompareAny » de l'animation « background disposed ».

  magick canvas_bgnd.gif  -coalesce  canvas_bgnd_coal.gif
  gif_anim_montage canvas_bgnd_coal.gif canvas_bgnd_coal_frames.gif

  magick canvas_bgnd_coal.gif  -layers CompareAny   magick compare_any.gif
  gif_anim_montage compare_any.gif compare_any_frames.gif

[IM Output]
[IM Output]

Comme vous pouvez le voir, la deuxième image et les suivantes correspondent à la zone rectangulaire minimale contenant tous les pixels qui ont changé, qu'il s'agisse de la superposition d'une nouvelle couleur de pixel ou de l'effacement d'un ancien pixel vers la transparence.

Compare_Clear

La méthode « [-layers](https://imagemagick.org/command-line-options/#layers) » « **CompareClear** » montre la plus petite zone rectangulaire contenant tous les pixels qui devaient être effacés d'une trame à la suivante.

  magick canvas_bgnd_coal.gif -quiet -layers CompareClear compare_clear.gif
  gif_anim_montage compare_clear.gif compare_clear_frames.gif

[IM Output]

Remarquez qu'aucun pixel n'ayant été effacé entre la première et la deuxième trame, une Image manquante spéciale a été générée. Le réglage « [-quiet](https://imagemagick.org/command-line-options/#quiet) » a été utilisé pour indiquer à IM de ne donner aucun avertissement à propos de cette image. Si toutes les trames ultérieures deviennent des images « manquantes », alors l'animation GIF n'efface jamais de pixels, et l'animation peut être classée comme Animation par superposition.

Compare_Overlay

La dernière méthode de comparaison « [-layers](https://imagemagick.org/command-line-options/#layers) », « **CompareOverlay** », renvoie la zone de pixels qui ont été superposés (ajoutés ou dont la couleur a changé, mais pas effacés) depuis la trame précédente.

  magick canvas_bgnd_coal.gif  -layers CompareOverlay  magick compare_overlay.gif
  gif_anim_montage compare_overlay.gif compare_overlay_frames.gif

[IM Output]

Ceci ressemble à la méthode de composition alpha spécifique à IM « ChangeMask ». Cependant, celle-ci ne renvoie que les pixels qui changent l'image, plutôt que la zone rectangulaire qui a changé. Voir aussi Optimisation de la transparence. Aucune des méthodes de comparaison « [-layers](https://imagemagick.org/command-line-options/#layers) », ni l'opérateur « [-deconstruct](https://imagemagick.org/command-line-options/#deconstruct) », ne regarde ni ne modifie la méthode de suppression GIF utilisée pour l'image. Le résultat n'est qu'une liste d'images, qui n'est pas censée être utilisée comme animation en soi.
_Bien que ces opérateurs soient conçus pour fonctionner avec une séquence d'images fusionnées, ils acceptent une séquence de couches d'images non fusionnée, sans produire d'erreur.

Dans ce cas, chaque trame est superposée sur les trames précédemment superposées à l'aide d'une méthode de composition alpha « [Copy](compose.html#copy) », avant que les trames ne soient comparées. Cette méthode de composition alpha garantit que toute transparence d'une couche sera aussi ajoutée à l'image de destination. Sans cela, ce qui précède ne trouverait pas les pixels effacés vers la transparence dans une séquence d'images fusionnées.

Notez que ceci diffère de la méthode de composition « [Over](compose.html#over) » plus courante que l'opérateur « [-coalesce](https://imagemagick.org/command-line-options/#coalesce) » utiliserait pour gérer le cycle « suppression/superposition » nécessaire à l'affichage d'une animation GIF.

_
---|---


Types d'animations

La plupart des animations GIF que vous rencontrez relèvent de quelques types d'animation fondamentaux. Connaître ces types vous permet de comprendre comment cette animation est affichée d'une trame à l'autre, et peut vous permettre de prendre des raccourcis dans la façon dont vous manipulez et modifiez l'animation.

Animations fusionnées

Une « Animation fusionnée » est essentiellement une séquence d'images qui montre à quoi une animation devrait ressembler lorsqu'elle est affichée à un utilisateur après chaque cycle « suppression/superposition ». Les images sont fondamentalement telles que vous les verriez en regardant une véritable « pellicule de film » de l'animation. C'est la forme simplifiée et totalement non optimisée de n'importe quelle animation. Cette convention de nommage vient du nom de l'opérateur IM « [-coalesce](https://imagemagick.org/command-line-options/#coalesce) » utilisé pour convertir les animations à suppression GIF en une « Animation fusionnée » non optimisée. La plupart des formats vidéo (MPEG, AVI, etc.) sont en fait aussi des « Animations fusionnées » de par leur nature même. Cependant, ceux-ci ont aussi tendance à ne pas comporter de pixels transparents, et ont généralement un délai temporel constant entre les trames de l'animation. Une animation GIF fusionnée peut toutefois avoir des pixels transparents, et des délais temporels très variés, du délai immédiat « 0 » aux délais très rapides, ou très très très lents. Tout réglage de suppression GIF dans une animation fusionnée n'a aucune signification ; cependant, l'opérateur « [-coalesce](https://imagemagick.org/command-line-options/#coalesce) » définira la suppression de manière appropriée afin que la séquence d'images résultante puisse tout de même fonctionner comme une animation GIF valide. Les formats vidéo qui remplacent toujours chaque pixel d'une trame à la suivante peuvent généralement se contenter d'un réglage de suppression GIF « [None](#none) » ou « [Undefined](#none) ». Voici un exemple d'animation qui est aussi, par nature, une Animation fusionnée, ainsi qu'un affichage « [gif_anim_montage](../static/img/scripts/gif_anim_montage) » des trames individuelles de l'animation. [IM Output] [IM Output]
La plupart des animations qui ne contiennent ni n'utilisent de transparence, et qui animent l'ensemble du canevas, sont habituellement enregistrées et distribuées comme des Animations fusionnées.

Animations par superposition

Une « Animation par superposition » est une animation dont chaque trame ne fait que superposer de nouveaux pixels à l'animation actuellement affichée. Autrement dit, à aucun moment de l'animation il n'est nécessaire d'effacer un pixel vers la transparence. Les trames individuelles peuvent contenir de la transparence, soit comme arrière-plan, soit dans le cadre de leur optimisation, mais jamais elle ne rétablit un pixel à la transparence. Bien sûr, si aucune transparence n'est utilisée du tout, alors l'animation est garantie de pouvoir être transformée en une simple Animation par superposition. C'est probablement le type le plus simple d'animation à trames optimisées, et celui qui ne nécessite aucun traitement particulier de la part des clients. Chaque trame montrée à l'utilisateur peut être vue simplement comme une image « aplatie » de toutes les trames précédentes. Toute animation qui n'utilise qu'une méthode de suppression GIF « [None](#none) » est une « Animation par superposition ». Le dernier exemple, par exemple, est non seulement une « Animation entièrement fusionnée » mais aussi une « Animation par superposition », bien que toutes ces « Animations entièrement fusionnées » ne soient pas des « Animations par superposition ». Vous pouvez tester si une animation peut devenir une animation par superposition en utilisant la méthode de couches « [CompareClear](#compareclear) » sur une animation fusionnée, et en vérifiant que la deuxième image et les suivantes sont toutes des « images manquantes ». C'est-à-dire qu'aucun pixel n'a eu besoin d'être effacé ou gommé d'une trame à la suivante. En fait, si une animation peut devenir une animation par superposition, sans modification, alors l'opérateur IM « [coalesce](#coalesce) » n'utilisera que des méthodes de suppression « [None](#none) » pour toutes les trames. Si ce n'est pas le cas, alors « [coalesce](#coalesce) » aura utilisé une suppression « [Background](#background) » pour au moins certaines des trames. Cela vous donne alors un autre test de la capacité « superposition seule ». Les animations par superposition peuvent utiliser la transparence, mais elles n'ont aucune partie mobile sur un arrière-plan transparent. Par exemple, l'animation d'une lettre « K » dessinée à la main est une animation par superposition, car chaque partie ne fait qu'ajouter ou modifier des parties existantes sur un arrière-plan transparent. Elle n'ajoute jamais de nouvelle transparence à l'image résultante (sauf dans le cadre de la première trame). [IM Output] [IM Output]
[IM Output] Cela ne veut pas dire qu'un objet en mouvement ne peut pas être géré par une animation par superposition ; cela signifie simplement qu'il vous faut un arrière-plan non transparent pour pouvoir aussi « effacer » les anciennes positions des parties mobiles sans avoir besoin de transparence. Par exemple, regardez les trames de cette animation « télécharger le monde dans un dossier »…

[IM Output]

Bien sûr, la nécessité d'« effacer » les anciennes parties en superposant l'arrière-plan d'origine signifie que les sous-images superposées sont généralement plus grandes, et donc une taille de fichier d'animation GIF généralement plus grande. Malheureusement, l'usage de l'opérateur Optimize Frame d'IM peut, et va très probablement, transformer une « Animation par superposition fusionnée » en quelque chose qui n'est pas une « Animation par superposition », dans sa tentative de trouver une taille de fichier GIF plus petite. Cependant, en utilisant Deconstruct sur l'animation plutôt que Optimize Frame, vous pouvez garantir que l'animation reste une simple « Animation par superposition », mais seulement si l'animation est réellement une « Animation par superposition ». Si l'animation n'est pas une « Animation par superposition », alors l'opération Deconstruct peut mal tourner (voir Deconstruct ci-dessus). Avec un peu de savoir-faire humain, vous pouvez tout de même mieux optimiser une animation par superposition, par exemple en utilisant les Mises à jour de trame fractionnées, et en appliquant une forme d'optimisation de compression sans détruire l'exigence « superposition seule » de l'animation. En général, les « Animations par superposition » n'affichent aucune transparence (elles peuvent l'utiliser dans le cadre de l'optimisation, mais elles ne l'affichent pas). Et si aucune transparence n'est affichée, alors l'animation est garantie d'être une « Animation par superposition ». Pourquoi les « Animations par superposition » sont-elles si importantes ? Parce qu'il existe des logiciels limités à ce type d'animation. Elles sont bien plus simples à gérer, car seule la superposition est effectuée, sans besoin de gérer la transparence ni d'enregistrer la trame précédente pour gérer les méthodes de suppression GIF. De tels logiciels sont rares, mais existent bel et bien.

Animations à trames effacées

Lorsqu'une animation n'utilise que des suppressions GIF « Previous » ou « Background », vous obtenez un type d'animation très particulier. Notez que si seules des suppressions « Background » sont utilisées, toutes les trames d'une animation sont affichées puis effacées avant que la trame suivante ne soit affichée. De même, lorsque seules des suppressions « [Previous](#previous) » sont utilisées, l'animation est toujours ramenée au canevas effacé initial avant que la trame suivante ne soit affichée, ce qui produit le même effet. La même chose se produit si vous n'utilisez qu'un mélange de ces deux réglages de suppression. C'est-à-dire que les animations qui n'utilisent que ces méthodes de suppression auront des trames qui sont des copies complètes de ce qui doit être affiché. Autrement dit, la trame contient tout ce qui sera affiché à l'utilisateur à cet instant. Cela ne veut pas dire que l'animation est une « Animation entièrement fusionnée ». Car la sous-trame peut être bien plus petite que la zone de canevas virtuel de l'animation, mais tout ce qui se trouve à l'extérieur de cette trame sera considéré comme transparent (ou arrière-plan), ne contenant rien d'important. Par exemple, jetez un œil à cette animation de lapin qui court… [IM Output] [IM Output]
Notez que chacune des sous-trames est l'image complète qui est affichée. Ni plus, ni moins. Remarquez aussi qu'aucune des trames n'a réellement besoin d'utiliser tout le canevas virtuel de l'animation. Et enfin, notez que toutes les suppressions de trame sont définies sur « [Previous](#previous) », qui, pour des raisons que vous verrez ci-dessous, est le réglage de suppression le plus logique à utiliser. Tous les réglages de suppression auraient cependant pu être définis sur une suppression « [Background](#background) », ou n'importe quel mélange des deux, sans changer le résultat final. Faute d'un meilleur nom, j'appelle une telle animation une « Animation à trames effacées », mais je l'ai aussi vue appelée « Animation à suppression Previous ou Background ». Le seul cas où une animation n'est pas de ce type est si au moins une trame non vide de l'animation a utilisé une méthode de suppression « [None](#none) » ou « Undefined » (c'est la même chose). Cette animation est très particulière, car elle peut gérer n'importe quelle quantité d'effacement de transparence, n'importe où dans la séquence d'animation, contrairement à une Animation par superposition. Mais elle peut aussi être superposée sur N'IMPORTE QUELLE image d'arrière-plan statique très rapidement. Pour ce faire, nous devons resserrer légèrement la définition d'une « Animation à trames effacées ». Plus précisément, nous devons nous assurer que toutes les suppressions sont définies sur « [Previous](#previous) » (ce qui est déjà le cas dans notre exemple). Si c'est fait, alors vous pouvez simplement préfixer une image (avec un délai nul) pour placer un arrière-plan en sous-couche. Par exemple, plaçons notre lapin sur de l'herbe…
  magick bunny_grass.gif bunny_anim.gif -loop 0  bunny_on_grass.gif

[IM Output]
Comme vous pouvez le voir, c'est si simple que de nombreuses applications utilisent ce type d'animations GIF pour ajouter des symboles ou d'autres indicateurs (verrous de fichier, smileys, étoiles, etc.) à des objets plus grands. Animer une telle animation GIF est aussi facile, car l'application peut simplement effacer la zone vers une image d'arrière-plan constante et simple, puis superposer la trame suivante de la séquence. Pas besoin de calculer des suppressions, ni de garder la trace d'un affichage « précédent », si ce n'est l'affichage d'arrière-plan statique et immuable. C'est aussi la raison pour laquelle une suppression « [Previous](#previous) » est la suppression préférée pour une Animation à trames effacées. Contrairement à une Animation par superposition, qui n'est qu'un sous-ensemble particulier des animations GIF, TOUTES les animations peuvent être enregistrées comme une Animation à trames effacées. Il suffit de fusionner l'animation, éventuellement de rogner les bords transparents environnants pour l'optimiser au niveau des trames, puis de réinitialiser les suppressions.

  magick any_animation.gif -coalesce -trim \
          -set dispose previous   cleared_frame_animation.gif

Vous pouvez même repositionner l'animation sur cet arrière-plan… |

  magick bunny_grass.gif \( bunny_anim.gif -repage 0x0+5+15\! \) \
          -loop 0  bunny_on_grass2.gif

[IM Output]
Ainsi, une Animation à trames effacées se compose généralement d'un petit objet, en changement ou en mouvement constant, sur un arrière-plan transparent. Celles-ci sont directement utilisables sur des pages web, ou comme symboles animés, ou peuvent être fusionnées avec d'autres animations pour produire des animations bien plus complexes. En résumé, ce type d'animation est un bon style à utiliser dans une bibliothèque de pièces animées, en vue de créer des animations plus grandes et plus complexes.
Il y a toutefois un problème à ajouter ainsi un arrière-plan pour les animations GIF. Si vous regardez les exemples précédents, vous aurez probablement remarqué une pause importante et gênante dans l'animation qui se déplace rapidement. C'est-à-dire que le lapin a disparu un instant, lorsque l'animation a bouclé et que l'image d'arrière-plan a été rechargée. (Voir les notes dans Trames à délai nul.) Bien que ce ne soit pas un problème pour les applications qui utilisent cette technique, pour ajouter des symboles animés aux objets affichés, car elles n'affichent tout simplement pas cette trame « intermédiaire » de toute façon. Ainsi, si vous ajoutez un arrière-plan non transparent à l'animation GIF, il est généralement judicieux de convertir la simple Animation à trames effacées en une Animation par superposition. C'est-à-dire d'ajouter cet arrière-plan à chaque trame de l'animation, plutôt que de donner un canevas initial. Vous pouvez le faire soit en fusionnant l'animation ci-dessus, puis en supprimant la trame d'arrière-plan à délai nul, OU en composant par couches l'animation d'origine sur un arrière-plan statique. Par exemple…

|

  magick bunny_grass.gif \( bunny_anim.gif -repage 0x0+5+15\! \) \
          -coalesce -delete 0 -deconstruct -loop 0  bunny_bgnd.gif
  gif_anim_montage  bunny_bgnd.gif  bunny_bgnd_frames.gif

[IM Output]
[IM Output]

Maintenant que toutes les trames sont affichées aussi bien les unes que les autres, aucune pause ne se voit lors de la réinitialisation de l'arrière-plan. L'animation est cependant désormais une Animation par superposition dont l'arrière-plan est « redessiné » à cause du mouvement de l'objet animé ; sa taille de fichier est donc probablement un peu plus grande. Voir Optimisation de la transparence pour la suite de l'optimisation du résultat ci-dessus. | _Le membre du forum IM el_supremo, Pete, a contribué un script équivalent en MagickWand, exemple de Trame effacée sur un arrière-plan.

Cet exemple est aussi discuté en détail sur le forum IM Creating a Cleared Frame GIF Animation in the MagickWand.

_
---|---

Animations à suppression mixte - animations à multiples arrière-plans

Rien ne vous empêche de mélanger les diverses méthodes de suppression dans une seule animation GIF. En fait, ajouter un arrière-plan à une Animation à trames effacées fait exactement cela. Mélanger les méthodes de suppression n'est pas si simple pour nous, humains, mais le faire peut vous permettre de générer des affichages animés très complexes. En général, ils sont créés dans le cadre de l'optimisation de trame automatique d'une animation particulière. Rappelez-vous simplement que le résultat ne sera pas directement utilisable comme les types d'animation précédents pour des usages spécifiques. En fait, ne soyez pas surpris si certains programmes de gestion de GIF ne gèrent tout simplement pas correctement une « Animation à suppression mixte ». Cela inclut certains des optimiseurs GIF disponibles. Un exemple typique d'« Animation à suppression mixte » est un petit objet en mouvement qui provoque un changement semi-permanent mais temporairement statique dans l'arrière-plan de l'animation. Une balle heurtant un levier en serait un exemple.

_Exemple simple recherché_

De même, les animations impliquant deux très petits objets en mouvement sur un affichage transparent plus grand ne peuvent être bien optimisées qu'en mélangeant les techniques de suppression, de sorte que chaque objet soit déplacé à l'aide de trames d'animation distinctes.

À VENIR,
Une animation plus complexe pour l'étude.
 * Commencer avec un canevas semi-transparent
 * exécuter un peu de suppression 'previous'
 * laisser une trame comme nouveau 'canevas'
 * d'autres animations previous
 * effacer cet 'ajout' à l'aide d'une suppression 'background' définie comme nouveau canevas
 * revenir jusqu'au point de départ.
Cette animation devrait mettre à l'épreuve en profondeur non seulement les méthodes de suppression d'IM
mais aussi les diverses méthodes de suppression des navigateurs.

Si vous souhaitez contribuer un exemple IM d'une telle animation, vous pouvez faire figurer ici votre nom et le lien vers votre page d'accueil !


La fin de la boucle - quand une animation s'arrête

Il est souvent considéré comme une bonne idée de ne pas faire boucler les animations indéfiniment, car les machines clientes doivent travailler en continu tant que l'animation s'anime encore. Il est donc judicieux de réfléchir au nombre de fois où votre animation boucle réellement. Pour l'essentiel…

Ajoutez une limite de boucle à vos animations (si c'est réaliste)

C'est particulièrement vrai pour les grandes animations utilisées comme logo en haut d'une page web. Selon la durée totale d'exécution d'une animation, 10 à 30 boucles suffisent généralement pour les grands logos. Et vous devriez ajouter une limite de boucle à toutes ces animations, pour être bienveillant envers vos utilisateurs. Un réglage d'enregistrement « [-loop](https://imagemagick.org/command-line-options/#loop) » de 0 signifie boucler indéfiniment. C'est généralement ce qui est utilisé, et c'est acceptable pour les petites animations. Certains navigateurs imposent toutefois un arrêt lorsqu'une animation atteint une limite de boucle interne (souvent 256 boucles). Pour les exemples IM, j'ai généralement utilisé un réglage d'enregistrement « [-loop](https://imagemagick.org/command-line-options/#loop) » de « 0 », c'est-à-dire « boucler indéfiniment », car les animations peuvent apparaître n'importe où sur une page. Cela signifie qu'un certain temps peut s'écouler entre le moment où l'utilisateur a chargé une page et celui où il regarde et lit enfin ce qui concerne une animation GIF particulière. Si j'utilisais un plus petit nombre de « boucles », l'animation ne ferait plus ce qu'elle est censée démontrer, perdant de son efficacité. Pour les grandes animations sur les pages d'accueil accrocheuses, un « [-loop](https://imagemagick.org/command-line-options/#loop) » de « 1 », la valeur par défaut normale des animations GIF, peut être utilisé. Cela signifie parcourir l'animation une seule fois, puis s'arrêter. Ce qui nous amène à une question cruciale… S'arrêter où ? Certains navigateurs, comme l'ancien navigateur « Netscape », réaffichaient la première trame de l'animation. La plupart des navigateurs modernes s'arrêtent cependant simplement sur la dernière trame, ignorant le réglage dispose inutile de cette trame. Ce que fait une application particulière dépend toutefois de l'application, car il n'existe pas de véritable standard. En réalité, même l'usage des métadonnées « loop » est lui-même non standard, juste quelque chose que l'ancien navigateur « Netscape » a implémenté, et que tous les navigateurs ultérieurs ont copié. C'est pourquoi, s'il existe une trame précise sur laquelle vous voulez que votre animation s'arrête, disons la trame comportant le nom ou le logo de votre entreprise, alors il est judicieux de faire de cette trame à la fois la première et la dernière trame d'une animation. L'une de ces trames devrait toutefois recevoir un « délai nul », afin de ne pas affecter la durée totale de bouclage de l'animation. Donc, pour résumer…

Si le nombre de boucles est limité, ajoutez la trame d'« arrêt » comme première ET dernière trame.


Trames intermédiaires à délai nul

Nous avons déjà vu l'usage d'une trame ayant un « délai nul », à propos des Animations à trames effacées. Je les ai aussi utilisées pour expliquer les suppressions Previous et Background. Ces trames spéciales sont en réalité bien plus courantes que les gens ne le pensent probablement. Elles représentent non seulement des méthodes pour préfixer un « canevas » d'arrière-plan à une animation (comme je les ai utilisées ci-dessus). Mais elles sont aussi indispensables à certaines des techniques d'optimisation de trame plus complexes, telles que le doublement de trames et le fractionnement des mises à jour de trame. Un autre usage (très ancien, antérieur au format PNG) consistait à vous permettre de créer des images GIF statiques contenant plus que la limite de 256 couleurs ! C'est-à-dire que chaque trame fournit 256 couleurs, et la trame suivante l'ensemble suivant de 256 couleurs, le tout avec un délai nul et sans bouclage à la fin. Merci à TLUL dans la discussion Creating unquantized GIFs de l'avoir signalé. Ces « trames intermédiaires à délai nul » ne sont pas censées être affichées à un utilisateur. Elles servent simplement à créer des effets spéciaux dans les images GIF qui, sinon, ne seraient pas possibles ou seraient mieux optimisés qu'ils ne le seraient sans elles. En résumé…

Les trames à délai nul sont des trames intermédiaires,
elles ne sont pas censées être visibles par les utilisateurs.

Non seulement ImageMagick crée de telles trames dans les animations dans le cadre de son « OptimizePlus » automatique, mais il fournit aussi un moyen de les supprimer à l'aide de la méthode de couches « RemoveZero ». Faites-y attention, car elles compliquent souvent votre manipulation des animations. Bon, elles sont donc importantes, et alors ? Parce que de nombreuses applications ne les aiment pas, ou les gèrent incorrectement. Elles considèrent les « trames à délai nul » comme une mauvaise chose, même lorsque vous les ajoutez délibérément aux animations, pour une raison ou une autre. Voici un résumé des applications qui, à ma connaissance ou d'après ce qu'on m'a dit, « font ce qu'il ne faut pas »… Gimp | N'enregistre pas de « trame à délai nul » : elle ajoute toujours un délai temporel minimal à toute trame ayant un délai temporel nul. :-(

---|---
FireFox | Donne une légère pause non nulle sur de telles trames. C'est vraisemblablement pour que les animations qui n'ont aucun délai temporel du tout n'utilisent pas tous les cycles CPU de l'ordinateur. Mais « firefox » n'assouplit toujours pas cette restriction même si une animation a un temps d'affichage global non nul.

Internet Explorer | A un délai temporel minimal de 6 centisecondes, et ignore tout délai plus petit que cela. Internet Explorer version 8 échoue aussi (redémarre immédiatement la boucle) si une trame d'image dépasse les limites d'animation définies par la première trame. Cela, je le classerais comme un bug majeur.
D'un autre côté, la méthode de couches « RemoveZero » d'ImageMagick fait, elle, ce qu'il faut, et ne supprimera AUCUNE trame si TOUTES les images ont un « délai temporel nul ». En fait, cette méthode de couches émettra un avertissement si elle voit une animation sans aucun délai temporel. Cela nous amène à une autre règle empirique…

N'enregistrez jamais une animation GIF (bouclée) qui n'a aucun « délai » du tout

Le faire est une très mauvaise pratique, et la raison pour laquelle la plupart des applications « boguées » ci-dessus font ce qu'elles font, plutôt que ce qu'elles devraient faire. Plaignez-vous auprès des propriétaires si vous en voyez. Plaignez-vous aussi auprès des développeurs d'applications, afin qu'ils gèrent correctement les trames à délai nul. Même si cela signifie ne pas afficher cette trame du tout, mais simplement s'en servir comme préparation de la trame suivante à afficher. Après tout, elles sont à l'écran pendant un temps NUL !