在python中放大要与PyGTK一起使用的动画GIF

在python中放大要与PyGTK一起使用的动画GIF,python,animation,pygtk,animated-gif,Python,Animation,Pygtk,Animated Gif,我有一个小python脚本,它打开一个窗口,并在窗口中放置一个动画GIF。我用它作为屏幕保护程序(真的没什么特别的)。我的问题是GIF的大小和我的显示器不一样;它在屏幕上很小。我想做的是将它缩放到屏幕的大小。我已经研究了PIL和images2gif,但它们没有提供我需要的缩放选项 我想做的是在脚本中加载动画GIF,然后缩放它,最后在PyGTK生成的窗口中播放。我尝试使用子流程捕获gifsicle的输出。虽然这确实会缩放GIF,但由于从子流程返回的数据,我无法在脚本的PyGTK部分使用它。我所做的

我有一个小python脚本,它打开一个窗口,并在窗口中放置一个动画GIF。我用它作为屏幕保护程序(真的没什么特别的)。我的问题是GIF的大小和我的显示器不一样;它在屏幕上很小。我想做的是将它缩放到屏幕的大小。我已经研究了PIL和images2gif,但它们没有提供我需要的缩放选项

我想做的是在脚本中加载动画GIF,然后缩放它,最后在PyGTK生成的窗口中播放。我尝试使用
子流程
捕获gifsicle的输出。虽然这确实会缩放GIF,但由于从
子流程
返回的数据,我无法在脚本的PyGTK部分使用它。我所做的是:

p = subprocess.check_output(["gifsicle --scale 3.3 foo.gif"], shell=True)
变量
p
具有动画GIF数据,但在这种情况下我不能与PyGTK一起使用。理想情况下,我希望像这样加载它:

pixbufAn = gtk.gdk.pixbufAnimation(p)
image = gtk.Image()
image.set_from_animation(pixbufAn)
我有没有办法使用
gifsicle--scale 3.3foo.gif
调用中的数据?或者是否有一种纯Python的方式来缩放动画GIF并将其与PyGTK一起使用?

逻辑上您可以使用

GdkPixbuf.Pixbuf.scale_simple ()
在GdkPixbuf.PixbufAnimation中包含的所有GdkPixbuf上。如何获取单个GdkPixbuf.Pixbuf?使用iter遍历GdkPixbuf.pixBuf动画。第一个iter将是

iter = GdkPixbuf.PixbufAnimation.get_iter (GLib.get_current_time() )
pbuf = iter.get_pixbuf ()
# scale the pbuf below
......
# make this on a loop
iter = iter.advance (GLib.get_current_time())

# after getting all the pbuf, pack again into GdkPixbuf.PixbufSimpleAnim
simpleanim = GdkPixbuf.PixbufSimpleAnim (width, height, rate)
# loop again
simpleanim.add_frame (pbuf)

# after done all the chores, call the
Gtk.Image.set_from_animation (simpleanim) #simpleanim implemented anim

谢谢你的回答,@luciomrx。为了解决这个问题,您建议从动画中获取一个迭代器,然后使用循环通过
pbuf=iter.get\u pixbuf()
,遍历动画的每个图像,并且在遍历循环的每个迭代时使用
iter=iter.advance(glib.get\u current\u time())
?然后我用
simpleanim=gtk.gdk.PixbufSimpleAnim(宽度、高度、速率)
创建一个动画,并用
simpleanim.add_frame(pbuf)
填充
simpleanim
。实际上,PIL将是我的第一选择,但最近数百个PIL实验根本不能让我满意。这段代码让我走上了正确的方向。不过,我还没能设置正确的屏幕保护程序。谢谢你的帮助,@luciomrx。这个解决方案很诱人,但也有一些缺陷。首先,
GLib.get_current_time()
返回一个浮点值,而不是
GLib.TimeVal
。它可以手工构建,所以没什么大不了的。第二,我看不到一种方法来知道你什么时候完成了对所有帧的迭代。