ZetCode

PyCairo 中的图像

最后修改于 2023 年 7 月 17 日

在 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
'''

from gi.repository import Gtk
import cairo


class Example(Gtk.Window):

    def __init__(self):
        super(Example, self).__init__()

        self.init_ui()
        self.load_image()


    def init_ui(self):

        darea = Gtk.DrawingArea()
        darea.connect("draw", self.on_draw)
        self.add(darea)

        self.set_title("Image")
        self.resize(300, 170)
        self.set_position(Gtk.WindowPosition.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 on_draw(self, wid, cr):

        cr.set_source_surface(self.ims, 10, 10)
        cr.paint()


def main():

    app = Example()
    Gtk.main()


if __name__ == "__main__":
    main()

该示例显示了一个图像。

self.ims = cairo.ImageSurface.create_from_png("stmichaelschurch.png")

我们从 PNG 图像创建一个图像表面。

cr.set_source_surface(self.ims, 10, 10)

我们设置一个源,用于从先前创建的图像表面进行绘制。

cr.paint()

我们将源绘制到窗口上。

Showing an image
图:显示图像

显示 JPEG 图像

PyCairo 仅内置支持 PNG 图像。其他图像可以通过 GdkPixbuf.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
'''


from gi.repository import Gtk, Gdk, GdkPixbuf
import cairo


class Example(Gtk.Window):

    def __init__(self):
        super(Example, self).__init__()

        self.init_ui()
        self.load_image()


    def init_ui(self):

        darea = Gtk.DrawingArea()
        darea.connect("draw", self.on_draw)
        self.add(darea)

        self.set_title("Image")
        self.resize(300, 170)
        self.set_position(Gtk.WindowPosition.CENTER)
        self.connect("delete-event", Gtk.main_quit)
        self.show_all()


    def load_image(self):

        self.pb = GdkPixbuf.Pixbuf.new_from_file("stmichaelschurch.jpg")


    def on_draw(self, wid, cr):

        Gdk.cairo_set_source_pixbuf(cr, self.pb, 5, 5)
        cr.paint()


def main():

    app = Example()
    Gtk.main()


if __name__ == "__main__":
    main()

在这个例子中,我们在窗口上显示了一个 JPEG 图像。

from gi.repository import Gtk, Gdk, GdkPixbuf

除了 Gtk,我们还需要 GdkGdkPixbuf 模块。

self.pb = GdkPixbuf.Pixbuf.new_from_file("stmichaelschurch.jpg")

我们从 JPEG 文件创建一个 GdkPixbuf.Pixbuf

Gdk.cairo_set_source_pixbuf(cr, self.pb, 5, 5)
cr.paint()

Gdk.cairo_set_source_pixbuf 方法将 pixbuf 设置为绘制源。

水印

在图像上绘制信息是很常见的。写在图像上的文本称为水印。水印用于标识图像。它们可能是版权声明或图像创建时间。

#!/usr/bin/python

'''
ZetCode PyCairo tutorial

This program draws a watermark
on an image.

author: Jan Bodnar
website: zetcode.com
'''

from gi.repository import Gtk
import cairo


class Example(Gtk.Window):

    def __init__(self):
        super(Example, self).__init__()

        self.init_ui()
        self.load_image()
        self.draw_mark()


    def init_ui(self):

        darea = Gtk.DrawingArea()
        darea.connect("draw", self.on_draw)
        self.add(darea)

        self.set_title("Watermark")
        self.resize(350, 250)
        self.set_position(Gtk.WindowPosition.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 2012 , (c) Jan Bodnar ")
        cr.stroke()


    def on_draw(self, wid, cr):

        cr.set_source_surface(self.ims, 10, 10)
        cr.paint()


def main():

    app = Example()
    Gtk.main()


if __name__ == "__main__":
    main()

我们在图像上绘制版权信息。

def load_image(self):

    self.ims = cairo.ImageSurface.create_from_png("beckov.png")

load_image 方法中,我们从 PNG 图像创建一个图像表面。

def draw_mark(self):

    cr = cairo.Context(self.ims)
...

draw_mark 方法中,我们在图像上绘制版权消息。首先,我们从图像表面创建一个绘图上下文。

cr.set_font_size(11)
cr.set_source_rgb(0.9 , 0.9 , 0.9)
cr.move_to(20 , 30)
cr.show_text(" Beckov 2012 , (c) Jan Bodnar ")
cr.stroke()

然后,我们用白色绘制一个小文本。

def on_draw(self, wid, cr):

    cr.set_source_surface(self.ims, 10, 10)
    cr.paint()

最后,将图像表面绘制到窗口上。

Watermark
图:水印

本章介绍了 PyCairo 中的图像。