2009-04-15 9 views
115

J'ai une série d'images dont je veux créer une vidéo. Idéalement, je pourrais spécifier une durée de trame pour chaque image, mais un taux de trame fixe serait bien aussi. Je fais ceci dans wxPython, ainsi je peux rendre à un wxDC ou je peux enregistrer les images aux dossiers, comme le PNG. Y at-il une bibliothèque Python qui me permettra de créer une vidéo (AVI, MPG, etc) ou un GIF animé à partir de ces images?Générer par programme une vidéo ou GIF animé en Python?

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

Répondre

35

Eh bien, maintenant j'utilise ImageMagick. Je sauvegarde mes cadres en tant que fichiers PNG, puis j'appelle convert.exe de ImageMagick à partir de Python pour créer un fichier GIF animé. La bonne chose à propos de cette approche est que je peux spécifier une durée d'image pour chaque image individuellement. Malheureusement, cela dépend de l'installation d'ImageMagick sur la machine. Ils ont un wrapper Python mais il semble assez merdique et non supporté. Toujours ouvert à d'autres suggestions.

+14

Je suis un gars Python mais j'ai trouvé ImageMagick beaucoup plus facile ici. Je viens de faire ma séquence d'images et j'ai lancé quelque chose comme 'convert -delay 20 -loop 0 * jpg animated.gif' – Nick

+0

Je suis d'accord, c'est la meilleure solution que j'ai trouvée. Voici un exemple minimal (basé sur l'exemple de code de l'utilisateur Steve B posté sur http://stackoverflow.com/questions/10922285/is-there-a-simple-way-to-make-and-save-an-animation-with -pygame): http://pastebin.com/JJ6ZuXdz – andreasdr

+0

En utilisant ImageMagick, vous pouvez également facilement redimensionner le gif animé comme 'convertir -delay 20 -resize 300x200 -loop 0 * jpg animé.gif' – NameGame

18

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]) 
42

En Juin 2009, le billet de blog initialement cité a une méthode pour créer des GIF animés in the comments. Télécharger le script images2gif.py (anciennement images2gif.py, avec l'aimable autorisation de @geographika).

Ensuite, pour inverser les images dans un fichier 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) 
+2

Il y a une nouvelle version de ce script qui rend la sortie de meilleure qualité à http://visvis.googlecode.com/hg/vvmovie/images2gif.py, il peut être utilisé comme un script autonome séparé du paquet. – geographika

+1

Le script mentionné dans ce commentaire me donne systématiquement un défaut de segmentation lorsqu'il est utilisé sur Mac, même lorsqu'il est simplement exécuté (en utilisant l'exemple __name __ == '__ main__'). J'essaie le script mentionné dans la réponse, dans l'espoir que cela fonctionnera correctement. EDIT - Je peux confirmer que le script référencé dans la réponse ci-dessus fonctionne correctement sur mon Mac. – scubbo

+4

Plutôt que de simplement télécharger le script, utilisez p. Ex. 'pip install visvis', puis dans votre script' visvis.vvmovie.images2gif import writeGif'. –

26

J'utilisé images2gif.py qui était facile à utiliser. Il ne semble doubler la taille du fichier si ..

26 110kb fichiers PNG, je pensais 26 * 110kb = 2860kb, mais my_gif.GIF était 5.7MB

aussi parce que le GIF était 8bit, de la belle .png est devenu un peu floue dans le GIF

Voici le code je:

__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 cadres:

Here are 3 of the 26 frames

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

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

smaller gif

+0

J'ai fait un post de blog à ce sujet .. http://www.robert-king.com/#post2-python-makes-gif –

+2

Je reçois des erreurs .. Fichier "C: \ Python27 \ lib \ images2gif.py ", ligne 418, dans writeGifToFile \t globalPalette = palettes [occur.index (max (occur))] \t ValueError: max() arg est une séquence vide – Harry

+0

se produit est probablement vide Mon fichier images2gif.py n'a pas de" globalPalette "variable –

3

La tâche peut être complétée en exécutant le script python deux lignes du même dossier que la séquence des fichiers d'image.Pour des fichiers au format .png le script est -

from scitools.std import movie 
movie('*.png',fps=1,output_file='thisismygif.gif') 
+1

J'ai essayé ... cela n'a pas fonctionné pour moi sous Python 2.6. Renvoyé: "La fonction scitools.easyviz.movie exécute la commande:/convert -delay 100 g4testC _ *. Png g4testC.gif/Invalid Parameter - 100" –

+0

Le problème n'est certainement pas avec Python. Réinstallez imagemagick sur votre système et réessayez. – ArKE

3

question ancienne, beaucoup de bonnes réponses, mais il pourrait encore y avoir intérêt à une autre alternative ...

Le module numpngw que j'ai récemment mis sur github (https://github.com/WarrenWeckesser/numpngw) peut écrire des fichiers PNG animés à partir de tableaux numpy. (Mise à jour : numpngw est maintenant pypi. https://pypi.python.org/pypi/numpngw)

Par exemple, ce script:

import numpy as np 
import numpngw 


img0 = np.zeros((64, 64, 3), dtype=np.uint8) 
img0[:32, :32, :] = 255 
img1 = np.zeros((64, 64, 3), dtype=np.uint8) 
img1[32:, :32, 0] = 255 
img2 = np.zeros((64, 64, 3), dtype=np.uint8) 
img2[32:, 32:, 1] = 255 
img3 = np.zeros((64, 64, 3), dtype=np.uint8) 
img3[:32, 32:, 2] = 255 
seq = [img0, img1, img2, img3] 
for img in seq: 
    img[16:-16, 16:-16] = 127 
    img[0, :] = 127 
    img[-1, :] = 127 
    img[:, 0] = 127 
    img[:, -1] = 127 

numpngw.write_apng('foo.png', seq, delay=250, use_palette=True) 

crée:

animated png

Vous aurez besoin d'un navigateur compatible avec animation PNG pour voir l'animation. Firefox le fait, Safari ne le fait pas, et Chrome a un plugin pour cela.

4

Avec Windows7, python2.7, OpenCV 3.0, les œuvres pour moi suivantes:

import cv2 
import os 

vvw   = cv2.VideoWriter('mymovie.avi',cv2.VideoWriter_fourcc('X','V','I','D'),24,(640,480)) 
frameslist = os.listdir('.\\frames') 
howmanyframes = len(frameslist) 
print('Frames count: '+str(howmanyframes)) #just for debugging 

for i in range(0,howmanyframes): 
    print(i) 
    theframe = cv2.imread('.\\frames\\'+frameslist[i]) 
    vvw.write(theframe) 
93

Je vous recommande de ne pas utiliser images2gif de visvis parce qu'il a des problèmes avec PIL/oreiller et ne se maintient pas activement (Je devrais savoir, parce que je suis l'auteur).

