2014-07-21 27 views
0

我有这个小小的python脚本,它打开一个窗口并在窗口中放置一个GIF动画。我使用它作为屏幕保护程序(没有什么幻想,真的)。我的问题是,GIF不是我的显示器的大小;它在屏幕上很小。我想要做的是将其缩放到屏幕的大小。我已经研究过PIL以及images2gif,但他们没有给我我需要的缩放选项。放大python中的动画GIF与PyGTK一起使用

我想要做的是在脚本中加载动画GIF,然后缩放它,最后在PyGTK生成的窗口中播放。我试过的是用subprocess来捕捉gifsicle的输出。虽然这确实缩放了GIF,但我无法在脚本的PyGTK部分使用它,因为从subprocess返回的数据。我要做的就是:

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.3 foo.gif调用中使用的数据?或者是否有一种纯粹的Python缩放动画GIF并将其与PyGTK一起使用的方式?

回答

1

逻辑,你可以在所有GdkPixbuf包含内GdkPixbuf.PixbufAnimation使用

GdkPixbuf.Pixbuf.scale_simple() 

。如何获得单个GdkPixbuf.Pixbuf?使用iter浏览GdkPixbuf.PixbufAnimation。第一个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 
+0

谢谢你的回答,@luciomrx。为了解决这个问题,你建议从动画中获取一个迭代器,然后用'pbuf = iter.get_pixbuf()'来遍历每个动画图像的循环,并推进它,我会使用iter = iter。前进(glib.get_current_time())'而经历循环的每次迭代?然后我用'simpleanim = gtk.gdk.PixbufSimpleAnim(width,height,rate)'创建一个动画,并用'simpleanim.add_frame(pbuf)'填充'simpleanim'。 – Ertain

+0

是的。 PIL实际上是我的第一选择,但最近数百个PIL的实验完全不能满足我。 – luciomrx

+0

此代码向正确的方向发送了我。不过,我仍然无法设置正确的屏幕保护程序。感谢您的帮助,@luciomrx。 – Ertain