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.
Yotam
fuente
[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
nano
fuente
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

RobinJ
fuente
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
BatchyX
fuente
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.

gregnotcraig
fuente
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

xyz
fuente
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.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
-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.

usuario8388891
fuente