Tengo una serie de imágenes a partir de las cuales quiero crear un video. Idealmente, podría especificar una duración de cuadro para cada cuadro, pero una velocidad de cuadro fija también estaría bien. Estoy haciendo esto en wxPython, por lo que puedo renderizar a un wxDC o puedo guardar las imágenes en archivos, como PNG. ¿Existe una biblioteca de Python que me permita crear un video (AVI, MPG, etc.) o un GIF animado a partir de estos cuadros?
Editar: ya he probado PIL y parece que no funciona. ¿Alguien puede corregirme con esta conclusión o sugerir otro conjunto de herramientas? Este enlace parece respaldar mi conclusión con respecto a PIL: http://www.somethinkodd.com/oddthinking/2005/12/06/python-imaging-library-pil-and-animated-gifs/
fuente
imageio in anaconda
cedeTrue
, yay!Bueno, ahora estoy usando ImageMagick. Guardo mis cuadros como archivos PNG y luego invoco el convert.exe de ImageMagick desde Python para crear un GIF animado. Lo bueno de este enfoque es que puedo especificar una duración de cuadro para cada cuadro individualmente. Lamentablemente, esto depende de que ImageMagick esté instalado en la máquina. Tienen un envoltorio de Python pero se ve bastante malo y sin soporte. Todavía abierto a otras sugerencias.
fuente
convert -delay 20 -loop 0 *jpg animated.gif
convert -delay 20 -resize 300x200 -loop 0 *jpg animated.gif
A partir de junio de 2009, la publicación de blog citada originalmente tiene un método para crear GIF animados en los comentarios . Descargue el script images2gif.py (anteriormente images2gif.py , actualización cortesía de @geographika).
Luego, para invertir los cuadros en un gif, por ejemplo:
fuente
pip install visvis
, por ejemplo , luego en su scriptfrom visvis.vvmovie.images2gif import writeGif
.Así es como lo hace usando solo PIL (instalar con :)
pip install Pillow
:fuente
x = [a, b, c]
a*x
que puede ser pensado comoa, b, c
(sin los corchetes que encierran). En las llamadas a funciones son sinónimos:f(*x) == f(a, b, c)
. En el desempaquetado de tuplas es particularmente útil en los casos en que desea dividir un iterable en una cabeza (primer elemento) y una cola (el resto), que es lo que hago en este ejemplo.Solía images2gif.py que era fácil de usar. Aunque parecía duplicar el tamaño del archivo ...
26 archivos PNG de 110kb, esperaba 26 * 110kb = 2860kb, pero my_gif.GIF fue 5.7mb
También porque el GIF era de 8 bits, los buenos png se volvieron un poco borrosos en el GIF
Aquí está el código que usé:
Aquí hay 3 de los 26 cuadros:
reducir las imágenes redujo el tamaño:
fuente
fp.write(globalPalette) TypeError: must be string or buffer, not list
Para crear un video, puede usar opencv ,
fuente
Me encontré con esta publicación y ninguna de las soluciones funcionó, así que aquí está mi solución que funciona
Problemas con otras soluciones hasta ahora:
1) No hay una solución explícita sobre cómo se modifica la duración
2) No hay solución para la iteración del directorio fuera de orden, que es esencial para los GIF
3) No hay explicación de cómo instalar imageio para python 3
instale imageio así: python3 -m pip install imageio
Nota: querrás asegurarte de que tus marcos tengan algún tipo de índice en el nombre del archivo para que se puedan ordenar, de lo contrario no tendrás forma de saber dónde comienza o termina el GIF
fuente
sort
podría producir resultados inesperados si su esquema de numeración no incluye ceros a la izquierda. Además, ¿por qué usaste el mapa en lugar de una simple lista de comprensión?filenames.append(os.path.join(path, filename))
images = [imageio.imread(f) for f in filenames]
es más limpio, más rápido y más pitónico.Como Warren dijo el año pasado , esta es una vieja pregunta. Como las personas todavía parecen estar viendo la página, me gustaría redirigirlas a una solución más moderna. Como dijo blakev aquí , hay un ejemplo de Pillow en github .
Nota: Este ejemplo está desactualizado (
gifmaker
no es un módulo importable, solo un script). Pillow tiene un GifImagePlugin (cuya fuente está en GitHub ), pero el documento en ImageSequence parece indicar un soporte limitado (solo lectura)fuente
No es una biblioteca de Python, pero mencoder puede hacer eso: codificar desde múltiples archivos de imagen de entrada . Puede ejecutar mencoder desde python de esta manera:
fuente
Antigua pregunta, muchas buenas respuestas, pero aún podría haber interés en otra alternativa ...
El
numpngw
módulo que coloqué recientemente en github ( https://github.com/WarrenWeckesser/numpngw ) puede escribir archivos PNG animados desde matrices numpy. ( Actualización :numpngw
ahora está en pypi: https://pypi.python.org/pypi/numpngw ).Por ejemplo, este script:
crea:
Necesitará un navegador que admita PNG animado (ya sea directamente o con un complemento) para ver la animación.
fuente
Como un miembro mencionó anteriormente, imageio es una excelente manera de hacer esto. imageio también le permite establecer la velocidad de fotogramas, y en realidad escribí una función en Python que le permite establecer una retención en el fotograma final. Utilizo esta función para animaciones científicas donde el bucle es útil pero el reinicio inmediato no lo es. Aquí está el enlace y la función:
Cómo hacer un GIF usando Python
fuente
¿Has probado PyMedia ? No estoy 100% seguro, pero parece que este ejemplo de tutorial apunta a su problema.
fuente
Con windows7, python2.7, opencv 3.0, lo siguiente funciona para mí:
fuente
Lo más fácil que hace que funcione para mí es llamar a un comando de shell en Python.
Si sus imágenes se almacenan como dummy_image_1.png, dummy_image_2.png ... dummy_image_N.png, puede usar la función:
Solo ejecuta:
Esto construirá su archivo gif my_output.gif.
fuente
La tarea se puede completar ejecutando el script de Python de dos líneas desde la misma carpeta que la secuencia de archivos de imagen. Para archivos con formato png, el script es:
fuente
Estaba buscando un código de línea única y encontré que lo siguiente funcionaba para mi aplicación. Aquí esta lo que hice:
Primer paso: instale ImageMagick desde el siguiente enlace
https://www.imagemagick.org/script/download.php
Segundo paso: Apunte la línea cmd a la carpeta donde se colocan las imágenes (en mi caso, formato .png)
Tercer paso: escriba el siguiente comando
Gracias FogleBird por la idea!
fuente
Acabo de intentar lo siguiente y fue muy útil:
Primero descargue las bibliotecas
Figtodat
yimages2gif
en su directorio local.En segundo lugar, reúna las figuras en una matriz y conviértalas en un gif animado:
fuente
Encontré el módulo ImageSequence de PIL , que ofrece una mejor (y más estándar) aninmación GIF. También utilizo el método after () de Tk esta vez, que es mejor que time.sleep () .
fuente
Una función simple que hace GIF:
fuente
Entiendo que preguntaste sobre convertir imágenes a un gif; sin embargo, si el formato original es MP4, puede usar FFmpeg :
fuente
Es realmente increíble ... ¡Todos están proponiendo un paquete especial para reproducir un GIF animado, en el momento en que se puede hacer con Tkinter y el clásico módulo PIL!
Aquí está mi propio método de animación GIF (creé hace un tiempo). Muy simple:
Puede establecer sus propios medios para detener la animación. Avíseme si desea obtener la versión completa con los botones reproducir / pausar / salir.
Nota: No estoy seguro si los marcos consecutivos se leen de la memoria o del archivo (disco). En el segundo caso, sería más eficiente si todos leen a la vez y se guardan en una matriz (lista). (¡No estoy tan interesado en descubrirlo! :)
fuente
sleep
al hilo principal de una GUI. Puede usar elafter
método para llamar a una función periódicamente.tk.after()
me uso a mí mismo. Pero aquí necesitaba hacer el código lo más simple posible. Quien use este método de animación GIF puede aplicar su propia función de retraso.