344 votes

Générer par programmation vidéo ou GIF animé en Python?

J'ai une série d'images que je veux créer une vidéo à partir d'. Idéalement je pourrais spécifier l'image de la durée de chaque image, mais un cadre fixe taux serait bien aussi. Je fais cela en wxPython, afin que je puisse rendre à un wxDC ou je peux enregistrer les images dans les fichiers, comme le PNG. Est-il une bibliothèque Python qui va me permettre de créer une vidéo (AVI, MPG, etc) ou d'un GIF animé à partir de ces images?

Edit: j'ai déjà essayé de PIL et il ne semble pas fonctionner. Quelqu'un peut-il me corriger avec cette conclusion ou suggérer une autre boîte à outils? Ce lien semble sauvegarde ma conclusion concernant PIL: http://www.somethinkodd.com/oddthinking/2005/12/06/python-imaging-library-pil-and-animated-gifs/

61voto

FogleBird Points 23405

Eh bien, maintenant, je suis en utilisant ImageMagick. - Je enregistrer mes images en tant que fichiers PNG et ensuite invoquer ImageMagick convert.exe à partir de Python pour créer un GIF animé. La bonne chose à propos de cette approche est que je peux spécifier l'image de la durée de chaque image individuellement. Malheureusement, cela dépend de ImageMagick est installé sur la machine. Ils ont un wrapper Python, mais il semble assez merdique et non pris en charge. Toujours ouvert à d'autres suggestions.

43voto

kostmo Points 2265

En juin 2009, à l'origine de la cité blog a une méthode pour créer des Gif animés dans les commentaires. Télécharger le script images2gif.py (anciennement images2gif.py, de courtoisie mise à jour de @geographika).

Ensuite, pour inverser les images en gif, par exemple:

#!/usr/bin/env python

from PIL import Image, ImageSequence
import sys, os
filename = sys.argv[1]
im = Image.open(filename)
original_duration = im.info['duration']
frames = [frame.copy() for frame in ImageSequence.Iterator(im)]    
frames.reverse()

from images2gif import writeGif
writeGif("reverse_" + os.path.basename(filename), frames, duration=original_duration/1000.0, dither=0)

28voto

robert king Points 5369

J'ai utilisé images2gif.py ce qui était facile à utiliser. Il semble en fait le double de la taille du fichier ...

26 110kb fichiers PNG, je m'attendais à 26*110kb = 2860kb, mais my_gif.GIF a été de 5,7 mo

Aussi parce que le GIF a été 8bit, la belle de la png est devenue un peu floue dans le GIF

Voici le code que j'ai utilisé:

__author__ = 'Robert'
from images2gif import writeGif
from PIL import Image
import os

file_names = sorted((fn for fn in os.listdir('.') if fn.endswith('.png')))
#['animationframa.png', 'animationframb.png', 'animationframc.png', ...] "

images = [Image.open(fn) for fn in file_names]

print writeGif.__doc__
# writeGif(filename, images, duration=0.1, loops=0, dither=1)
#    Write an animated gif from the specified images.
#    images should be a list of numpy arrays of PIL images.
#    Numpy images of type float should have pixels between 0 and 1.
#    Numpy images of other types are expected to have values between 0 and 255.


#images.extend(reversed(images)) #infinit loop will go backwards and forwards.

filename = "my_gif.GIF"
writeGif(filename, images, duration=0.2)
#54 frames written
#
#Process finished with exit code 0

Voici 3 des 26 images:

Here are 3 of the 26 frames

le rétrécissement des images réduit la taille:

size = (150,150)
for im in images:
    im.thumbnail(size, Image.ANTIALIAS)

smaller gif

21voto

attwad Points 516

Pour créer une vidéo, vous pouvez utiliser opencv,

#load your frames
frames = ...
#create a video writer
writer = cvCreateVideoWriter(filename, -1, fps, frame_size, is_color=1)
#and write your frames in a loop if you want
cvWriteFrame(writer, frames[i])

5voto

willurd Points 2715

Ce n'est pas une bibliothèque python, mais mencoder peut le faire: l'Encodage à partir de plusieurs fichiers d'images d'entrée. Vous pouvez exécuter la commande mencoder de python comme ceci:

import os

os.system("mencoder ...")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X