2010-09-10 33 views
16

Necesito algo que pueda escribirse en Windows 7. Esta imagen se usará en banners.Crear un gif animado a partir de un conjunto de imágenes JPEG

+1

¿necesita ser jpeg? jpeg-> anim gif es probable que tenga artefactos de parpadeo no deseados con una peor relación de compresión. debe usar lossless -> gif, o gif-> gif para obtener los mejores resultados de calidad. – tenfour

+1

@tenfour - aunque lo que ha señalado es perfectamente válido, no es necesariamente una regla práctica. Mucho más importante es que los marcos comparten colores similares, porque si no lo hacen, la paleta de un máximo de 256 colores de una imagen GIF que se comparte entre marcos producirá malos resultados, independientemente del formato de entrada y, a menudo, dejará a la gente preguntándose " ¿por qué salió granulado?! " –

Respuesta

31

Usted puede hacer esto con ffmpeg

Primera convertir las imágenes de un vídeo:

ffmpeg -f image2 -i image%d.jpg video.avi 

(Esto convertirá las imágenes desde el directorio actual (llamado imagen1.jpg, image2.jpg .. .) a un archivo de vídeo llamado video.avi)

continuación, convertir el avi a un gif:.

ffmpeg -i video.avi -pix_fmt rgb24 -loop_output 0 out.gif 

Puede obtener windows binaries for ffmpeg here.


También se puede hacer una cosa similar con mplayer. Ver Encoding from multiple input image files.

creo que la línea de comandos sería algo así como:

mplayer mf://*.jpg -mf w=800:h=600:type=jpg -vf scale=160:120 -vo gif89a:fps=3:output=out.gif 

(donde 800 & 600 son su fuente de ancho, la altura y 160 & 120 son el ancho de destino y height.out.gif es su archivo de destino nombre)


Acabo de probar ambos y ambos funcionan bien. Sin embargo, obtuve resultados mucho mejores de mplayer, ya que pude especificar la resolución y la velocidad de fotogramas. Tu kilometraje puede variar y estoy seguro de que podrías encontrar más opciones para ffmpeg si lo buscas.

+0

Usando la versión más reciente de mplayer, solo imprime su página de manual. –

+1

esto tiene una buena calificación de búsqueda de Google, por lo que si quiere prefijar números con ceros, use '% 04d' (número 4 usaría 4 posiciones de números con el prefijo 0) – user151496

+0

¡no se encontró ningún archivo con el nombre' image1d.jpg'! tratando de usar cmd – user25

10

El ffmpeg a .avi y .avi a .gif trabajado, pero la única cosa a destacar es que las imágenes deben ser nombradas en perfecto orden numérico creciente al trabajo, sin huecos. Yo cocinaba un script en Python rápida para cambiar el nombre de todas mis imágenes en consecuencia para que este ffmpeg receta funcionaría:

import os 

files = [ f for f in os.listdir('.') if os.path.isfile(os.path.join('.',f)) and f.endswith('.jpg') ] 
for i, file in enumerate(sorted(files)): 
    os.rename(file, 'image%03d.jpg' % i) 

Y entonces me topé con un enfoque mucho más simple que ffmpeg para hacer la conversión, la cual es simplemente el uso de herramienta de conversión de línea de comandos de ImageMagick como esto

convert image%03d.jpg[0-198] animated_gif.gif 

no consigue mucho más simple que la gente.

Gist aquí: https://gist.github.com/3289840

+1

_ "las imágenes deben nombrarse en orden numérico creciente perfecto" _ - Supongo que usted no sabe acerca de '-pattern_type glob', permite usar archivos con cualquier nombre como entrada, por ejemplo, para convertir todos los png en el directorio actual a gif: 'ffmpeg -framerate 1/10 -pattern_type glob -i '* .png' output.gif' –

24

Con ImageMagick:

convert *.png a.gif 
+0

también mira aquí: http: // stackoverflow.com/questions/5508945/imagemagick-animated-gif-size-optimization –

+0

Tuve problemas de calidad al usar archivos .png (debido a la transparencia y la estratificación) que se corrigieron utilizando .jpg en su lugar – ZG101

+0

Puedes usar '-delay' para establecer la duración de cada imagen. Tenga en cuenta que el valor se da en 1/100 segundos, es decir, '-delay 100' da como resultado una velocidad de un fotograma por segundo. – luator

44

Simon P Stevens' answer casi me llegaron allí:

ffmpeg -f image2 -i image%d.jpg video.avi 
ffmpeg -i video.avi -pix_fmt rgb24 -loop_output 0 out.gif 

Vamos a ver si podemos sobrehilarlos esto.

Ir a través de un avi no es necesario. Un -pix_fmt de rgb24 no es válido y la opción -loop_output evita el bucle, que no quiero. Obtenemos:

ffmpeg -f image2 -i image%d.jpg out.gif 

Mis imágenes de entrada son etiquetados con un número cero acolchado de 3 dígitos y tengo 30 de ellos (IMAGE_001.jpg, image_002.jpg, ...), así que tengo que fijar el formato especificador

ffmpeg -f image2 -i image_%003d.jpg out.gif 

Mis imágenes de entrada son de la cámara de mi teléfono, ¡son demasiado grandes! Necesito escalarlos.

ffmpeg -f image2 -i image_%003d.jpg -vf scale=531x299 out.gif 

que también tienen que rotar 90 grados en sentido horario

ffmpeg -f image2 -i image_%003d.jpg -vf scale=531x299,transpose=1 out.gif 

Este gif jugará con retardo cero entre cuadros, que probablemente no es lo que queremos. Especificar la velocidad de fotogramas de las imágenes de entrada

La imagen es sólo un poco demasiado grande, así que voy a recortar 100 píxeles de cielo. La transpuesta hace que esta complicado, yo uso los X-post girado y valores de y:

ffmpeg -f image2 -framerate 9 -i image_%003d.jpg -vf scale=531x299,transpose=1,crop=299,431,0,100 out.gif 

El resultado final - llego a compartir impresionante expresión facial de mi compañero con el mundo:

Example of an animated gif created with ffmpeg

+4

Gracias por la respuesta detallada y la explicación paso a paso. – Ideogram

+0

% 003d ffmpeg reemplaza esto con ruta - 'image_C:/user/...' – user25

+0

entendido, no funcionará si ejecuto el comando con el archivo cmd – user25

1

Basado en las respuestas de Simon P Stevens y dwurf me ocurrió con esta solución simplificada:

ffmpeg -f image2 -framerate 1 -i image%d.jpg video.gif 

esto resulta en una velocidad de 1 segundo por imagen. Ajuste el valor framerate según sus necesidades.