PyCairo指南的這個部分,咱們將討論圖片。咱們將演示如何在GTK窗口中顯示一幅PNG或JPEG圖片。咱們也將在圖片上畫一些文字。 python
第一個例子中,咱們將顯示一幅PNG圖片。 web
#!/usr/bin/python ''' ZetCode PyCairo tutorial This program shows how to draw an image on a GTK window in PyCairo. author: Jan Bodnar website: zetcode.com last edited: August 2012 ''' import gtk import cairo class MainWindow(gtk.Window): def __init__(self): super(self.__class__, self).__init__() self.init_ui() self.load_image() def init_ui(self): self.darea = gtk.DrawingArea() self.darea.connect("expose_event", self.expose) self.add(self.darea) self.set_title("Image") self.resize(300, 170) self.set_position(gtk.WIN_POS_CENTER) self.connect("delete-event", gtk.main_quit) self.show_all() def load_image(self): self.ims = cairo.ImageSurface.create_from_png("stmichaelschurch.png") def expose(self, widget, event): self.context = widget.window.cairo_create() self.on_draw(300, self.context) def on_draw(self, wdith, cr): cr.set_source_surface(self.ims, 10, 10) cr.paint() def main(): window = MainWindow() gtk.main() if __name__ == "__main__": main()
這個例子顯示一幅圖片。 ui
self.ims = cairo.ImageSurface.create_from_png("stmichaelschurch.png")
咱們由一幅PNG圖片建立一個圖片surface。 spa
cr.set_source_surface(self.ims, 10, 10)
咱們將前面建立的圖像surface設爲source用於繪製。 code
cr.paint()
咱們將source畫在窗口中。 對象
Figure: Showing an image
圖片
PyCairo只內建了對於PNG圖片的支持。其餘的圖片能夠經過gtk.gdk.Pixbuf對象來顯示。它是一個用於管理圖像的GTK對象。 get
#!/usr/bin/python ''' ZetCode PyCairo tutorial This program shows how to draw an image on a GTK window in PyCairo. author: Jan Bodnar website: zetcode.com last edited: August 2012 ''' import gtk, gtk.gdk import cairo class MainWindow(gtk.Window): def __init__(self): super(self.__class__, self).__init__() self.init_ui() self.load_image() def init_ui(self): self.darea = gtk.DrawingArea() self.darea.connect("expose_event", self.expose) self.add(self.darea) self.set_title("Image") self.resize(300, 170) self.set_position(gtk.WIN_POS_CENTER) self.connect("delete-event", gtk.main_quit) self.show_all() def load_image(self): self.pb = gtk.gdk.pixbuf_new_from_file("stmichaelschurch.jpg") def expose(self, widget, event): self.context = widget.window.cairo_create() self.on_draw(300, self.context) def on_draw(self, wdith, cr): gtk.gdk.CairoContext.set_source_pixbuf(cr, self.pb, 5, 5) cr.paint() def main(): window = MainWindow() gtk.main() if __name__ == "__main__": main()
這個例子中,咱們在窗口中顯示了一幅JPEG圖片。 it
import gtk, gtk.gdk
除了gtk,咱們還須要gtk.gdk模塊。 io
self.pb = gtk.gdk.pixbuf_new_from_file("stmichaelschurch.jpg")
咱們由一個JPEG圖片文件建立一個gtk.gdk.Pixbuf。
gtk.gdk.CairoContext.set_source_pixbuf(cr, self.pb, 5, 5) cr.paint()
gtk.gdk.CairoContext.set_source_pixbuf()方法將pixbuf設爲一個source以用於繪製。
Figure: Showing a JPEG image
在圖片上繪製信息很常見。畫到圖片上的文字稱爲水印。水印用於標識圖片。它們多是版權信息或者圖片的建立時間。
#!/usr/bin/python ''' ZetCode PyCairo tutorial This program draws a watermark on an image. author: Jan Bodnar website: zetcode.com last edited: August 2012 ''' import gtk, gtk.gdk import cairo class MainWindow(gtk.Window): def __init__(self): super(self.__class__, self).__init__() self.init_ui() self.load_image() self.draw_mark() def init_ui(self): self.darea = gtk.DrawingArea() self.darea.connect("expose_event", self.expose) self.add(self.darea) self.set_title("Watermark") self.resize(350, 250) self.set_position(gtk.WIN_POS_CENTER) self.connect("delete-event", gtk.main_quit) self.show_all() def load_image(self): self.ims = cairo.ImageSurface.create_from_png("beckov.png") def draw_mark(self): cr = cairo.Context(self.ims) cr.set_font_size(11) cr.set_source_rgb(0.9, 0.9, 0.9) cr.move_to(20, 30) cr.show_text(" Beckov 2013, (c) Jan Bodnar") cr.stroke() def expose(self, widget, event): self.context = widget.window.cairo_create() self.on_draw(300, self.context) def on_draw(self, wdith, cr): cr.set_source_surface(self.ims, 10, 10) cr.paint() def main(): window = MainWindow() gtk.main() if __name__ == "__main__": main()
咱們在一幅圖片上繪製版權信息。
def load_image(self): self.ims = cairo.ImageSurface.create_from_png("beckov.png")
在load_image()方法中,咱們有一幅PNG圖片建立一個圖片surface。
def draw_mark(self): cr = cairo.Context(self.ims) ...
在draw_mark()方法中,咱們將版權信息畫到圖片上。首先,咱們由圖像surface建立一個繪製上下文。
cr.set_font_size(11) cr.set_source_rgb(0.9, 0.9, 0.9) cr.move_to(20, 30) cr.show_text(" Beckov 2013, (c) Jan Bodnar") cr.stroke()
而後以白色畫一小段文字。
def on_draw(self, wdith, cr): cr.set_source_surface(self.ims, 10, 10) cr.paint()
最後,將圖片surface畫到窗口中。
Figure: Watermark
這一章,咱們討論了PyCairo中的圖片。