[翻譯]PyCairo指南--圖片

PyCairo中的圖片

PyCairo指南的這個部分,咱們將討論圖片。咱們將演示如何在GTK窗口中顯示一幅PNG或JPEG圖片。咱們也將在圖片上畫一些文字。 python

顯示一幅PNG圖片

第一個例子中,咱們將顯示一幅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
圖片

顯示一幅JPEG圖片

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

相關文章
相關標籤/搜索