原文: https://zetcode.com/gfx/pycaiimg/

在 PyCairo 教程的这一部分中,我们将讨论图像。 我们将展示如何在 GTK 窗口上显示 PNG 和 JPEG 图像。 我们还将在图像上绘制一些文本。

显示 PNG 图像

在第一个示例中,我们将显示一个 PNG 图像。

  1. #!/usr/bin/python
  2. '''
  3. ZetCode PyCairo tutorial
  4. This program shows how to draw
  5. an image on a GTK window in PyCairo.
  6. author: Jan Bodnar
  7. website: zetcode.com
  8. last edited: August 2012
  9. '''
  10. from gi.repository import Gtk
  11. import cairo
  12. class Example(Gtk.Window):
  13. def __init__(self):
  14. super(Example, self).__init__()
  15. self.init_ui()
  16. self.load_image()
  17. def init_ui(self):
  18. darea = Gtk.DrawingArea()
  19. darea.connect("draw", self.on_draw)
  20. self.add(darea)
  21. self.set_title("Image")
  22. self.resize(300, 170)
  23. self.set_position(Gtk.WindowPosition.CENTER)
  24. self.connect("delete-event", Gtk.main_quit)
  25. self.show_all()
  26. def load_image(self):
  27. self.ims = cairo.ImageSurface.create_from_png("stmichaelschurch.png")
  28. def on_draw(self, wid, cr):
  29. cr.set_source_surface(self.ims, 10, 10)
  30. cr.paint()
  31. def main():
  32. app = Example()
  33. Gtk.main()
  34. if __name__ == "__main__":
  35. main()

该示例显示图像。

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

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

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

我们为先前创建的图像表面设置了绘画源。

  1. cr.paint()

我们在窗口上绘制源。

PyCairo 中的图像 - 图1

图:显示图像

显示 JPEG 图像

PyCairo 仅对 PNG 图像提供内置支持。 可以通过GdkPixbuf.Pixbuf对象显示其他图像。 它是用于处理图像的 GTK 对象。

  1. #!/usr/bin/python
  2. '''
  3. ZetCode PyCairo tutorial
  4. This program shows how to draw
  5. an image on a GTK window in PyCairo.
  6. author: Jan Bodnar
  7. website: zetcode.com
  8. last edited: August 2012
  9. '''
  10. from gi.repository import Gtk, Gdk, GdkPixbuf
  11. import cairo
  12. class Example(Gtk.Window):
  13. def __init__(self):
  14. super(Example, self).__init__()
  15. self.init_ui()
  16. self.load_image()
  17. def init_ui(self):
  18. darea = Gtk.DrawingArea()
  19. darea.connect("draw", self.on_draw)
  20. self.add(darea)
  21. self.set_title("Image")
  22. self.resize(300, 170)
  23. self.set_position(Gtk.WindowPosition.CENTER)
  24. self.connect("delete-event", Gtk.main_quit)
  25. self.show_all()
  26. def load_image(self):
  27. self.pb = GdkPixbuf.Pixbuf.new_from_file("stmichaelschurch.jpg")
  28. def on_draw(self, wid, cr):
  29. Gdk.cairo_set_source_pixbuf(cr, self.pb, 5, 5)
  30. cr.paint()
  31. def main():
  32. app = Example()
  33. Gtk.main()
  34. if __name__ == "__main__":
  35. main()

在此示例中,我们在窗口上显示 JPEG 图像。

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

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

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

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

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

Gdk.cairo_set_source_pixbuf()方法将pixbuf设置为绘画源。

水印

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

  1. #!/usr/bin/python
  2. '''
  3. ZetCode PyCairo tutorial
  4. This program draws a watermark
  5. on an image.
  6. author: Jan Bodnar
  7. website: zetcode.com
  8. last edited: August 2012
  9. '''
  10. from gi.repository import Gtk
  11. import cairo
  12. class Example(Gtk.Window):
  13. def __init__(self):
  14. super(Example, self).__init__()
  15. self.init_ui()
  16. self.load_image()
  17. self.draw_mark()
  18. def init_ui(self):
  19. darea = Gtk.DrawingArea()
  20. darea.connect("draw", self.on_draw)
  21. self.add(darea)
  22. self.set_title("Watermark")
  23. self.resize(350, 250)
  24. self.set_position(Gtk.WindowPosition.CENTER)
  25. self.connect("delete-event", Gtk.main_quit)
  26. self.show_all()
  27. def load_image(self):
  28. self.ims = cairo.ImageSurface.create_from_png("beckov.png")
  29. def draw_mark(self):
  30. cr = cairo.Context(self.ims)
  31. cr.set_font_size(11)
  32. cr.set_source_rgb(0.9 , 0.9 , 0.9)
  33. cr.move_to(20 , 30)
  34. cr.show_text(" Beckov 2012 , (c) Jan Bodnar ")
  35. cr.stroke()
  36. def on_draw(self, wid, cr):
  37. cr.set_source_surface(self.ims, 10, 10)
  38. cr.paint()
  39. def main():
  40. app = Example()
  41. Gtk.main()
  42. if __name__ == "__main__":
  43. main()

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

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

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

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

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

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

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

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

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

PyCairo 中的图像 - 图2

图:水印

本章介绍了 PyCairo 中的图像。