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

显示一幅 PNG 图片

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

#!/usr/bin/python'''
ZetCode PyCairo tutorialThis 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 cairoclass 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 图片创建一个图片 surface。

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

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

        cr.paint()

我们将 source 绘制在窗口中。

显示一幅 JPEG 图片

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

#!/usr/bin/python'''
ZetCode PyCairo tutorialThis 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 cairoclass 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,我们还需要 Gdk 和 GdkPixbuf 模块。

        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 设为 source 以用于绘制。

水印

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

#!/usr/bin/python'''
ZetCode PyCairo tutorialThis 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 cairoclass 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 图片创建一个图片 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 2012 , (c) Jan Bodnar ")cr.stroke()

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

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

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

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

原文

Done.

PyCairo 中的图片相关推荐

  1. PyCairo 中的剪裁和屏蔽

    在 PyCairo 教程的这个部分,我们将讨论剪裁和屏蔽操作. 剪裁 裁剪 是将绘制限定在某一区域内.这样做有一些效率的因素,或者为了创建有趣的效果.PyCairo 有一个 clip() 方法用于设置 ...

  2. 如何在ASP.Net 中把图片存入数据库

    介绍 可能有很多的时候,我们急需把图片存入到数据库当中.在一些应用程序中,我们可能有一些敏感的资料,由于存储在文件系统(file system)中的东西,将很容易被某些用户盗取,所以这些数据不能存放在 ...

  3. 在DataGrid中显示图片

    兼谈 DadaGrid 模板列的创建 DadaGrid 是 ASP.NET 编程中一个很重要的控件,其优良的可定制功能为提高它的表现力提供了极大的方便.除了与数据源直接绑定以外,我们还可以通过列绑定模 ...

  4. matlab读取一个文件的图片大小,Matlab读取文件夹中子文件夹中的图片并修改尺寸...

    今天被师兄问到如何利用matlab批处理图片,觉得很简单嘛 就让他去百度 结果只百度到处理文件夹中图片的程序 好吧 这里放上如何处理文件夹中子文件夹的图片 现状:在一个名为casia的文件夹中,里面有 ...

  5. java 移动页面中的图片上传_移动端图片操作——上传

    上传我们一般都是用"input[type=file]"控件.当你用此控件时,你就授权了网页和服务器访问对应的文件,就可以得到File对象. 友情提示在,在Android手机webv ...

  6. UIWebView保存网页中的图片(转载)

    现在H5混合原生开发的方式越来越流行,也就要用到UIWebView控件.在开发过程中,我们可能会遇到一个需求,要求我们保存网页上的图片,当用户点击图片的时候,就可以让用户选择是否下载图片. 在系统自带 ...

  7. 将ImageVIew中的图片保存到本地相册中

    2019独角兽企业重金招聘Python工程师标准>>> 一:将ImageView中的图片转换成Bitmap 二:将Bitmap 转换成二进制,写入本地 三:用广播通知相册进行更新相册 ...

  8. R语言ggplot2可视化在可视化的接种中插入图片、添加图片实战

    R语言ggplot2可视化在可视化的接种中插入图片.添加图片实战 目录 R语言ggplot2可视化在可视化的接种中插入图片.添加图片实战

  9. word 数组 转 指针_Word之VBA丨文档中的图片怎样批量加边框?

    不称深度指南,只愿浅度指北 很多时候,我们在 Word 中添加的图片,大部分都是类似下面这样"白底黑图"的: 如果图片内容是一段文字,就更加大了我们对文章的理解难度. 这时,我会给 ...

最新文章

  1. 4.9---4.16总结
  2. LINQ to SQL语句(4)之Join
  3. linux 文件删除恢复
  4. Excel基础操作(二)
  5. 用 div 仿写 input 和 textarea 功能
  6. php基础教程 第九步 自定义函数
  7. bean交个spring和new比较区别
  8. 第三十六期:人工智能统计调查:86%的消费者更喜欢人工客服
  9. shell下数字和字符串比较操作命令
  10. leetcode题解279-完全平方数
  11. Python使用reduce()函数计算多个集合的并集与交集
  12. 《统计学习方法》——决策树
  13. Mac Brew Uninstall MySql
  14. android 蓝牙 录音,Android 实现蓝牙录音
  15. 华光职业学院计算机专业,关于给予张庆俊等同学省高校计算机一级 考试成绩优秀奖励的通知...
  16. 计算机usb接口不工作原理,电脑usb接口不能用,详细教您电脑usb接口不能用怎么办...
  17. read/write函数
  18. 黑龙江软件第三方检测机构/软件登记(退税)测试报告
  19. Java-dao模式
  20. EXCEL2003版无法运行2007以上版本VBA程序

热门文章

  1. 三层架构介绍和MVC设计模型介绍
  2. SpringBoot异常处理-@ExceptionHandler
  3. 设置eclipse新建maven项目默认使用jdk1.8
  4. 方法的重写-扩展父类方法,super对象调用父类方法
  5. 为元素绑定多个相同事件 绑定事件的另一种方式 复习 介绍 元素的事件绑定
  6. 数字转换英语c语言程序,c语言 把英文数字 例如 one hundred and eleven 转换位数字 111;怎样编写程序,要求1~1000内的英文数字...
  7. cJSON_译(C中的超轻量级JSON解析器)
  8. 探析“Java序列化”之serialVersionUID
  9. saltstack配置apache
  10. hadoop之 YARN配置参数剖析—RM与NM相关参数