Au lieu de cela, s'il vous plaît utiliser imageio, qui a été développé pour résoudre ce problème et plus, et est destiné à rester.

Solution rapide et sale:

import imageio 
images = [] 
for filename in filenames: 
    images.append(imageio.imread(filename)) 
imageio.mimsave('/path/to/movie.gif', images) 

Pour les films plus longs, utilisez l'approche de streaming:

import imageio 
with imageio.get_writer('/path/to/movie.gif', mode='I') as writer: 
    for filename in filenames: 
     image = imageio.imread(filename) 
     writer.append_data(image) 
+1

Lien vers imageio -> https://pypi.python.org/pypi/imageio – fedmich

+8

également la durée du paramètre = 0.5 définit les durées 0.5sec pour chaque trame. – Alleo

+1

ValueError: Impossible de trouver un format pour lire le fichier spécifié en mode 'i' - Je reçois cette erreur sur windows 2.7 winpython. Des indices? – Vanko

4

Comme Warren a déclaré l'année dernière, c'est une vieille question. Puisque les gens semblent toujours voir la page, j'aimerais les rediriger vers une solution plus moderne. Comme blakev a dit here, il y a un exemple d'oreiller sur github.

import ImageSequence 
import Image 
import gifmaker 
sequence = [] 

im = Image.open(....) 

# im is your original image 
frames = [frame.copy() for frame in ImageSequence.Iterator(im)] 

# write GIF animation 
fp = open("out.gif", "wb") 
gifmaker.makedelta(fp, frames) 
fp.close() 

Note: Cet exemple est obsolète (gifmaker n'est pas un module importable, seul un script). Oreiller a une GifImagePlugin (dont la source est on GitHub), mais the doc on ImageSequence semble indiquer un soutien limité (lecture seule)

1

Je viens d'essayer ce qui suit et était très utile:

d'abord télécharger les bibliothèques Figtodat et images2gif à votre région annuaire.

En second lieu Collectez les chiffres dans un tableau et les convertir en un fichier GIF animé:

import sys 
sys.path.insert(0,"/path/to/your/local/directory") 
import Figtodat 
from images2gif import writeGif 
import matplotlib.pyplot as plt 
import numpy 

figure = plt.figure() 
plot = figure.add_subplot (111) 

plot.hold(False) 
    # draw a cardinal sine plot 
images=[] 
y = numpy.random.randn(100,5) 
for i in range(y.shape[1]): 
    plot.plot (numpy.sin(y[:,i])) 
    plot.set_ylim(-3.0,3) 
    plot.text(90,-2.5,str(i)) 
    im = Figtodat.fig2img(figure) 
    images.append(im) 

writeGif("images.gif",images,duration=0.3,dither=0) 
3

La chose la plus facile qui le fait fonctionner pour moi appelle une commande shell en Python.

Si vos images sont stockées, telles que dummy_image_1.png, dummy_image_2.png ... dummy_image_N..png, vous pouvez utiliser la fonction:

import subprocess 
def grid2gif(image_str, output_gif): 
    str1 = 'convert -delay 100 -loop 1 ' + image_str + ' ' + output_gif 
    subprocess.call(str1, shell=True) 

Juste Execute:

grid2gif("dummy_image*.png", "my_output.gif") 

Cela construira votre fichier gif my_output.gif.

2

Je cherchais un code de ligne unique et a trouvé ce qui suit pour travailler pour mon application. Voici ce que je faisais:

Première étape:Installer ImageMagick à partir du lien ci-dessous

https://www.imagemagick.org/script/download.php

enter image description here

Deuxième étape:point la ligne de cmd dans le dossier où sont placées les images (dans mon cas .png)

enter image description here

Troisième étape:Tapez la commande suivante

magick -quality 100 *.png outvideo.mpeg 

enter image description here

Merci FogleBird pour l'idée!

Questions connexes