PyCairo 中的图片

PyCairo 教程的这个部分,我们将讨论图片。我们将演示如何在 GTK 窗口中显示一幅 PNG 或JPEG 图片。我们也将在图片上绘制一些文字。

显示一幅 PNG 图片

在第一个例子中,我们将显示一幅 PNG 图片。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/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 gi
gi.require_version('Gtk', '3.0')
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()

这个例子显示一幅图片。

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

我们由一幅 PNG 图片创建一个图片 surface。

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

我们将前面创建的图像 surface 设为 source 用于绘制。

1
cr.paint()

我们将 source 绘制在窗口中。

图:展示一幅图片

显示一幅 JPEG 图片

PyCairo 只内建了对 PNG 图片的支持。其它的图片可以通过 gtk.gdk.Pixbuf 对象来显示。它是一个用于管理图像的 GTK 对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/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 gi
gi.require_version('Gtk', '3.0')
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 图片。

1
from gi.repository import Gtk, Gdk, GdkPixbuf

除了Gtk,我们还需要 Gdk 和 GdkPixbuf 模块。

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

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

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

Gdk.cairo_set_source_pixbuf() 方法将 pixbuf 设为 source 以用于绘制。

图:展示一幅图片

水印

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/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 gi
gi.require_version('Gtk', '3.0')
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()

我们在一幅图片上绘制版权信息。

1
2
def load_image(self):
self.ims = cairo.ImageSurface.create_from_png("beckov.png")

load_image() 方法中,我们由一幅 PNG 图片创建一个图片 surface。

1
2
3
def draw_mark(self):
cr = cairo.Context(self.ims)
. . .

draw_mark() 方法中,我们将版权信息绘制到图片上。首先,我们由图像surface 创建一个绘制上下文。

1
2
3
4
5
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()

然后以白色绘制一段小文字。

1
2
3
def on_draw(self, wid, cr):
cr.set_source_surface(self.ims, 10, 10)
cr.paint()

最后,将图片 surface 绘制到窗口中。

图:水印

这一章,我们讨论了 PyCairo 中的图片。

原文

Done.

坚持原创技术分享,您的支持将鼓励我继续创作!