PyCairo中的图片
PyCairo指南的这个部分,我们将讨论图片。我们将演示如何在GTK窗口中显示一幅PNG或JPEG图片。我们也将在图片上画一些文字。
显示一幅PNG图片
第一个例子中,我们将显示一幅PNG图片。
#!/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()
这个例子显示一幅图片。
self.ims = cairo.ImageSurface.create_from_png("stmichaelschurch.png")
我们由一幅PNG图片创建一个图片surface。
cr.set_source_surface(self.ims, 10, 10)
我们将前面创建的图像surface设为source用于绘制。
cr.paint()
我们将source画在窗口中。
Figure: Showing an image
显示一幅JPEG图片
PyCairo只内建了对于PNG图片的支持。其他的图片可以通过gtk.gdk.Pixbuf对象来显示。它是一个用于管理图像的GTK对象。
#!/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图片。
import gtk, gtk.gdk
除了gtk,我们还需要gtk.gdk模块。
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中的图片。
来源:oschina
链接:https://my.oschina.net/u/919237/blog/133370