[翻译]PyCairo指南--图片

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中的图片。

转载于:https://my.oschina.net/wolfcs/blog/133370

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值