306

ビデオを作成したい一連の画像があります。理想的には、各フレームのフレーム期間を指定できますが、固定フレーム レートでも問題ありません。これを wxPython で行っているので、wxDC にレンダリングしたり、画像を PNG などのファイルに保存したりできます。これらのフレームからビデオ (AVI、MPG など) またはアニメーション GIF を作成できる Python ライブラリはありますか?

編集: 私はすでに PIL を試しましたが、うまくいかないようです。誰かがこの結論で私を訂正したり、別のツールキットを提案したりできますか? このリンクは、PIL に関する私の結論を裏付けているようです: http://www.somethinkodd.com/oddthinking/2005/12/06/python-imaging-library-pil-and-animated-gifs/

4

24 に答える 24

378

PIL/Pillow に問題があり、積極的にメンテナンスされていないため、visvis の images2gif を使用しないことをお勧めします (私は作成者なので、知っておく必要があります)。

代わりに、この問題などを解決するために開発され、今後も維持される予定のimageioを使用してください。

迅速で汚い解決策:

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

より長いムービーの場合は、ストリーミング アプローチを使用します。

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)
于 2016-03-11T15:19:07.520 に答える
56

さて、今私は ImageMagick を使用しています。フレームを PNG ファイルとして保存し、Python から ImageMagick の convert.exe を呼び出して、アニメーション GIF を作成します。このアプローチの良いところは、各フレームのフレーム期間を個別に指定できることです。残念ながら、これはマシンにインストールされている ImageMagick に依存します。彼らはPythonラッパーを持っていますが、それはかなり安っぽく、サポートされていないようです. まだ他の提案を受け付けています。

于 2009-04-15T21:34:42.333 に答える
42

2009 年 6 月現在、最初に引用されたブログ投稿には、コメントにアニメーション GIF を作成する方法が記載されています。スクリプトimages2gif.py (以前のimages2gif.py、@geographika の好意による更新) をダウンロードします。

次に、たとえば gif のフレームを逆にするには:

#!/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)
于 2010-03-04T00:13:13.413 に答える
27

使いやすいimages2gif.pyを使用しました。ただし、ファイルサイズが2倍になるように見えました..

26 個の 110kb PNG ファイル、26*110kb = 2860kb を期待していましたが、my_gif.GIF は 5.7mb でした

また、GIFは8ビットだったので、素敵なpngがGIFで少しぼやけてしまいました

使用したコードは次のとおりです。

__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

26 フレームのうちの 3 フレームを次に示します。

26フレーム中の3フレームです。

画像を縮小すると、サイズが縮小されました。

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

小さいgif

于 2012-04-29T22:51:44.027 に答える
20

ビデオを作成するには、 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])
于 2009-07-30T04:29:45.000 に答える
6

ウォーレンが昨年言ったように、これは古い質問です。人々はまだページを閲覧しているように見えるので、より最新のソリューションにリダイレクトしたいと思います. ここでblakev が言ったように、 githubに Pillow の例があります。

 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()

注: この例は古くなっています (gifmakerはインポート可能なモジュールではなく、スクリプトのみです)。Pillow にはGifImagePlugin (ソースはGitHub にあります) がありますが、ImageSequence のドキュメントは限定的なサポートを示しているようです (読み取り専用) 。

于 2016-06-11T00:46:10.173 に答える
5

これは Python ライブラリではありませんが、mencoder はそれを行うことができます:複数の入力画像ファイルからのエンコード。次のように Python から mencoder を実行できます。

import os

os.system("mencoder ...")
于 2009-04-15T22:24:43.790 に答える
5
from PIL import Image
import glob  #use it if you want to read all of the certain file type in the directory
imgs=[]
for i in range(596,691): 
    imgs.append("snap"+str(i)+'.png')
    print("scanned the image identified with",i)  

異なるファイル名を識別するインデックスの開始値と終了値 + 1

imgs = glob.glob("*.png") #do this if you want to read all files ending with .png

私のファイルは:snap596.png、snap597.png ...... snap690.png

frames = []
for i in imgs:
    new_frame = Image.open(i)
    frames.append(new_frame)

永遠にループする GIF ファイルに保存する

frames[0].save('fire3_PIL.gif', format='GIF',
    append_images=frames[1:],
    save_all=True,
    duration=300, loop=0)

imageio でちらつきの問題が見つかり、この方法で修正されました。

于 2020-11-02T06:45:22.743 に答える
5

古い質問、良い答えがたくさんありますが、別の選択肢にまだ関心があるかもしれません...

numpngw最近 github に投稿したモジュール ( https://github.com/WarrenWeckesser/numpngw )は、numpy 配列からアニメーション PNG ファイルを書き込むことができます。(更新:numpngw現在 pypi にあります: https://pypi.python.org/pypi/numpngw。)

たとえば、このスクリプトは次のとおりです。

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)

作成します:

アニメーションpng

アニメーションを表示するには、アニメーション PNG (直接またはプラグインを使用) をサポートするブラウザーが必要です。

于 2015-10-06T19:55:45.917 に答える
4

PyMediaを試しましたか? 100% 確実ではありませんが、このチュートリアルの例はあなたの問題を対象としているようです。

于 2009-04-22T15:08:02.107 に答える
4

windows7、python2.7、opencv 3.0 では、次のように動作します。

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)
于 2016-01-01T12:02:05.900 に答える
2

このタスクは、一連の画像ファイルと同じフォルダーから 2 行の Python スクリプトを実行することで完了できます。png 形式のファイルの場合、スクリプトは -

from scitools.std import movie
movie('*.png',fps=1,output_file='thisismygif.gif')
于 2015-02-02T10:07:11.883 に答える
0

私は PIL のImageSequenceモジュールに出会いました。これは、より優れた (そしてより標準的な) GIF アニメーションを提供します。今回も Tk のafter()メソッドを使用していますが、これはtime.sleep()よりも優れています。

from Tkinter import * 
from PIL import Image, ImageTk, ImageSequence

def stop(event):
  global play
  play = False
  exit() 

root = Tk()
root.bind("<Key>", stop) # Press any key to stop
GIFfile = {path_to_your_GIF_file}
im = Image.open(GIFfile); img = ImageTk.PhotoImage(im)
delay = im.info['duration'] # Delay used in the GIF file 
lbl = Label(image=img); lbl.pack() # Create a label where to display images
play = True;
while play:
  for frame in ImageSequence.Iterator(im):
    if not play: break 
    root.after(delay);
    img = ImageTk.PhotoImage(frame)
    lbl.config(image=img); root.update() # Show the new frame/image

root.mainloop()
于 2018-04-27T07:57:20.377 に答える