Quiero hacer una .gif
imagen animada de un conjunto dado de .jpg
imágenes.
Preferiría hacerlo desde la línea de comandos, por lo que las herramientas de línea de comandos serían muy bienvenidas.
Quiero hacer una .gif
imagen animada de un conjunto dado de .jpg
imágenes.
Preferiría hacerlo desde la línea de comandos, por lo que las herramientas de línea de comandos serían muy bienvenidas.
Respuestas:
Puede usar el paquete ImageMagick . Instálelo usando el comando:
sudo apt-get install imagemagick
Ahora puede crear un gif
número de imágenes ( jpg
) usando:
convert -delay 20 -loop 0 *.jpg myimage.gif
-resize 50%
.
-deconstruct
. También descubrí que ImageMagick tiene mucha memoria, consulte los puntos de referencia: askubuntu.com/a/1102183/52975
convert -delay 0 -loop 0 *.tif myanimated.gif
funcionó bien, en 720 archivos tif
Para completar la respuesta de @Maythux:
-resize
opció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
*.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 -t
por ejemplo. En ubuntu puedes usar ls -v
algo 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.
find
, sort
expansión de llaves, etc. La ls
herramienta es notoriamente inadecuada para este tipo de cosas. Utilizar find
. Hay una pequeña curva de aprendizaje, pero vale la pena.
Puede hacer esto fácilmente con GIMP. Primero instálelo si ya no está instalado con
sudo apt-get install gimp
Desde GIMP, vaya a Archivo -> Abrir como capas para abrir todos los png en su propia 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.
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.
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
Las ffmpeg
opciones 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.gif
dice 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.xml
como 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.
ffmpeg
calcula esas diferencias por defecto, pero ImageMagick no, a menos que -deconstruct
se 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 516x516
lugar 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:
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.
-r
ni -v
comandos, 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?
-framerate 60 -r 60
. Inspeccione el GIF generado y las imágenes de entrada con las herramientas de ImageMagick identify
para tratar de descubrir qué está sucediendo.
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
convert -delay 20 -loop 0 *.png out.gif
un GIF en bucle.