⚠️ Este es un sitio de traducción no oficial, sin relación con ImageMagick Studio LLC. Para información autorizada, consulte la página original (https://usage.imagemagick.org/anim_basics/index.html).

Ejemplos de ImageMagick -- Conceptos básicos de animación

Ejemplos de ImageMagick: prefacio e índice
Animaciones GIF y metadatos de animación
Métodos de descarte de fotogramas

Animaciones GIF y metadatos de animación

La forma predeterminada en que ImageMagick gestiona la salida de una lista de imágenes es generar una imagen de varias páginas. Para el formato de imagen GIF, sin embargo, esto adopta la forma especial de una «animación 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]
Aquí tiene un ejemplo de «destellos» más avanzado que usa un script de shell «[star_field](../static/img/scripts/star_field) ». Este script surgió de mis experimentos generando campos de estrellas aleatorios. |

  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]
Básicamente se generan tres campos de estrellas aleatorios, con el tamaño adecuado, y luego se superponen sobre nuestra imagen, la «rose:» integrada de IM, usando una composición alfa «[Screen](compose.html#screen)» para aclarar la imagen con los patrones de estrellas dados. Después, todo el conjunto se pasa por el optimizador general de animaciones GIF de IM. Lo anterior puede parecer complejo, ya que usa algunas funciones avanzadas de IM que aún no he presentado, pero el resultado es una animación de tres fotogramas relativamente sencilla, aunque bien optimizada. También puede ver algunas de las animaciones más complejas que se crearon con sencillos scripts de shell en Animaciones de distorsión. Hay unos cuantos ajustes adicionales de IM creados específicamente para usarse en animaciones GIF, y conocerlos es el primer paso para adentrarse en el mundo de las animaciones GIF... [**-dispose**](https://imagemagick.org/command-line-options/#dispose) {method}


| Qué deben hacer las imágenes siguientes con los resultados previos de la animación GIF. Las opciones válidas son «Undefined», «[None](#none)», «[Previous](#previous)» y «[Background](#background)». (Véase más abajo la explicación de los ajustes)
[**-loop**](https://imagemagick.org/command-line-options/#loop) {number} | Número de veces que la animación GIF debe recorrer la secuencia de imágenes antes de detenerse. Es un ajuste de «escritura de imagen» de salida, por lo que puede definirse en cualquier punto de la línea de comandos, aunque solo se usará el último de tales ajustes. Normalmente se establece de forma predeterminada en cero (bucle infinito); sin embargo, si alguna imagen leída tiene un valor distinto, este ajuste tomará el valor de esa imagen. Por ello, recomiendo que siempre defina «[-loop](https://imagemagick.org/command-line-options/#loop)» al crear una animación GIF, después de leer todas las imágenes. Para más información, véase El final del bucle más abajo.
[**-delay**](https://imagemagick.org/command-line-options/#delay) {time} | Establece el retardo de tiempo (en centésimas de segundo) que se hará la pausa tras dibujar las imágenes que se leen o se crean después de definir este ajuste. Puede especificar una escala distinta para el retardo indicando un factor «x» (dado en tics por segundo). Por ejemplo, «10x1» son 10 tics de 1 segundo, mientras que «10x100» son 10 tics de una centésima de segundo. Básicamente, la «x» equivale a un signo de fracción «/». Por ejemplo, si especifica «1x160» establecerá un retardo apropiado para 160 fotogramas por segundo. | | Los retardos de las animaciones GIF deben especificarse en centésimas de segundo para que funcionen correctamente, motivo por el que esa es la unidad de tiempo predeterminada. El factor «x» se usa más para generar otros formatos más cinematográficos, como MNG y AVI.
---|---
[**-set**](https://imagemagick.org/command-line-options/#set) dispose {method} [**-set**](https://imagemagick.org/command-line-options/#set) delay {time}
| Mientras que los ajustes de opción anteriores establecen atributos de imagen en las imágenes recién creadas, o en las que se leen, después de indicar esa opción, la opción «[-set](https://imagemagick.org/command-line-options/#set)» es un operador que le permite establecer atributos de imagen en todas las imágenes que ya están en la secuencia de imágenes actual. Esto le permite cambiar el ajuste en toda una animación, o en un solo fotograma, después de que las imágenes se hayan cargado o modificado.
[**-page**](https://imagemagick.org/command-line-options/#page) {w}x{h}+{x}+{y}
| Esto le permite establecer la posición de desplazamiento de la imagen que está a punto de leerse. Como es una opción de ajuste, solo aplica la geometría que indique a las imágenes que siguen al ajuste. No afecta a las imágenes ya leídas en memoria. Si no se indica, o se desactiva con «[+page](https://imagemagick.org/command-line-options/#page)», se conservará el desplazamiento de la imagen leída. Si la imagen no tiene desplazamiento, se situará en «+0+0», es decir, en la esquina superior izquierda del lienzo de trabajo o «página». También puede usarse para definir un lienzo de trabajo más grande, especificando un ancho «x» alto. Solo se usará el ajuste de ancho y alto de página de la primera imagen de la secuencia para fijar el tamaño global del lienzo de la animación GIF; todos los demás ajustes de tamaño de página se ignorarán cuando la animación se escriba finalmente. Cuando se lee una animación GIF, el tamaño del lienzo se establece en todos los fotogramas de la animación. Las animaciones MNG pueden guardar desplazamientos de fotograma, pero no guardan tamaños de lienzo. El tamaño de la primera imagen define el tamaño del lienzo de toda la animación. | | _El formato de imagen GIF no puede especificar un desplazamiento negativo para las imágenes de un lienzo. Si intenta usar un desplazamiento negativo, IM lo restablecerá a cero cuando esa imagen (o fotograma de animación) se escriba en un archivo GIF.

Los desplazamientos positivos mayores que el lienzo de la imagen son perfectamente válidos, pero pueden hacer que la imagen no aparezca en el área de dibujo del lienzo al mostrarse con magick. La forma en que un programa de visualización de animaciones GIF gestiona esto es indefinida. Se recomienda precaución._
---|---
[**-repage**](https://imagemagick.org/command-line-options/#repage) {w}x{h}+{x}+{y}
| Esto es exactamente igual que «[-page](https://imagemagick.org/command-line-options/#page)», salvo que es un operador de imagen en lugar de un ajuste. Eso significa que puede usarlo para cambiar o restablecer la «geometría de página» de una imagen o fotograma de animación que ya se ha leído en memoria. La forma más simple «[+repage](https://imagemagick.org/command-line-options/#repage)» se limita a restablecer la «geometría de página» de todas las imágenes a la imagen real de cada fotograma de la secuencia de imágenes actual, con un desplazamiento cero y el tamaño real de la imagen. Esta operación es esencial cuando extrae los fotogramas individuales de una animación (véanse los Ejemplos de Adjoin más abajo). Sin embargo, «[+repage](https://imagemagick.org/command-line-options/#repage)» destruirá mucha información de posicionamiento almacenada en cada imagen, así que probablemente también debería extraer esa información a un archivo aparte para reutilizarla más tarde. Véase Información de la lista de animación más abajo.

Punto importante

NO guarde directamente en GIF las animaciones intermedias que aún no haya terminado de procesar. Puede usar el formato interno MIFF de IM como formato de archivo temporal si desea trabajar en una animación en una serie de pasos de procesamiento separados. Lo repito...

No use GIF como formato de archivo intermedio; use MIFF en su lugar

Si cometiera el gran error de guardar en GIF, simplemente habría empeorado la animación resultante, ya que IM habría aplicado una cuantización de color automática para reducir el número de colores presentes. Y no solo eso, sino que lo hizo en cada fotograma de forma completamente independiente del resto, dificultando aún más cualquier procesamiento posterior, en particular cualquier optimización de GIF. Resolver esto es un problema complejo y de varios niveles, que se examina en la sección siguiente, Optimización de animaciones.


Métodos de descarte de fotogramas

Lo primero con lo que tropieza quien crea animaciones GIF es el ajuste «[-dispose](https://imagemagick.org/command-line-options/#dispose)». No es de extrañar, ya que es un ajuste complejo. Peor aún, muchos programas de animación, incluidos numerosos navegadores web, no siempre gestionan correctamente el metadato de descarte de GIF. Sin embargo, usar el descarte adecuado puede marcar una gran diferencia en lo bien que funciona y se optimiza su animación. Lo primero que hay que recordar en ImageMagick es que casi todas las opciones especiales de animación son ajustes para la lectura de imágenes. Es decir, se aplican a las imágenes que se leen después de indicar el ajuste. El ajuste «[-loop](https://imagemagick.org/command-line-options/#loop)» es el único que se suele usar después de completar la animación, justo antes de guardarla. La tarea básica de «[-dispose](https://imagemagick.org/command-line-options/#dispose)» define cómo debe eliminarse una imagen después de haberse mostrado durante su periodo de «[-delay](https://imagemagick.org/command-line-options/#delay)». Es decir, debe indicar los ajustes «[-dispose](https://imagemagick.org/command-line-options/#dispose)» y «[-delay](https://imagemagick.org/command-line-options/#delay)» de una imagen antes de leer la imagen de ese fotograma. Pero la acción se aplica después de mostrar esa imagen. Esto resulta algo contraintuitivo, pero tiene sentido en la forma en que IM opera sobre las imágenes. Si lo recuerda, no debería tener problemas. Las formas con «más» de estas opciones, como la mayoría de los demás ajustes de IM, impiden que el ajuste se aplique a las imágenes que se leen. Eso significa que, si no especifica un ajuste, el fotograma seguirá usando el ajuste con el que se leyó la imagen (si lo hubiera). Esto puede ser importante más adelante, cuando quiera leer una animación GIF para procesarla más, o al fusionar una animación GIF dentro de otra (la técnica de animación más difícil).

Dispose None - cada fotograma se superpone en secuencia

El ajuste «[-dispose](https://imagemagick.org/command-line-options/#dispose)» predeterminado para las animaciones GIF es «**Undefined**», que la mayoría de los programas de animación tratan igual que un ajuste de descarte «**None**». Básicamente, esto le indica al ordenador que deje tal cual lo que este fotograma concreto superponga. O, con más precisión, «no hacer nada». No obstante, tenga en cuenta que todo el lienzo siempre se borra al final de la secuencia de animación, antes de que vuelva a empezar el bucle y se repita. Aquí tiene, por ejemplo, una animación estándar con descarte «None»... |

  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]
Esta técnica de descarte es ideal para animaciones que no implican ninguna forma de transparencia, como las animaciones dibujadas sobre un fondo sólido o con patrón. |

  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]
Tenga en cuenta que esta técnica solo puede añadir colores visibles a una animación. Nunca puede volver a hacer transparente ninguna parte de una animación. (Véase Animaciones por superposición más abajo). Para gestionar también la transparencia hay que usar alguno de los otros tipos de métodos de descarte.

Dispose Previous - conservar el lienzo de fondo

El método de descarte «**Previous**» es relativamente sencillo. Cuando la imagen actual termina, devuelve el lienzo al aspecto que tenía antes de superponer la imagen. Si el fotograma anterior también usó un método de descarte «Previous», el resultado será el mismo que tenía antes de ese fotograma... y así sucesivamente... etc... etc... Por ejemplo, en esta animación, cada uno de los fotogramas posteriores volverá al primer fotograma de la imagen, que tiene un ajuste de descarte «[None](#none)», antes de superponer la imagen asociada a ese fotograma. El resultado es un lienzo de fondo sobre el que cada fotograma se superpone solo durante la duración de esa imagen... |

  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]
Observe el método «[None](#none)» de «[-dispose](https://imagemagick.org/command-line-options/#dispose)» usado para la primera imagen. Esto es importante; de lo contrario, el fotograma «previo» retrocedería hasta el lienzo vacío original presente antes del primer fotograma. Observe también que usé un «[-delay](https://imagemagick.org/command-line-options/#delay)» de «0» en la animación anterior. Esto indica que no hay que esperar antes de superponer el primer fotograma sobre este «lienzo de fondo». Sin él, vería un breve retardo en el que se muestra solo la imagen del lienzo sin nada encima. Por supuesto, todavía necesito establecer un «[-delay](https://imagemagick.org/command-line-options/#delay)» mayor para las imágenes posteriores, o aparecerían y desaparecerían en un abrir y cerrar de ojos y, de paso, consumirían muchos ciclos de CPU del espectador. El uso del método de descarte «Previous» puede ser propenso a un ligero parpadeo, o pausa, en algunos navegadores web, sobre todo en máquinas más lentas. Aunque eso se ve muy raramente hoy en día, el parpadeo en sí sigue presente, y es algo que considero un error. Véase Fotogramas con retardo cero más abajo para más detalles. Pocas animaciones usan un estilo de animación con descarte «previous»; la razón es que resulta muy difícil de optimizar para los ordenadores. El problema es: ¿qué fotograma debería elegir el ordenador para convertirlo en la imagen de fondo? Para los humanos es sencillo deducir cuál es la mejor imagen, pero difícil de decidir para un ordenador. La mejor imagen de fondo para una animación puede que ni siquiera esté pensada para mostrarse, como en el ejemplo actual, y por tanto puede que no exista en una versión sin optimizar de esa animación.

Dispose Background - borrar hasta el fondo

Mientras que los dos primeros métodos de «[-dispose](https://imagemagick.org/command-line-options/#dispose)» son relativamente sencillos, el de «**Background**» es probablemente el más difícil de entender. Cuando termina el retardo de tiempo de un fotograma concreto, se borra el área que ese fotograma superpuso. No todo el lienzo, solo el área que se superpuso. Una vez hecho esto, el lienzo resultante es el que se pasa al siguiente fotograma de la animación para que la imagen de ese fotograma se superponga. Aquí, por ejemplo, simplemente sustituimos cada fotograma por el siguiente. |

  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]
Para que vea exactamente lo que ocurre, añadamos una imagen de lienzo inicial a la animación, de modo que pueda ver cómo «Background» «descarta» realmente ese fotograma de la visualización de la animación. |

  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]
Como puede ver, a medida que se descarta cada fotograma superpuesto, el área de ese fotograma se borra hasta la transparencia antes de superponer la siguiente imagen. Esta es la importancia de este método de descarte GIF, ya que es la única forma en que las animaciones GIF pueden borrar cualquier píxel, sin importar el historial de fotogramas de una animación. La única otra forma de borrar píxeles es usar «[Previous](#previous)» para volver a un fotograma en el que esos píxeles estuvieran borrados. Pero eso depende de conocer el historial de la secuencia de animación, lo que lo hace mucho más difícil de optimizar para los ordenadores. | _Hay quien opina que, en lugar de borrar el área superpuesta hasta el color transparente, este descarte debería borrarla hasta el ajuste de metadato de color de «fondo» almacenado en la animación GIF. De hecho, el antiguo navegador «Netscape» (versiones 2 y 3) hacía exactamente eso. Pero también dejó de implementar correctamente el método de descarte «Previous».

Por otro lado, el lienzo inicial también debería establecerse a partir del color de «fondo» del formato, y eso tampoco se hace. Sin embargo, todos los navegadores web modernos borran solo el área que se superpuso por última vez hasta la transparencia, así que esta es ahora la práctica aceptada y lo que IM sigue ahora._
---|---
| _Antes de la versión 6.2.6-1 de IM, las operaciones «[-coalesce](https://imagemagick.org/command-line-options/#coalesce)» y «[-deconstruct](https://imagemagick.org/command-line-options/#deconstruct)» de IM no gestionaban las animaciones que usaban el descarte «Background» para hacer píxeles transparentes, como hacen todos los navegadores web principales. Véanse Errores de animación para ejemplos y detalles.

Sin embargo, estas funciones sí funcionaban bien cuando no se aplicaba ni se pretendía ningún borrado de píxeles. Esto se ha corregido para «[-coalesce](https://imagemagick.org/command-line-options/#coalesce)» y se creó el método «[-layers](https://imagemagick.org/command-line-options/#layers) [OptimizeFrame](anim_opt.html#optframe)» para sustituir el uso de «[-deconstruct](https://imagemagick.org/command-line-options/#deconstruct)» como función de optimización de fotogramas de animación GIF._
---|---


Estudiar animaciones

Antes de poder continuar con los conceptos básicos de la animación GIF, sus tipos, optimizaciones y técnicas de manejo, necesitamos algunas técnicas para estudiar animaciones existentes.

Identify - información sobre una animación

Ahora bien, una animación consta de mucha información empaquetada en cada fotograma individual. Puede ver parte de esta información con el comando «[identify](basics.html#identify)» predeterminado de IM.

  magick identify canvas_prev.gif

[IM Text]

| Si no vio una salida como la anterior, su IM es un poco antiguo y de verdad debería actualizar la versión instalada de ImageMagick a la última. Si no lo hace, se perderá muchos de los nuevos avances en el manejo y el control de las animaciones GIF de IM.
---|---
Como puede ver, la imagen guardada para el segundo fotograma y los posteriores es de solo 32x32 píxeles, pero todos los fotogramas se asientan sobre un «lienzo virtual» de 100x100 píxeles con un «desplazamiento virtual» en ese lienzo mayor. Para ver más de los distintos fragmentos de metadatos presentes, debe usar algunos de los formatos de escape con porcentaje más especializados para que IM los muestre.

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

[IM Text]

Lo cual muestra con claridad no solo el tamaño del lienzo, el tamaño de la imagen y el desplazamiento, sino también el descarte y los retardos de tiempo usados para cada fotograma individual. Observe cómo el primer fotograma tiene el descarte y el retardo de tiempo distintos que se necesitaban para el uso correcto del método de descarte «Previous» posterior.

Adjoin - separar una animación en fotogramas

Ahora, como vio antes, ImageMagick intentará de forma predeterminada guardar varias imágenes en un solo archivo si ese formato lo permite. Sin embargo, como se explicó en Escribir una lista de varias imágenes, IM le permite usar el ajuste «[+adjoin](https://imagemagick.org/command-line-options/#adjoin)» para indicarle que guarde cada imagen en disco como una imagen individual separada. Por ejemplo, aquí leemos una de las animaciones GIF y mostramos las imágenes de los fotogramas individuales de la secuencia de animación.

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

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

Si examinara las imágenes anteriores, comprobaría que, aunque la mayoría de los navegadores web muestran un área mayor de 100x100 en la que aparece cada subfotograma, en realidad la mayoría de las imágenes reales mostradas son de solo 32x32 píxeles, igual que se mostró en los comandos «identify» anteriores. Es decir, la mayor parte del área es simplemente un lienzo en el que no se dibuja nada, conocido como la «geometría de página» o «lienzo virtual» de la imagen. La primera imagen de la animación define ese «lienzo» mayor y cada uno de los demás fotogramas define una posición de «desplazamiento» en ese lienzo mayor. Esta información adicional se conserva en los fotogramas guardados con el ajuste «[+adjoin](https://imagemagick.org/command-line-options/#adjoin)». Y así, puede reconstruir fácilmente la animación GIF. No solo se conserva la información de página en cada imagen de fotograma separada, sino también cualquier ajuste de retardo, bucle y descarte GIF. Esto significa que, para reconstruir la animación, solo necesita leer todas las imágenes. |

  magick frame_???.gif  anim_rebuilt.gif

[IM Output]
A veces, sin embargo, no quiere conservar esta información de geometría de página. Por ejemplo, si quiere usar los fotogramas individuales para otros proyectos. Puede restablecer el tamaño y el desplazamiento de página con la opción «[+repage](https://imagemagick.org/command-line-options/#repage)», para eliminar la información del «lienzo virtual» y dejar solo la imagen real.
Normalmente, al extraer subimágenes de una animación, también suele restablecer los ajustes de retardo y descarte de las imágenes para asegurarse de que no interfieran con la edición y la visualización. Por ejemplo, aquí elimino el lienzo virtual y el desplazamiento no deseados y restablezco los retardos de tiempo y los descartes.

  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]

Por supuesto, si desecha esos metadatos, necesita alguna forma de registrar y editar esos datos. Véase Información de la lista de animación (más abajo) para un script que extrae tanto las subimágenes como guarda los metadatos de la animación, en una forma que puede usarse para reconstruir la animación.

Coalesce - completar los fotogramas por entero

Sin embargo, ver una animación en forma de subfotogramas no suele ser muy útil en una animación típica. Por un lado, una animación muy optimizada puede constar de muchas partes muy pequeñas, sin ninguna indicación visual de cómo encajan entre sí. También puede tener mucho otro «ruido» añadido para la optimización de compresión con el fin de reducir el tamaño total del archivo de la animación. Por ejemplo, resulta muy difícil averiguar qué hacía realmente esta animación con solo mirar los subfotogramas individuales de la animación.

  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]

La operación «[-coalesce](https://imagemagick.org/command-line-options/#coalesce)» convierte básicamente una imagen en exactamente lo que debería verse en la animación después de que el fotograma anterior se haya descartado correctamente y se haya superpuesto el siguiente subfotograma. Es decir, en lugar de una secuencia de animación donde cada fotograma solo representa los cambios superpuestos respecto al fotograma «descartado» anterior, este operador crea una vista completa de la animación en cada punto, un poco como una verdadera tira de película, en lugar de una secuencia de animación. Tal secuencia, conocida como animación coalescida, es mucho más fácil de estudiar, editar, modificar y reoptimizar. Aquí, por ejemplo, generaremos un montaje de la misma secuencia de animación «confusa» que mostré antes, pero esta vez «[-coalesce](https://imagemagick.org/command-line-options/#coalesce)» las secuencias, para que pueda ver lo que realmente ocurre. |

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

[IM Output]

[IM Output]

Como puede ver, el resultado es como una tira de película de la animación, que le permite ver con claridad cómo encajan las piezas anteriores para formar una letra «K» dibujada a mano. A partir de la versión 6.2.6 de IM, el comando «magick montage» entendía el uso de «[-coalesce](https://imagemagick.org/command-line-options/#coalesce)», lo que le permite crear una imagen tipo «tira de película» de los fotogramas de la animación, exactamente como se mostró antes. Esta versión también contenía correcciones para coalesce, y cualquier trabajo con animaciones GIF debería usar al menos esta versión (o, mejor aún, la última). En la siguiente sección de ejemplos se ofrece una técnica de montaje aún mejor para examinar animaciones.
El ajuste «[-dispose](https://imagemagick.org/command-line-options/#dispose)» de una secuencia de imágenes coalescida es en realidad irrelevante en una animación coalescida. Sin embargo, para tranquilidad de los usuarios, el operador «[-coalesce](https://imagemagick.org/command-line-options/#coalesce)» establecerá el ajuste «[-dispose](https://imagemagick.org/command-line-options/#dispose)» de cada fotograma en «[None](#none)» o «[Background](#background)» según corresponda, de modo que la secuencia de imágenes coalescida siga animándose correctamente (como se mostró antes). _Un fotograma con un descarte «[Background](#background)» significa que el siguiente fotograma necesitaba borrar al menos uno o más píxeles para mostrarse correctamente.

Por ello, las animaciones en las que «[-coalesce](https://imagemagick.org/command-line-options/#coalesce)» añadió un descarte «[Background](#background)» no pueden guardarse como una simple animación por superposición (véase más abajo).

Técnicamente, puede establecer todos los ajustes de descarte de una secuencia de imágenes coalescida en «[Background](#background)» o «[Previous](#previous)» para generar una animación de fotograma borrado (véase más abajo). Aunque no todas las animaciones se optimizarán bien en esa forma._
---|---
También hay algunos usos del operador «[-coalesce](https://imagemagick.org/command-line-options/#coalesce)» ajenos a la animación. Véanse los ejemplos de Coalesce y aplanado progresivo sobre estos usos.

Montaje de fotogramas de animación - el script «gif_anim_montage»

Mientras que el operador «[+adjoin](https://imagemagick.org/command-line-options/#adjoin)» le permite extraer las imágenes reales de una animación y «[-coalesce](https://imagemagick.org/command-line-options/#coalesce)» le permite ver los fotogramas resultantes de la animación, ambos métodos dejan fuera mucha información sobre la animación. Mediante una manipulación muy cuidadosa de las imágenes de la animación, puede mostrar los fotogramas de modo que se vean no solo los fotogramas reales, sino también la colocación de esos fotogramas en el lienzo mayor. Aquí tiene uno de tales métodos para mostrar una animación.

  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]

Aquí puede ver con claridad cómo funciona la animación. Cada imagen de subfotograma se sitúa de modo que se sume a todas las superposiciones anteriores. El resultado es una imagen que crece lentamente. Cada fotograma es también mucho menor que el «lienzo virtual» sobre el que se sitúa. Yo uso esta técnica de visualización mucho durante el desarrollo y la depuración de animaciones GIF, así que la convertí en un script de shell «[gif_anim_montage](../static/img/scripts/gif_anim_montage) » y lo amplié para que también enumere algunos de los detalles sobre cada fotograma de la animación.

  gif_anim_montage   script_k.gif   script_k_frames.gif

[IM Output]

Observe las variaciones en las temporizaciones usadas en distintos fotogramas, para hacer pausas como si se levantara el bolígrafo del papel y se recolocara. Las animaciones con temporización variable pueden ser de las más interesantes, pero también de las más difíciles de manejar, como verá en páginas posteriores de los ejemplos de IM. El script «[gif_anim_montage](../static/img/scripts/gif_anim_montage)» tiene también la opción especial «-u», que además subpondrá una copia semitransparente de la animación coalescida. Esto le permite ver cómo los nuevos subfotogramas modifican la animación mostrada.

  gif_anim_montage  -u  script_k.gif  script_k_frames.png

[IM Output]

Por supuesto, esto tiene píxeles semitransparentes, por lo que se necesitaba un formato de imagen «PNG», O bien podría usar una de las muchas opciones de «fondo» que también ofrece ese script, lo que le permite usar formatos GIF o incluso JPEG para la imagen resumen resultante de la animación. Otras opciones le permiten definir el número de filas o columnas a usar, así como establecer varios fondos no transparentes, o usar un recuadro rojo en lugar del negro predeterminado. Este script se usará mucho en las próximas páginas de los ejemplos de IM. Las sugerencias y los comentarios son bienvenidos.

Información de la lista de animación - opciones usadas para construir una animación

Como señalé, usar «[+adjoin](https://imagemagick.org/command-line-options/#adjoin)» y «[-coalesce](https://imagemagick.org/command-line-options/#coalesce)», así como «[+repage](https://imagemagick.org/command-line-options/#repage)», son todos métodos útiles para extraer y examinar animaciones GIF. Sin embargo, todos destruyen en el proceso información sobre la animación original. Puede ver esta información adicional sobre encuadre, retardos de tiempo, descarte de fotogramas, etc., con el comando «magick identify» de IM y la opción «[-verbose](https://imagemagick.org/command-line-options/#verbose)». Sin embargo, yo, y probablemente la mayoría de los demás usuarios, encuentro la salida de este comando abrumadora y no realmente utilizable de forma directa. Aquí es donde entra otro script de shell especial que escribí. El script «[gif2anim](../static/img/scripts/gif2anim) » separará los fotogramas individuales de la animación, pero también averiguará exactamente qué opciones de «magick» de IM necesitaría para reconstruir la animación a partir de esas imágenes. Puede pensar en «[gif2anim](../static/img/scripts/gif2anim)» como un desensamblador de animaciones, que produce un resumen de la animación en términos de opciones de IM. Por ejemplo, decodifiquemos el ejemplo de animación que hemos venido usando para recuperar los ajustes originales de «magick» usados para crearlo, así como las imágenes individuales usadas... |

  gif2anim canvas_prev.gif

[IM Text]

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

De forma predeterminada, el script «[gif2anim](../static/img/scripts/gif2anim)» usa el mismo nombre base de archivo para las imágenes individuales y para el archivo de opciones «.anim». Así, el archivo de secuencia de animación generado por el comando anterior se llama «[canvas_prev.anim](https://usage.imagemagick.org/anim_basics/canvas_prev.anim)», con las imágenes de fotogramas individuales «[canvas_prev_001.gif](../static/img/anim_basics/canvas_prev_001.gif)» a «[canvas_prev_005.gif](../static/img/anim_basics/canvas_prev_005.gif)». Si examina los resultados más de cerca, verá que de hecho logró recrear las opciones originales que usé cuando creé por primera vez esta animación GIF (véase Animación con descarte Previous). Además, aunque no es importante para generar realmente una animación, el tamaño y las temporizaciones de los fotogramas superpuestos también se enumeran como comentario, para facilitar su estudio. En lugar de guardar los resultados en un archivo, puede limitarse a listar en pantalla las opciones de la secuencia de animación usando un indicador «-l». Es decir, solo se muestra el archivo de secuencia de animación, en vez de guardarlo a él o a las imágenes de fotogramas individuales de la animación.

  gif2anim -l canvas_prev.gif

Dado un archivo «.anim» y las imágenes de encuadre individuales, puede usarse un script complementario «[anim2gif](../static/img/scripts/anim2gif) » para reconstruir la animación. |

  anim2gif canvas_prev.anim

[IM Output]
«[anim2gif](../static/img/scripts/anim2gif)» recreará de forma predeterminada la animación GIF con un sufijo «_anim.gif». Puede ver que la animación «[canvas_prev_anim.gif](../static/img/anim_basics/canvas_prev_anim.gif)» resultante se ve y funciona exactamente como la animación original. Este script simplemente sustituye la cadena especial «BASENAME» usada en el «archivo de secuencia de animación», elimina todos los comentarios y luego pasa las opciones de convert restantes al comando «magick». En otras palabras, trata el archivo anterior como una especie de script de «convert» con comentarios. La razón por la que se usó una cadena especial es que esto le permite especificar un nombre base de archivo distinto del nombre del propio archivo «.anim». De ese modo puede usar un conjunto de imágenes de fotograma completamente diferente, como versiones modificadas de las originales, para recrear una animación distinta de la antigua. Esta es una función muy útil que se usará en el procesamiento de animaciones más complejo. (Véase Concatenar animaciones lado a lado para un ejemplo). Al igual que «[gif2anim](../static/img/scripts/gif2anim)», el script «[anim2gif](../static/img/scripts/anim2gif)» tiene bastantes opciones útiles para ayudarle a procesar y modificar animaciones. Algunas de estas opciones se usarán más adelante. Por ejemplo, véase Concatenar animaciones. Además, como el archivo «.anim» es texto plano, puede usarlo para tomar las imágenes decodificadas de una animación y ajustar los metadatos del GIF, como las temporizaciones, las posiciones, las secciones que se repiten de una animación, o añadir nuevos fotogramas e imágenes a una animación. Esta fue, después de todo, la razón por la que escribí originalmente los scripts, mucho antes de involucrarme con los ejemplos de IM. Por ahora, «[gif2anim](../static/img/scripts/gif2anim)» será más útil para examinar una secuencia de animación y ver justo lo que ocurre, y las temporizaciones que se aplican entre fotogramas.

Dispose Images - la forma de descarte GIF de los fotogramas

Este método especial de «[-layers](https://imagemagick.org/command-line-options/#layers)», «**Dispose**», muestra el aspecto que debería tener el fotograma después de que termine el retardo de tiempo y se haya aplicado el método de descarte GIF, pero antes de superponer la imagen del siguiente fotograma. En otras palabras, muestra exactamente lo que el ajuste del método «[-dispose](https://imagemagick.org/command-line-options/#dispose)» de GIF hace realmente al fotograma, lo que le permite averiguar exactamente qué va mal en su animación. Por ejemplo, así es como se ve cada una de nuestras tres animaciones de ejemplo de métodos de descarte después de aplicar el método de descarte de cada fotograma individual. Recuerde que cada una de estas animaciones consta de una «imagen de lienzo» establecida con un ajuste «[-dispose](https://imagemagick.org/command-line-options/#dispose)» de «[None](#none)», seguida de cuatro imágenes más pequeñas superpuestas y luego descartadas por los distintos métodos de descarte GIF. Animación con descarte «[None](#none)»...

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

[IM Output]

Animación con descarte «[Previous](#previous)»...

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

[IM Output]

Animación con descarte «[Background](#background)»...

  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 estudia lo anterior, podrá ver exactamente cómo cada uno de los tres métodos de descarte GIF borra de la animación la imagen superpuesta de ese fotograma. Observe que el primer fotograma de estas tres animaciones siempre se establece con un descarte «None», por lo que permanecerá sin cambios. Lo importante es el efecto del método de descarte en los fotogramas posteriores. La operación «-layers Dispose» solo genera la secuencia «coalescida» de los fotogramas de descarte. No restablece el propio ajuste de descarte y, por ello, el resultado podría no animarse correctamente. Para que lo anterior se anime bien, establezca todos los métodos de descarte en «previous» o «background», o puede optimizar la animación antes de guardarla.
_El aspecto del fotograma final tras el método de descarte GIF normalmente no tiene ninguna consecuencia para una animación GIF, ya que todo el lienzo se borra por completo antes de que la animación se repita (haga bucle). Si no hace «bucle», sino que se detiene al final de la secuencia de animación, entonces no se aplica el descarte del último fotograma.

En otras palabras, la apariencia del último fotograma (tras el descarte) tal como se mostró antes, o incluso el ajuste de descarte real del último fotograma, no tiene ningún efecto en una animación GIF. IM generalmente lo establece igual que el fotograma anterior cuando intenta deducir un método de descarte apropiado durante una optimización de fotogramas de una animación._
---|---

Deconstruct - informar de las zonas de diferencia entre fotogramas

La forma tradicional en ImageMagick de optimizar una animación, haciendo que el resultado sea más pequeño y más rápido de descargar y animar, es «[-deconstruct](https://imagemagick.org/command-line-options/#deconstruct)» su forma «[-coalesce](https://imagemagick.org/command-line-options/#coalesce)». Esto ya no es recomendable. En su lugar, debería usar el optimizador general de GIF. Este operador toma una secuencia de imágenes coalescida (los fotogramas de la animación tal como aparecen realmente al mostrarse) y compara la segunda imagen y las posteriores con la imagen anterior. Luego sustituye esa imagen por el área rectangular más pequeña de los píxeles que habían cambiado. Cuenta cualquier cambio de píxel, sin importar si es un cambio de color (superposición) o un borrado (eliminación). Esto es bastante sencillo y, para una animación por superposición típica, generará una optimización de fotogramas óptima para esa animación. Sin embargo, una animación por superposición solo usa el método de descarte «[None](#none)». Por ejemplo, tomemos la animación previous coalescida que generamos antes, que resulta ser una animación por superposición, y pasémosla por el operador «[-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]
Una «animación con descarte previous», si lo recuerda, borra cada fotograma hasta el último fotograma no descartado con «previous», en este caso el lienzo de fondo inicial. Como puede ver, «[-deconstruct](https://imagemagick.org/command-line-options/#deconstruct)» devolvió el área que cambió de un fotograma coalescido al siguiente. Esto resulta en una animación por superposición optimizada que no requiere ningún ajuste de descarte especial. Esto no es ni de lejos tan óptimo como la animación original generada a mano con la que empecé, pero es útil en sí mismo. Por desgracia, «[-deconstruct](https://imagemagick.org/command-line-options/#deconstruct)» no tiene absolutamente ninguna comprensión de los ajustes «[-dispose](https://imagemagick.org/command-line-options/#dispose)» de la animación GIF. Por consiguiente, si lo prueba en una animación que borra píxeles de un fotograma al siguiente, como la animación con descarte background que creamos antes (y se muestra a la izquierda), fallará estrepitosamente. | [IM Output]
---|---
Aquí tomamos la animación que se acaba de mostrar y la pasamos por un ciclo de «[-coalesce](https://imagemagick.org/command-line-options/#coalesce)» y «[-deconstruct](https://imagemagick.org/command-line-options/#deconstruct)». |

  magick canvas_bgnd.gif  -coalesce  -deconstruct  deconstruct_erase.gif

[IM Output]
Como puede ver, «[-deconstruct](https://imagemagick.org/command-line-options/#deconstruct)» destruye lentamente la animación. Básicamente, «[-deconstruct](https://imagemagick.org/command-line-options/#deconstruct)» está diseñado simplemente para encontrar las diferencias entre capas de imagen. Nunca se diseñó para optimizar correctamente animaciones, y fallará en animaciones que necesiten usar diversas técnicas de descarte para borrar (eliminar o hacer transparentes) píxeles previamente superpuestos.

Comparación de fotogramas - comparación más detallada de fotogramas

Con la versión 6.2.6-2 de IM se añadieron varios métodos adicionales de comparación de fotogramas GIF. Estos eran necesarios internamente para la optimización correcta de animaciones, pero se consideraron lo bastante útiles como para ponerlos a disposición de la línea de comandos y de otras interfaces de API.

Compare_Any

El método «**CompareAny**» de «[-layers](https://imagemagick.org/command-line-options/#layers)» es en realidad exactamente igual que «[-deconstruct](https://imagemagick.org/command-line-options/#deconstruct)». De hecho, el operador «[-deconstruct](https://imagemagick.org/command-line-options/#deconstruct)» no es más que un alias funcional del método «CompareAny». De nuevo, veamos los resultados de imagen reales de un «deconstruct» o «CompareAny» de la animación con descarte background.

  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]

Como puede ver, la segunda imagen y las posteriores son el área rectangular mínima que contiene todos los píxeles que han cambiado, ya sea una superposición de un nuevo color de píxel o el borrado de un píxel antiguo hasta la transparencia.

Compare_Clear

El método «**CompareClear**» de «[-layers](https://imagemagick.org/command-line-options/#layers)» mostrará el área rectangular más pequeña que contiene todos los píxeles que necesitaban borrarse de un fotograma al siguiente.

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

[IM Output]

Observe que, como no se borró ningún píxel entre el primer y el segundo fotograma, se generó una imagen omitida especial. El ajuste «[-quiet](https://imagemagick.org/command-line-options/#quiet)» se usó para indicarle a IM que no diera ninguna advertencia sobre esta imagen. Si todos los fotogramas posteriores se convierten en imágenes «omitidas», la animación GIF nunca borra píxeles y la animación puede clasificarse como una animación por superposición.

Compare_Overlay

El último método de comparación de «[-layers](https://imagemagick.org/command-line-options/#layers)», «**CompareOverlay**», devuelve el área de píxeles que se superpusieron (añadidos o cambiados de color, pero no borrados) desde el fotograma anterior.

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

[IM Output]

Esto es similar al método de composición alfa específico de IM «ChangeMask». Sin embargo, ese devuelve solo los píxeles que cambian la imagen, en lugar del área rectangular que se modificó. Véase también Optimización de transparencia. Ninguno de los métodos de comparación de «[-layers](https://imagemagick.org/command-line-options/#layers)», ni el operador «[-deconstruct](https://imagemagick.org/command-line-options/#deconstruct)», examinan ni modifican el método de descarte GIF de la imagen que se usa. El resultado es solo una lista de imágenes, y no se espera que se usen como animaciones en sí mismas.
_Aunque los operadores están diseñados para funcionar con una secuencia de imágenes coalescida, aceptarán una secuencia no coalescida de capas de imagen sin producir un error.

En este caso, cada fotograma se superpone sobre los fotogramas superpuestos anteriores usando un método de composición alfa «[Copy](compose.html#copy)», antes de comparar los fotogramas. Este método de composición alfa garantiza que cualquier transparencia de una capa también se añada a la imagen de destino. Sin esto, lo anterior no encontraría los píxeles que se borran hasta la transparencia en una secuencia de imágenes coalescida.

Tenga en cuenta que esto es distinto del método de composición «[Over](compose.html#over)», más habitual, que el operador «[-coalesce](https://imagemagick.org/command-line-options/#coalesce)» usaría para gestionar el ciclo «descarte/superposición» necesario para mostrar una animación GIF.

_
---|---


Tipos de animaciones

La mayoría de las animaciones GIF que encuentre pertenecen a algunos tipos básicos de animación. Conocer estos tipos le permite entender cómo se muestra esa animación de un fotograma a otro, y puede permitirle tomar atajos en la forma de manejar y modificar la animación.

Animaciones coalescidas

Una «animación coalescida » es básicamente una secuencia de imágenes que muestra el aspecto que debería tener una animación cuando se muestra a un usuario tras cada ciclo de «descarte/superposición». Las imágenes son básicamente como las vería si estuviera mirando una verdadera «tira de película» de la animación. Es la forma simplificada y completamente sin optimizar de cualquier animación. Esta convención de nombre procede del nombre del operador «[-coalesce](https://imagemagick.org/command-line-options/#coalesce)» de IM, que se usa para convertir animaciones de descarte GIF en una «animación coalescida» sin optimizar. La mayoría de los formatos de vídeo (MPEG, AVI, etc.) son en realidad también «animaciones coalescidas» por su propia naturaleza. Sin embargo, estos también tienden a no tener píxeles transparentes y, por lo general, tienen un retardo de tiempo constante entre los fotogramas de la animación. Una animación GIF coalescida, en cambio, puede tener píxeles transparentes y retardos de tiempo muy variables, desde retardos inmediatos de «0», hasta muy rápidos o muy muy muy lentos. Cualquier ajuste de descarte GIF en una animación coalescida carece de significado; no obstante, el operador «[-coalesce](https://imagemagick.org/command-line-options/#coalesce)» establecerá el descarte de forma apropiada para que la secuencia de imágenes resultante pueda seguir funcionando como una animación GIF válida. Los formatos de vídeo, que siempre sustituyen cada píxel de un fotograma al siguiente, generalmente pueden usar simplemente un ajuste de descarte GIF «[None](#none)» o «[Undefined](#none)». Aquí tiene un ejemplo de una animación que también es, por su naturaleza, una animación coalescida, más una visualización «[gif_anim_montage](../static/img/scripts/gif_anim_montage)» de los fotogramas individuales de la animación. [IM Output] [IM Output]
La mayoría de las animaciones que no contienen ni usan transparencia, y que animan todo el lienzo, suelen guardarse y distribuirse como animaciones coalescidas.

Animaciones por superposición

Una «animación por superposición » es aquella en la que cada fotograma de una animación solo superpone nuevos píxeles a la animación que se muestra en ese momento. En otras palabras, en ningún punto de la animación necesita borrar un píxel hasta la transparencia. Los fotogramas individuales pueden contener transparencia, ya sea como fondo o como parte de su optimización, pero nunca borran un píxel de vuelta a la transparencia. Por supuesto, si no se usa transparencia en absoluto, entonces se garantiza que la animación se podrá convertir en una simple animación por superposición. Este es probablemente el tipo más sencillo de animación optimizada por fotogramas, y uno que no requiere ningún manejo especial por parte de los clientes. Cada fotograma que se muestra al usuario puede verse simplemente como una imagen «aplanada» de todos los fotogramas anteriores. Cualquier animación que solo use un método de descarte GIF «[None](#none)» es una «animación por superposición». El último ejemplo, por ejemplo, no solo es una «animación totalmente coalescida», sino también una «animación por superposición», aunque no todas esas «animaciones totalmente coalescidas» son «animaciones por superposición». Puede comprobar si una animación puede convertirse en una animación por superposición usando el método de capas «[CompareClear](#compareclear)» en una animación coalescida, y comprobando si todas las imágenes segunda y posteriores son «imágenes omitidas». Es decir, ningún píxel necesitó borrarse o eliminarse de un fotograma al siguiente. De hecho, si una animación puede convertirse en una animación por superposición sin modificación, entonces el operador «[coalesce](#coalesce)» de IM solo usará métodos de descarte «[None](#none)» para todos los fotogramas. Si no es así, «[coalesce](#coalesce)» habrá usado el descarte «[Background](#background)» para al menos algunos de los fotogramas. Esto le da entonces otra prueba de la capacidad de ser «solo superposición». Las animaciones por superposición pueden usar transparencia, pero no tienen ninguna parte en movimiento sobre un fondo transparente. Por ejemplo, la animación de una letra «K» dibujada a mano es una animación por superposición, ya que cada parte solo añade o cambia partes existentes sobre un fondo transparente. Nunca añade nueva transparencia a la imagen resultante (salvo como parte del primer fotograma). [IM Output] [IM Output]
[IM Output] Esto no quiere decir que un objeto en movimiento no pueda manejarse con una animación por superposición; solo significa que necesita un fondo no transparente para poder también «borrar» las posiciones antiguas de las partes en movimiento sin necesitar transparencia. Por ejemplo, mire los fotogramas de esta animación de «descargar el mundo en una carpeta»...

[IM Output]

Por supuesto, al necesitar «borrar» las partes antiguas superponiendo el fondo original, las subimágenes superpuestas suelen ser más grandes y, por tanto, el tamaño del archivo de la animación GIF es generalmente mayor. Por desgracia, usar el operador Optimize Frame de IM puede convertir, y muy probablemente convertirá, una «animación por superposición coalescida» en algo que no es una «animación por superposición», en su intento de encontrar un tamaño de archivo GIF menor. Sin embargo, usando Deconstruct en la animación en lugar de Optimize Frame, puede asegurarse de que la animación siga siendo una simple «animación por superposición», pero solo si la animación es realmente una «animación por superposición». Si la animación no es una «animación por superposición», entonces la operación Deconstruct puede salir muy mal (véase Deconstruct más arriba). Con algo de habilidad humana, todavía puede optimizar mejor una animación por superposición, por ejemplo usando actualizaciones de fotograma divididas, y aplicando alguna forma de optimización de compresión sin destruir el requisito de «solo superposición» de la animación. Normalmente, las «animaciones por superposición» no muestran transparencia alguna (pueden usarla como parte de la optimización, pero no la muestran). Y si no se muestra transparencia, entonces se garantiza que la animación es una «animación por superposición». ¿Por qué son tan importantes las «animaciones por superposición»? Porque hay software por ahí que está limitado a este tipo de animación. Es mucho más sencillo de manejar, ya que solo se realiza la superposición sin necesidad de manejar transparencia ni de guardar el fotograma anterior para gestionar los métodos de descarte GIF. Tal software es raro, pero existe.

Animaciones de fotograma borrado

Cuando una animación solo usa descarte GIF «Previous» o «Background», obtiene un tipo de animación muy especial. Tenga en cuenta que, si solo se usa el descarte «Background», todos los fotogramas de una animación se muestran y luego se borran antes de mostrar el siguiente fotograma. Asimismo, cuando solo se usa «[Previous](#previous)», la animación siempre vuelve al lienzo borrado inicial antes de mostrar el siguiente fotograma, lo que produce el mismo efecto. Lo mismo ocurre si solo usa una mezcla de esos dos ajustes de descarte. Es decir, las animaciones que solo usan estos métodos de descarte tendrán fotogramas que son copias completas de lo que se va a mostrar. Es decir, el fotograma contiene todo lo que se mostrará al usuario en ese momento. Esto no quiere decir que la animación sea una «animación totalmente coalescida». Como el subfotograma puede ser mucho más pequeño que el área de lienzo virtual de la animación, pero todo lo que esté fuera de ese fotograma se considerará transparente (o de fondo), sin contener nada de importancia. Por ejemplo, eche un vistazo a esta animación de un conejo corriendo... [IM Output] [IM Output]
Observe que todos y cada uno de los subfotogramas son la imagen completa que se muestra. Ni más, ni menos. Observe también que ninguno de los fotogramas necesita usar realmente todo el lienzo virtual de la animación. Y, por último, observe cómo todos los descartes de los fotogramas se establecen en «[Previous](#previous)», que, por razones que verá más abajo, es el ajuste de descarte más lógico que usar. Sin embargo, todos los ajustes de descarte podrían haberse establecido en descarte «[Background](#background)» o en cualquier mezcla de los dos sin cambiar el resultado final. A falta de un nombre mejor, llamo a tal animación una «animación de fotograma borrado », pero también la he visto llamar «animación con descarte Previous o Background». La única vez que una animación no es de este tipo es si al menos un fotograma no en blanco de la animación usó un método de descarte «[None](#none)» o «Undefined» (lo mismo). Esta animación es muy especial, ya que puede gestionar cualquier cantidad de borrado de transparencia, en cualquier punto de la secuencia de animación, a diferencia de una animación por superposición. Pero también puede superponerse muy rápidamente sobre CUALQUIER imagen de fondo estática. Para hacerlo, necesitamos afinar un poco la definición de «animación de fotograma borrado». En concreto, necesitamos asegurarnos de que todos los descartes estén establecidos en «[Previous](#previous)» (lo que ya es el caso en nuestro ejemplo). Si eso se hace, entonces puede simplemente anteponer una imagen (con un retardo cero) para subponer un fondo. Por ejemplo, coloquemos nuestro conejo sobre algo de hierba....
  magick bunny_grass.gif bunny_anim.gif -loop 0  bunny_on_grass.gif

[IM Output]
Como puede ver, esto es tan sencillo que muchas aplicaciones usan estos tipos de animaciones GIF para añadir símbolos u otros indicadores (candados de archivo, caritas, estrellas, etc.) a objetos más grandes. Animar tal animación GIF también es fácil, ya que la aplicación puede simplemente borrar el área hasta alguna imagen de fondo constante sencilla y superponer el siguiente fotograma de la secuencia. No hay que calcular descartes ni llevar la cuenta de una visualización «previa», más allá del fondo estático e invariable. Esta es también la razón por la que un descarte «[Previous](#previous)» es el descarte preferido para una animación de fotograma borrado. A diferencia de una animación por superposición, que es solo un subconjunto especial de animaciones GIF, TODAS las animaciones pueden guardarse como una animación de fotograma borrado. Solo hay que coalescer la animación y, opcionalmente, recortar cualquier borde transparente circundante para optimizarla por fotogramas, y restablecer los descartes.

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

Incluso puede recolocar la animación sobre ese fondo... |

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

[IM Output]
Por ello, una animación de fotograma borrado suele constar de un objeto pequeño que cambia o se mueve constantemente sobre un fondo transparente. Estas son directamente utilizables en páginas web, o como símbolos animados, o pueden fusionarse con otras animaciones para producir animaciones mucho más complejas. En resumen, este tipo de animación es un buen estilo para usar en una biblioteca de partes animadas, con el fin de crear animaciones más grandes y complejas.
Sin embargo, hay un problema al añadir un fondo de esta manera para las animaciones GIF. Si mira los ejemplos anteriores, probablemente habrá notado una pausa significativa y molesta en la animación de movimiento rápido. Es decir, el conejo desaparecía un instante cuando la animación hacía bucle y la imagen de fondo se recargaba. (Véanse las notas en Fotogramas con retardo cero) Aunque esto no es un problema para las aplicaciones que usan esta técnica, para añadir símbolos animados a objetos mostrados, ya que simplemente no muestran ese fotograma «intermedio» de todos modos. Por ello, si va a añadir un fondo no transparente a la animación GIF, generalmente es buena idea convertir la simple animación de fotograma borrado en una animación por superposición. Es decir, añadir ese fondo a cada fotograma de la animación, en lugar de dar un lienzo inicial. Puede hacerlo, o bien coalesciendo la animación anterior y luego eliminando el fotograma de fondo con retardo cero, O bien componiendo por capas la animación original sobre un fondo estático. Por ejemplo...

|

  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]

Ahora que todos los fotogramas se muestran igual de bien, no se ve ninguna pausa al restablecerse el fondo. Sin embargo, la animación es ahora una animación por superposición con el fondo «redibujándose» debido al movimiento del objeto de la animación, por lo que probablemente sea un poco mayor en tamaño de archivo. Véase Optimización de transparencia para una continuación de la optimización del resultado anterior. | _El miembro del foro de IM el_supremo, Pete, ha contribuido con un script equivalente en MagickWand, ejemplo de fotograma borrado sobre fondo.

Este ejemplo también se trata en detalle en el foro de IM Creating a Cleared Frame GIF Animation in the MagickWand.

_
---|---

Animaciones de descarte mixto - animaciones de múltiples fondos

No hay nada que le impida mezclar los distintos métodos de descarte en una sola animación GIF. De hecho, añadir un fondo a una animación de fotograma borrado hace exactamente eso. Usar métodos de descarte mixtos no es tan sencillo para los humanos, pero hacerlo puede permitirle generar algunas visualizaciones animadas muy complejas. En general, se crean como parte de la optimización de fotogramas automática para una animación concreta. Solo recuerde que el resultado no será directamente utilizable como los tipos de animación anteriores para propósitos específicos. De hecho, no se sorprenda si algunos programas de manejo de GIF simplemente no gestionan correctamente una «animación de descarte mixto». Eso incluye algunos de los optimizadores de GIF disponibles. Un ejemplo típico de «animación de descarte mixto» es un objeto pequeño en movimiento que provoca algún cambio semipermanente pero temporalmente estático en el fondo de la animación. Una pelota golpeando una palanca sería un ejemplo.

_Se necesita un ejemplo sencillo_

De forma similar, las animaciones que implican dos objetos muy pequeños en movimiento sobre una visualización transparente mayor solo pueden optimizarse bien mezclando las técnicas de descarte, de modo que cada objeto se mueva usando fotogramas de animación separados.

FUTURO,
Una animación más compleja para estudio.
 * Empezar con un lienzo semitransparente
 * ejecutar un poco de descarte 'previous'
 * dejar un fotograma como un nuevo 'lienzo'
 * más animaciones previous
 * borrar esa 'adición' usando un descarte 'background' establecido como nuevo lienzo
 * continuar de vuelta al punto de inicio.
Esta animación debería poner a prueba a fondo no solo los métodos de descarte de IM
sino también los diversos métodos de descarte de los navegadores.

Si desea contribuir con un ejemplo de IM de tal animación, ¡puede conseguir que su nombre y el enlace a su página de inicio aparezcan aquí!


El final del bucle - cuándo se detiene una animación

A menudo se considera buena idea no hacer que las animaciones hagan bucle eternamente, ya que las máquinas cliente tienen que trabajar continuamente mientras la animación sigue animándose. Por ello, es buena idea pensar cuántas veces hace bucle realmente su animación. Básicamente..

Añada un límite de bucle a sus animaciones (si es práctico)

Esto es especialmente cierto para las animaciones grandes usadas como logotipo en la parte superior de una página web. Según el tiempo total durante el que se ejecuta una animación, de 10 a 30 bucles suele ser suficiente para los logotipos grandes. Y debería añadir un límite de bucle a todas esas animaciones, para ser amable con sus usuarios. Un ajuste de guardado «[-loop](https://imagemagick.org/command-line-options/#loop)» de 0 significa hacer bucle para siempre. Esto es lo que se usa normalmente, y está bien, para animaciones pequeñas. Sin embargo, algunos navegadores fuerzan una parada cuando una animación alcanza algún límite interno de bucle (a menudo 256 bucles). Para los ejemplos de IM, generalmente he usado un ajuste de guardado «[-loop](https://imagemagick.org/command-line-options/#loop)» de «0», es decir, «hacer bucle para siempre», porque las animaciones pueden aparecer en cualquier parte de una página. Eso significa que puede pasar algún tiempo entre que el usuario cargó una página y cuando finalmente mira y lee sobre una animación GIF concreta. Si usara un número menor de «bucles», la animación ya no estaría haciendo lo que debería demostrar, perdiendo su eficacia. Para las animaciones grandes en páginas de presentación de nivel superior, puede usarse un «[-loop](https://imagemagick.org/command-line-options/#loop)» de «1», el valor predeterminado normal de la animación GIF. Esto significa recorrer la animación una sola vez y luego detenerse. Lo que nos lleva a una pregunta importantísima.. ¿Detenerse dónde? Algunos navegadores, como el antiguo «Netscape», volvían a mostrar el primer fotograma de la animación. La mayoría de los navegadores modernos, sin embargo, simplemente se detienen en el último fotograma, ignorando el inútil ajuste de descarte de ese fotograma. Lo que hace una aplicación concreta, no obstante, depende de la aplicación, ya que no hay un verdadero estándar. En realidad, incluso el uso del metadato de «bucle» es en sí mismo no estándar, solo algo que el antiguo navegador «Netscape» implementó y que todos los navegadores posteriores copiaron. Por eso, si hay algún fotograma concreto en el que quiera que su animación se detenga, por ejemplo el fotograma con el nombre o el logotipo de su empresa, entonces es buena idea hacer que ese fotograma sea a la vez el primer y el último fotograma de una animación. No obstante, a uno de esos fotogramas debería dársele un «retardo cero», para no afectar a la duración total del tiempo de bucle de la animación. Así que, solo para resumir...

Si limita el bucle, añada el fotograma de «parada» como PRIMER y ÚLTIMO fotograma a la vez.


Fotogramas intermedios con retardo cero

Ya hemos visto el uso de un fotograma con «retardo cero», en relación con las animaciones de fotograma borrado. También los usé para explicar los descartes Previous y Background. Estos fotogramas especiales son en realidad mucho más comunes de lo que la gente probablemente piensa. Representan no solo métodos para anteponer un «lienzo» de fondo a una animación (como los he usado yo más arriba), sino que también son imprescindibles para algunas de las técnicas de optimización de fotogramas más complejas, como la duplicación de fotogramas y la división de actualizaciones de fotograma. Otro uso (muy antiguo, anterior al formato PNG) era permitirle crear imágenes GIF estáticas que contuvieran más del límite de 256 colores. Es decir, cada fotograma aporta 256 colores, y el siguiente fotograma el siguiente conjunto de 256 colores, todos con retardo cero y sin bucle al final. Gracias a TLUL en la discusión Creating unquantized GIFs por señalar esto. Estos «fotogramas intermedios con retardo cero » no están pensados para mostrarse a un usuario. Solo se usan para crear efectos especiales en imágenes GIF que de otro modo no serían posibles o que se optimizan mejor de lo que se obtendría sin ellos. En resumen...

Los fotogramas con retardo cero son fotogramas intermedios,
no están pensados para ser visibles para los usuarios.

ImageMagick no solo creará tales fotogramas en las animaciones como parte de su «OptimizePlus» automático, sino que también ofrece una forma de eliminarlos usando el método de capas «RemoveZero». Esté atento a ellos, ya que a menudo complicarán su manejo de animaciones. Bien, son importantes, ¿y qué? Pues que a muchas aplicaciones no les gustan, o los gestionan incorrectamente. Consideran los «fotogramas con retardo cero» como algo malo, incluso cuando los añade deliberadamente a las animaciones, por una razón u otra. Aquí tiene un resumen de las aplicaciones que conozco o de las que me han informado que «hacen lo incorrecto»... Gimp | No guardará un «fotograma con retardo cero»; siempre añaden un retardo de tiempo mínimo a cualquier fotograma que tenga un retardo de tiempo cero. :-(

---|---
FireFox | Dará una ligera pausa no nula en tales fotogramas. Esto presumiblemente es para que las animaciones que no tienen retardos de tiempo en absoluto no consuman todos los ciclos de CPU del ordenador. Pero «firefox» todavía no relaja esa restricción si una animación tiene un tiempo de visualización total no nulo.

Internet Explorer | Tiene un retardo de tiempo mínimo de 6 centisegundos, e ignora cualquier retardo menor que este. Internet Explorer versión 8 también falla (reinicia inmediatamente el bucle) si algún fotograma de imagen se extiende más allá de los límites de la animación establecidos por el primer fotograma. Esto lo clasificaría como un error grave.
Por otro lado, el método de capas «RemoveZero» de ImageMagick sí hace lo correcto y NO eliminará ningún fotograma si TODAS las imágenes tienen un «retardo de tiempo cero». De hecho, este método de capas dará una advertencia si ve una animación sin ningún retardo de tiempo en absoluto. Esto nos lleva a otra regla práctica...

Nunca guarde una animación GIF (en bucle) que no tenga «retardos» en absoluto

Hacerlo es muy mala práctica, y la razón por la que la mayoría de las aplicaciones «defectuosas» anteriores hacen lo que hacen, en lugar de lo que deberían. Quéjese a los propietarios si las ve. Quéjese también a los desarrolladores de aplicaciones, para que gestionen correctamente los fotogramas con retardo cero. Aunque eso signifique no mostrar ese fotograma en absoluto, usándolos solo como preparación para el siguiente fotograma a mostrar. ¡Después de todo, están en pantalla durante un tiempo CERO!