¿Cómo puedo cambiar el tamaño de un archivo GIF animado usando ImageMagick?

46

Quiero cambiar el tamaño de un archivo GIF animado do.gif ingrese la descripción de la imagen aquí

Si lo hago convert do.gif -resize 24x24\! do-24.gif, lo cambio de tamaño en do-24.gif pero no animadoingrese la descripción de la imagen aquí

¿Cómo cambiar el tamaño correctamente para obtener la misma animación?

zuba
fuente

Respuestas:

56

primer intento:

convert do.gif -coalesce temporary.gif

entonces

convert -size <original size> temporary.gif -resize 24x24 smaller.gif
phipsalabim
fuente
2
-coalesce"crea una vista completa de la animación en cada punto, un poco como una tira de película real, en lugar de una secuencia de animación. Dicha secuencia, conocida como Animación fusionada, es mucho más fácil de estudiar, editar, modificar y volver a optimizar".
Sam
28
gifsicle --resize 24x24 > do-24.gifpuede a esto también
sam
2
Tenga en cuenta que la vista fusionada es mucho más grande que la optimizada (3.2 veces en mi prueba), y el cambio de tamaño produce una imagen fusionada, que también puede ser más grande que el tamaño original del archivo (2.3 veces en mi prueba) incluso si la resolución es más pequeño. Cuando intento cambiar el tamaño directamente, se ve bien y tiene un tamaño de archivo pequeño, aunque tal vez solo funcione para esta imagen.
endolito el
1
gifsicle produjo una salida mucho mejor y optimizada para mi caso de uso. Gracias @sam!
sj26
44
convertir temporario.gif -resize 24x24 más pequeño.gif funciona para mí, sin especificar el tamaño de entrada.
AMB
5

Estaba buscando una solución de imagen mágica, ya que estoy familiarizado con ella, pero al final fui con la sugerencia de @ sam de gifsicle. Hizo justo lo que quería, sin problemas.

Puede optimizar el tamaño del archivo resultante de muchas maneras, pero solo reduje el tamaño y reduje el número de colores. Trabajado como un encanto:

gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
Peter Perháč
fuente
3

-coalesce + -deconstruct

Después -coalesce, es probable que desee agregar un -deconstruct:

convert in.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif

La causa raíz del problema es que su GIF de entrada se minimizó correctamente: GIF permite que el siguiente cuadro sea solo el rectángulo modificado del anterior en un desplazamiento.

-coalesceluego expande todos los cuadros al tamaño original, lo que hace que el cambio de tamaño funcione, pero no vuelve a comprimir los cuadros nuevamente como su imagen de entrada: ¡ -deconstructes necesario para eso!

Usando los datos de prueba de esta respuesta: ¿Cómo creo un gif animado a partir de imágenes fijas (preferiblemente con la línea de comando)? Podemos ver esto claramente con identify:

$ identify out-convert.gif | head -n 3
out-convert.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.020u 0:00.019
out-convert.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019
out-convert.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019

$ convert out-convert.gif -resize 256x out.gif
$ identify out.gif | head -n 3
out.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[1] GIF 256x256 256x256+125+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[2] GIF 256x258 256x256+123+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009

$ convert out-convert.gif -coalesce -resize 256x out-coalesce.gif
$ identify out-coalesce.gif | head -n 3
out-coalesce.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[1] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[2] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009

$ convert out-convert.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif
$ identify out-deconstruct.gif | head -n 3
out-deconstruct.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[1] GIF 135x135 256x256+60+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[2] GIF 135x136 256x256+59+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010

out.gif

ingrese la descripción de la imagen aquí

out-coalesce.gif

ingrese la descripción de la imagen aquí

out-deconstruct.gif

ingrese la descripción de la imagen aquí

Primero, vemos cómo ingresar el archivo, out-convert.gifde hecho, se comprimió, ya que el fotograma 2 solo está 516x516en desplazamiento 252+257, mientras que el fotograma completo 1 lo está 1024x1024.

Entonces, si comparamos las tres conversiones:

  • out.gif: Todos los marcos son 256x256o más grandes, y enormes a aproximadamente 5MiB, TODO ¿por qué?

    Visualmente incorrecto, ya que esos 256x256cuadros aproximadamente tienen un desplazamiento distinto de cero, por ejemplo, 125+128para el cuadro 2.

  • out-coalesce.gif: todos los marcos son 256x256y tienen el desplazamiento correcto 0+0.

    La salida parece visualmente correcta, pero el tamaño del archivo de salida es 2.0 MiB, que es más grande que out-deconstruct.gif

  • out-deconstruct.gif: cuadros comprimidos, tamaño de salida final 1.9 MiB.

    No es considerablemente más pequeño que out-coalesce.gif, pero creo que esto es solo porque el suelo negro se comprime muy bien, y podría ser muy significativo en general.

ffmpeg y gifsicle

También probé los siguientes comandos:

ffmpeg -i out-convert.gif -vf scale=256:-1 out-ffmpeg-small.gif
gifsicle --resize 256x256 out-convert.gif > out-gifsicle.gif

y ambos produjeron una salida de 1.5 MiB aún más pequeña que se veía correctamente.

Consulte también: ¿Cómo creo un gif animado a partir de imágenes fijas (preferiblemente con la línea de comando)?

TODO: ¿por qué pueden hacerlo más pequeño que convert? ¿Están simplemente seleccionando mejores rectángulos de diferencia más mínimos, o algo más?

Probado en Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente