Как создать образ в памяти

Я хочу оптимизировать свой рисунок каира. У меня неизменный фон, поверх которого нарисована каирская графика. Фон может быть разным для каждого экземпляра класса, поэтому он не может быть статическим файлом. Чтобы нарисовать фон, я хотел бы сделать что-то вроде этого:

    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, сохранять его во временный файл, а затем загружать этот файл. Это похоже на пустую трату IO.

Я пробовал это:

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

Но фон не отображается.

Что я делаю неправильно?


person Sardathrion - against SE abuse    schedule 22.02.2013    source источник
comment
Разве ваша функция draw_background() не должна отрисовывать новый создаваемый файл pixbuf? Код, который вы вставили, создает новый pixbuf, но ничего в нем не рисует. Другими словами: вместо аргумента cr он должен создать контекст cairo для нового pixbuf. Насколько это помогает?   -  person Uli Schlachter    schedule 23.02.2013
comment
@UliSchlachter: Это действительно может быть, но я не могу понять, как это сделать ... Большинство функций, которые я нашел с помощью поиска Google, возвращают gtk.gdk.pixbuf_get_from_surface, которого нет в моей системе (pygtk v2.24). У вас есть фрагмент кода, на который я мог бы взглянуть?   -  person Sardathrion - against SE abuse    schedule 25.02.2013
comment
Я не понимаю остальное в вашем первом фрагменте кода. Разве это не приводит к тому, что фон виджета не рисуется при первом создании растрового изображения?   -  person Ancurio    schedule 01.03.2013
comment
@Анкурио: Это правильно. Я хочу нарисовать его один раз, а затем использовать изображение, которое я создал. Я не хочу повторно генерировать указанные изображения каждый раз, когда я их перерисовываю.   -  person Sardathrion - against SE abuse    schedule 01.03.2013
comment
@Sardathrion Я не это имел в виду. Мне кажется, что ваш фон будет нарисован только на втором кадре.   -  person Ancurio    schedule 01.03.2013
comment
@Ancurio: А, я понимаю, что вы имеете в виду ... Вопрос отредактирован.   -  person Sardathrion - against SE abuse    schedule 01.03.2013


Ответы (1)


Как указал Ули, вы рисуете с контекстом, указывающим на ваш виджет в качестве цели, а не на ваш pixbuf. Чтобы создать новый контекст cairo для pixbuf, используйте cairo_create. Не забудьте уничтожить его, когда закончите рисовать.

person Ancurio    schedule 01.03.2013