在Python中放大动画GIF供PyGTK使用

1 投票
1 回答
1428 浏览
提问于 2025-04-18 14:09

我有一个小的Python脚本,它可以打开一个窗口,并在窗口里放一个动画GIF。我把它当作屏幕保护程序用(其实没什么特别的)。我的问题是,这个GIF的大小没有填满我的显示器,屏幕上看起来很小。我想把它放大到屏幕的大小。我查过PIL和images2gif,但它们没有提供我需要的缩放选项。

我想在脚本中加载这个动画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 个回答

2

从逻辑上讲,你可以在 GdkPixbuf.PixbufAnimation 中使用

GdkPixbuf.Pixbuf.scale_simple ()

来处理所有 GdkPixbuf 包含的内容。要获取单个的 GdkPixbuf.Pixbuf,你可以使用迭代器来遍历 GdkPixbuf.PixbufAnimation。第一个迭代器会是

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

撰写回答