在Gtk+中绘制图像的最快方法是什么?

8 投票
3 回答
4175 浏览
提问于 2025-04-15 12:04

我有一张图片/像素缓冲区,想把它画到一个gtk.DrawingArea上,并且需要频繁刷新,所以这个绘制操作必须要快。用简单的方法来做:

def __init__(self):
  self.drawing_area = gtk.DrawingArea()
  self.image = gtk.gdk.pixbuf_new_from_file("image.png")

def area_expose_cb(self, area, event):
  self.drawing_area.window.draw_pixbuf(self.gc, self.image, 0, 0, x, y)

但是这样做的效果很慢,可能是因为像素缓冲区的颜色格式和显示器不匹配。

我用Cairo也没成功,因为它似乎只支持24位和32位的格式,而不支持16位的格式(FORMAT_RGB16_565不被支持且已被弃用)。

在Gtk+中,有什么其他方法可以快速绘制图片呢?

3 个回答

0

可以试着做一些性能测试——如果你在一个小区域内绘图,速度还是慢吗?

如果还是慢的话,可能可以去pygtk或者gtk的邮件列表上问问...

2

你真的没有产生足够的速度或处理能力吗?还是说你只是看到了一些闪烁的现象?

如果是后者,那你可能需要考虑使用双缓冲来进行更新。简单来说,就是先在一个看不见的缓冲区里绘图,然后再告诉显卡使用这个新的缓冲区。

也许你可以看看这个页面,上面有一些关于双缓冲的信息

7

试着创建一个Pixmap,它使用和你的绘图区域相同的颜色映射。

dr_area.realize()
self.gc = dr_area.get_style().fg_gc[gtk.STATE_NORMAL]
img = gtk.gdk.pixbuf_new_from_file("image.png")
self.image = gtk.gdk.Pixmap(dr_area.window, img.get_width(), img.get_height())
self.image.draw_pixbuf(self.gc, img, 0, 0, 0, 0)

然后用下面的代码把它画到屏幕上。

dr_area.window.draw_drawable(self.gc, self.image, 0, 0, x, y, *self.image.get_size())

撰写回答