Crear una animación GIF a partir de archivos PNG


83

¿Existe una herramienta para crear una gifanimación a partir de un conjunto de pngarchivos?

Probé el convertcomando de la suite ImageMagick , pero esto no siempre tiene éxito. Además, tengo varios problemas con esto:

  1. No puedo decir cuál es el progreso.
  2. No importa lo que intente, la -delaybandera no cambia la velocidad de fotogramas de la animación GIF.
  3. convertdetermina el orden de los cuadros en función del orden alfabético de los nombres de los archivos. Esto significa que name500.pngse colocará justo después name50.pngy no después de name450.pngque pueda arreglar esto agregando 0 pero esto es molesto.

[Noticias] Hay una superposición masiva entre Ubuntu Stackexchange y Unix Stackexchange. Traté de clasificar algunos hilos aquí .
hhh

Con respecto al elemento 3., todavía puede usar convertdespués de ordenar los archivos. Probablemente, algo como esto funcionafiles=$(ls name*png | sort -n -tname -k1); convert $files animation.gif
altroware

Para el punto 1: convertir tiene un -monitorparámetro que rastrea el proceso
Curlew

@hhc: toda la categorización es solo un enlace a una respuesta con 5 enlaces; solo uno de ellos parece relacionado, pero es solo un enlace a la pregunta anterior. - Un comentario de @Luke da una solución sencilla: convert -delay 200 -loop 0 *.jpg output.gif.
Cipricus

Respuestas:


50

Las versiones más recientes de ffmpeg no tienen -sameq ( ver preguntas frecuentes ) pero sí tienen soporte para GIF.

ffmpeg -i %03d.png output.gif

Donde% 03d es la ID del cuadro en 3 dígitos.

También puede intentar usar ffmpegpara crear una película a partir de una secuencia de imágenes y luego convertir la película en una animación GIF (nuevamente usando ffmpeg).

# cf. http://pages.uoregon.edu/noeckel/MakeMovie.html

# first convert an image sequence to a movie
ffmpeg -sameq -i %03d.jpg output.mp4

# ... and then convert the movie to a GIF animation
ffmpeg -i output.mp4 -pix_fmt rgb24 -s qcif -loop_output 0 output.gif

10
Esta instrucción está desactualizada.
alto mantenimiento

3
La sameqopción ya no está disponible. Además, para mí, esto sobrescribe los archivos de imagen originales y no produce un archivo de película válido.
Lode

¿Cuál es el punto de dejar el -sameqcódigo allí? ¿Por qué querrías incluso usar un formato de video con pérdida ( output.mp4) como temporal? Y si es así, ¿por qué "la misma calidad" que la entrada, en lugar de una tasa de bits muy alta? Hacer artefactos a partir de eso solo empeorará las cosas para el codificador GIF. Si necesitara usar un video como temporal, querría usar algo sin pérdidas como huffyuv. O MJPEG sin transcodificación, solo remux las entradas jpegs en un MJPEG. ( -codec:video copy)
Peter Cordes

80

convertes una práctica herramienta de línea de comandos para hacer eso. cda la carpeta que contiene sus archivos png y ejecute este comando:

convert -delay 10 -loop 0 *.png animation.gif

Fuente: http://ubuntuforums.org/showthread.php?t=1132058


55
La pregunta menciona converty algunos problemas al usarla. Su respuesta no se dirige a ninguno de ellos.
Mat

3
A partir de la versión de ImageMagick, 6.8.7-4 2013-11-02 Q16esto funcionó para mí.
Rudy Matela

77
Esto funciona, pero 10significa 10 * 10 ms, muy rápido. Un retraso de a 100es de 1 segundo.
Anne van Rossum

77
use la opción -dispose previouso -dispose 2si está trabajando con PNG transparentes
Hải Phong

44
en cuenta a mí mismo: expansión de llaves puede ser útil para especificar la lista de imágenes como argumentos, por ejemplo, pic_{0..20..2}.pngse expande a pic_0.png, pic_2.pngtodo el camino hastapic_20.png
Yibo Yang

19

La opción convert's --delaysolo se aplica a la siguiente imagen en la línea de comando. Por convert -delay 10 *lo tanto , solo establecerá el retraso del primer fotograma en 0.1 segundo. La opción debe repetirse:

convert $(for a in *; do printf -- "-delay 10 %s " $a; done; ) result.gif

Para su necesidad de clasificación, convertir no clasifica los marcos, sí lo *hace el gloging de shell . Si sabe que sus cuadros están numerados del 0 al 700, puede calcular los números usted mismo:

convert $(for ((a=0; a<700; a++)); do printf -- "-delay 10 name%s.png " $a; done;) result.gif

55
No experimento este comportamiento con convert, para mí convert -delay 1000 -loop 0 *.png animation.gifagrega un retraso de 10 segundos entre cada imagen.
Lode

1
También puede usar el tipo de versión del lscomando. Es decir:convert -delay 1000 $(ls -v name*png) output.gif
erik

7

Actualizar:

Úselo convertpara png-a-gif, luego use gifsicle para la animación. No es una solución One App to Do It All, pero es programable, seguro.


GIMP puede crear gifs animados y proporciona control de tiempo / retraso y repetición, etc.


44
Sé sobre el gimp pero no sé cómo escribirlo. Además, usar el gimp para crear animación es como matar una mosca con un cañón
Yotam

1
Esa es una mala idea; la calidad será horrible, ya que cada cuadro se cuantificará por separado.
Clément

2

ImageMagick puede generar una animación GIF de buena calidad. Mira este video: http://www.youtube.com/watch?v=OFusYizJ-bA


66
¡Bienvenido a Unix y Linux! En general, nos gustan las respuestas en el sitio para poder sostenerse por sí mismas. Los enlaces son geniales, pero si ese enlace alguna vez se rompe, la respuesta debería tener suficiente información para seguir siendo útil. Considere editar su respuesta para incluir más detalles. Consulte las preguntas frecuentes para obtener más información.
slm

Qué comentario útil más arriba ...
Lucas

1
convert -delay 200 -loop 0 *.jpg output.gif
Lucas

@Luke - de todo el caos publicado bajo esta pregunta, tu comentario fue más útil
Cipricus

2

ffmeg opciones GIF importantes + datos de prueba

Para complementar esta respuesta :

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
ffmpeg \
  -framerate 60 \
  -pattern_type glob \
  -i 'tmp.*.png' \
  -r 15 \
  -vf scale=512:-1 \
  out.gif \
;

Los datos de prueba fueron generados con: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

Las ffmpegopciones importantes que quería destacar son:

  • -patter_type glob: forma conveniente de seleccionar imágenes
  • -framerate 60y -r 15: suponga 60 FPS en las imágenes de entrada ( ffmpegno se puede saber lo contrario, ya que no hay datos de FPS en las imágenes como en los formatos de video), elija una cada 4 imágenes para reducir el tamaño ( 4 == 60 / 15)
  • -vf scale=512:-1: establece el ancho, la altura de la escala proporcionalmente, generalmente para reducir el tamaño y ahorrar espacio

Ver también:

Probado en Ubuntu 18.10, ffmpeg 4.0.2.


-1

En cuanto al punto 2

La versión de ImageMagick "display" que tengo (ImageMagick 6.7.2-7 2017-01-12) ignora la velocidad de fotogramas establecida usando el comando de conversión para producir el gif animado. Pruebe con otro programa para ver el gif animado como Firefox.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.