【问题标题】:Scaling up an animated GIF in python to be used with PyGTK在 python 中放大动画 GIF 以与 PyGTK 一起使用
【发布时间】:2014-07-21 20:17:19
【问题描述】:

我有一个小 Python 脚本,它打开一个窗口并在窗口内放置一个动画 GIF。我将它用作屏幕保护程序(真的没什么花哨的)。我的问题是 GIF 不是我显示器的大小。它在屏幕上非常小。我想做的是将它缩放到屏幕的大小。我研究了 PIL 和 images2gif,但它们没有给我所需的缩放选项。

我想做的是在脚本中加载动画 GIF,然后对其进行缩放,最后在 PyGTK 生成的窗口中播放。我尝试做的是使用subprocess 来捕获 gifsicle 的输出。虽然这确实缩放了 GIF,但由于从 subprocess 返回的数据,我无法在脚本的 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.3 foo.gif 电话的数据?或者是否有一种纯 Python 方法来缩放动画 GIF 并将其与 PyGTK 一起使用?

【问题讨论】:

    标签: python animation pygtk animated-gif


    【解决方案1】:

    逻辑上你可以使用

    GdkPixbuf.Pixbuf.scale_simple ()
    

    关于所有 GdkPixbuf 包含在 GdkPixbuf.PixbufAnimation 中。如何获取单个 GdkPixbuf.Pixbuf?使用 iter 遍历 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
    

    【讨论】:

    • 感谢您的回答,@luciomrx。为了解决这个问题,您建议从动画中获取一个迭代器,然后使用循环通过pbuf = iter.get_pixbuf() 遍历动画的每个图像,并推进它我会在遍历循环的每个迭代时使用iter = iter.advance(glib.get_current_time()) ?然后我用simpleanim = gtk.gdk.PixbufSimpleAnim(width, height, rate)创建一个动画,用simpleanim.add_frame(pbuf)填充simpleanim
    • 是的。 PIL 实际上是我的第一选择,但最近数百次 PIL 实验并没有让我满意。
    • 这段代码让我朝着正确的方向前进。不过,我无法设置正确的屏幕保护程序。谢谢你的帮助,@luciomrx。
    • 这个解决方案很吸引人,但也有一些缺陷。首先,GLib.get_current_time() 返回一个浮点数而不是 GLib.TimeVal。它可以手动构建,所以没什么大不了的。其次,我没有办法知道您何时完成了对所有帧的迭代。
    猜你喜欢
    • 2017-10-01
    • 1970-01-01
    • 2021-05-26
    • 2011-08-06
    • 2012-09-07
    • 2015-04-15
    • 2011-03-09
    相关资源
    最近更新 更多