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

78

Quiero hacer una .gifimagen animada de un conjunto dado de .jpgimágenes.

Preferiría hacerlo desde la línea de comandos, por lo que las herramientas de línea de comandos serían muy bienvenidas.

Maythux
fuente

Respuestas:

87

Puede usar el paquete ImageMagick . Instálelo usando el comando:

sudo apt-get install imagemagick

Ahora puede crear un gifnúmero de imágenes ( jpg) usando:

convert -delay 20 -loop 0 *.jpg myimage.gif
Maythux
fuente
66
Incluya aquí cómo cambia el tamaño de la animación GIF, etc. en un 50%. Etc -resize 50%.
Léo Léopold Hertz 준영
Ubuntu 18.10 falló con "recursos de caché agotado" de estas imágenes: github.com/cirosantilli/media/blob/master/... relacionados: superuser.com/questions/1178666/...
Ciro Santilli新疆改造中心法轮功六四事件
Usuarios ImageMagick es probable que también desee: -deconstruct. También descubrí que ImageMagick tiene mucha memoria, consulte los puntos de referencia: askubuntu.com/a/1102183/52975
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
convert -delay 0 -loop 0 *.tif myanimated.giffuncionó bien, en 720 archivos tif
ron
46

Para completar la respuesta de @Maythux:

Para evitar generar un archivo muy grande, puede usar la -resizeopción:

En mi caso, tengo imágenes de 4608x3456 y el gif generado fue de más de 300M para 32 imágenes

convert -resize 20% -delay 20 -loop 0 *.jpg myimage.gif

o

convert -resize 768x576 -delay 20 -loop 0 *.jpg myimage.gif

Cuida * .jpg

*.jpg apesta un poco cuando se trata de valores numéricos, puede generar un gif con fotos sin clasificar.

$ ls|cat
21-33-26_1.jpg
21-33-26_10.jpg   // <--- this one
21-33-26_2.jpg
21-33-26_3.jpg
21-33-26_4.jpg
21-33-26_5.jpg
21-33-26_6.jpg
21-33-26_7.jpg
21-33-26_8.jpg
21-33-26_9.jpg
21-33-28_1.jpg    // <--- should be here    
21-33-28_2.jpg
21-33-28_3.jpg
...

Como las tomas se tomaron muy rápidamente (10 / s), todas tienen el mismo tiempo de modificación y no se puede engañar usando, ls -tpor ejemplo. En ubuntu puedes usar ls -valgo como:

convert -resize 768x576 -delay 20 -loop 0 `ls -v` myimage.gif

Sin embargo, ordenar numéricamente es bastante complicado en Mac OS X, creo que necesitarás crear un script personalizado.

Ninsuo
fuente
44
Puede evitar su problema * .jpg reenviando números de relleno con ceros. "01.jpg" en lugar de "1.jpg", y así sucesivamente. Si llega a triples dígitos, entonces "001.jpg", "010.jpg", etc.
bigreddmachine
2
Hay varias formas de solucionar el problema de secuencia de nombre de archivo. Incluyendo find, sortexpansión de llaves, etc. La lsherramienta es notoriamente inadecuada para este tipo de cosas. Utilizar find. Hay una pequeña curva de aprendizaje, pero vale la pena.
voces
Algunos usuarios pueden estar interesados ​​en editar nombres de archivos con massren: github.com/laurent22/massren
Graham P Heath
Se necesitan años para terminar. ¿Hay una opción detallada?
ouranos
21

No tengo suficiente reputación para comentar, pero en lugar de modificar los nombres de archivo, puede usar globbing para obtener su shell para expandir los nombres de archivo

convert -resize 50% -delay 10 -loop 0 image_{0..99}.jpg output.gif
Shanksk
fuente
11

CAÑUTILLO

Puede hacer esto fácilmente con GIMP. Primero instálelo si ya no está instalado con

sudo apt-get install gimp

Creando el gif

Desde GIMP, vaya a Archivo -> Abrir como capas para abrir todos los png en su propia capa.

Abrir como capa

Desde aquí puede realizar ediciones en las capas y, una vez hecho, vaya a Archivo -> Exportar como . Desde el cuadro de diálogo, asegúrese de establecer el tipo de archivo en GIF.

Establecer tipo de archivo a GIF

Desde allí, irá a las opciones de exportación de GIF. Marque la opción ' Como animación ' y configure los parámetros según sea necesario.

Opciones de exportación de GIF

chesedo
fuente
7

Solución ffmeg + datos de prueba

A partir de Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8, he descubierto que ffmpeg es mucho más rápido y usa mucha menos memoria .

El comando de conversión más simple es:

ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i '*.png' \
  -r 15 \
  -vf scale=512:-1 \
  out.gif \
;

Puede obtener mis datos de prueba con:

wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle

Los datos de la prueba se generaron con: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292 y contiene 256 imágenes 1024x1024 PNG.

¡Y aquí hay otros datos de prueba que puede generar directamente en su navegador ahora mismo! https://stackoverflow.com/questions/19235286/convert-html5-canvas-sequence-to-a-video-file/57153718#57153718

