如何创建内存中的图像

1 投票
1 回答
728 浏览
提问于 2025-04-17 16:45

我想优化我的Cairo绘图。我的背景是固定不变的,Cairo图形是在这个背景上绘制的。每个类的实例背景可能不同,所以不能用一个静态文件。为了绘制背景,我想这样做:

    if self.pixbuf is None:
        self.pixbuf = self.draw_background(cr, width, height)
        #self.pixbuf = gtk.gdk.pixbuf_new_from_file("/path/to/file.png")

    cr.set_source_pixbuf(self.pixbuf, 0, 0)
    cr.paint()

这样我就只需要创建一次背景,然后把它当作图像显示,并在上面绘制其他东西。这样做是为了节省时间,因为每次有人更改时,我不想重新绘制整个不变的背景。注释掉的那行代码运行得很好,但我真的不想创建一个png文件,保存到临时文件,然后再加载那个文件。这似乎浪费了输入输出的资源。

我试过这样做:

self draw_background (self, cr, width, height)
    pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, int(width), int(height))

    cr.set_source_color(gtk.gdk.color_parse('black'))
    cr.set_line_width(2)
    cr.rectangle(0, 0, width, height)
    cr.stroke()

    cr.paint()
    return pixbuf

但是没有显示背景。

我哪里做错了?

1 个回答

1

正如Uli所说,你现在是在用指向你的控件的上下文来绘图,而不是指向你的图像缓冲区(pixbuf)。如果你想为一个图像缓冲区创建一个新的cairo上下文,可以使用cairo_create这个方法。记得在绘制完成后要销毁这个上下文哦。

撰写回答