ingrese la descripción de la imagen aquí

Las ffmpegopciones importantes que quiero resaltar son:

  • -pattern_type glob: forma conveniente de seleccionar imágenes

  • -framerate 60: asume 60 FPS en las imágenes de entrada y genera el mismo FPS.

    ffmpeg No puedo saber lo contrario, ya que no hay datos de FPS en las imágenes como en formatos de video.

    Los 256 cuadros de entrada tardan unos 4 segundos en finalizar.

    -r 15: Opcional. Elija una cada 4 imágenes, así que reduzca el tamaño ( 4 == 60 / 15).

    Con él, identify out.gifdice que el GIF contiene solo 64 cuadros.

    Todavía toma 4 segundos para jugar, por lo que el retraso se altera para que las cosas coincidan.

  • -vf scale=512:-1: Opcional. Establezca el ancho, la altura de la escala proporcionalmente, generalmente para reducir el tamaño y ahorrar espacio.

Para que ImageMagick funcione, primero tuve que modificar sus límites de disco y memoria /etc/ImageMagick-6/policy.xmlcomo se explica en: https://superuser.com/questions/1178666/imagemagick-convert-quits-after-some-pages

Ver también:

ImageMagick vs ffmpeg benchmark

Comparé los comandos:

/usr/bin/time -v convert *.png -deconstruct -delay 1.6 out-convert.gif
/usr/bin/time -v ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i '*.png' \
  out-ffmpeg.gif \
;

Los comandos se construyeron para producir salidas lo más cercanas posible para que la comparación sea válida:

  • /usr/bin/time -v: se utiliza para encontrar el uso máximo de memoria como se explica en: https://stackoverflow.com/questions/774556/peak-memory-usage-of-a-linux-unix-process

  • -deconstruct: Las imágenes GIF pueden contener solo el rectángulo mínimo modificado del fotograma anterior para que el GIF sea más pequeño.

    ffmpegcalcula esas diferencias por defecto, pero ImageMagick no, a menos que -deconstructse use.

    Básicamente querrás usar esa opción cada vez con ImageMagick.

    Podemos observar la diferencia con:

    identify out.gif
    

    Con la versión comprimida, todos los marcos tienen tamaños más pequeños que el inicial, por ejemplo:

    out.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    out.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    out.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.010u 0:00.010
    

    En este ejemplo, el segundo cuadro es solo en 516x516lugar del 1024x1024 completo, y se coloca en un desplazamiento de 252+257. Por lo tanto, contiene solo el triángulo del medio.

    Ver también: ¿cómo puedo cambiar el tamaño de un archivo GIF animado usando ImageMagick?

  • -delay: valor que coincide con los 60FPS de ffmpeg. No debería importar el rendimiento de conversión, pero no quiero arriesgarlo.

Los GIF de salida tienen aproximadamente el mismo tamaño y se ven visualmente idénticos.

Obtenemos para ImageMagick:

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:56.16
Maximum resident set size (kbytes): 2676856

y para ffmpeg:

Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.41
Maximum resident set size (kbytes): 97172

de donde vemos que:

  • ImageMagick usó 2.6Gb de RAM y tomó aproximadamente 1 minuto
  • ffmpeg usó 100Mb de RAM y tardó 4 segundos

Hardware de prueba: computadora portátil Lenovo ThinkPad P51 , Intel Core i7-7820HQ, 32 GB (16 + 16) DDR4 2400MHz SODIMM, 512GB SSD PCIe TLC OPAL2.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
¡Votado y me gustó !, excelente respuesta, tengo una pequeña pregunta de seguimiento. No tengo muchas imágenes de alta calidad, y no utilicé -r ni -vcomandos, aún así el gif de salida es de una calidad mucho menor que los archivos png originales. ¿Cómo mantener la misma calidad de gif que los archivos png dados?
astro123
Hola @ astro123, ¿cómo es la calidad más baja? ¿Un tamaño de imagen más pequeño, o menos cuadros, u otra cosa (el GIF usa sin pérdida aparentemente, por lo que no puede ser peor compresión)? Tratar -framerate 60 -r 60. Inspeccione el GIF generado y las imágenes de entrada con las herramientas de ImageMagick identifypara tratar de descubrir qué está sucediendo.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
4

Puede usar un programa llamado convertir incluido en el paquete imagemagick. Se maneja por línea de comandos, pero es muy fácil de usar. Instálelo a través del centro de software o vaya a un símbolo del sistema y escriba

sudo apt-get install imagemagick

Ahora para crear el .gif.

convert -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

* Tenga en cuenta que el ejemplo anterior es directamente de los ejemplos de Image Magick

Scott Goodgame
fuente
1
¿Cómo hago 40 imágenes PNG en un GIF en bucle? Todo en carpeta / inicio / fusion809 / Documentos / Imágenes
BH2017
1
@ BH2017: crea convert -delay 20 -loop 0 *.png out.gifun GIF en bucle.
unutbu