- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
17.4 在图像上绘画
如果需要在图像上画线、矩形、圆形或其他简单形状,就用Pillow的ImageDraw模块。在交互式环境中输入以下代码:
>>> from PIL import Image, ImageDraw >>> im = Image.new('RGBA', (200, 200), 'white') >>> draw = ImageDraw.Draw(im)
首先,我们导入Image和ImageDraw。然后,创建一个新的图像,在这个例子中,是200×200的白色图像,将这个Image对象保存在Im中。我们将该Image对象传入ImageDraw.Draw()函数,得到一个ImageDraw对象。这个对象有一些方法,可以在Image对象上绘制形状和文字。将ImageDraw对象保存在变量draw中,这样就能在接下来的例子中方便地使用它。
17.4.1 绘制形状
下面的ImageDraw方法在图像上绘制各种形状。这些方法的fill和outline参数是可选的,如果未指定,默认为白色。
点
point(xy, fill)方法绘制单个像素。xy参数表示要画的点的列表。该列表可以是x和y坐标的元组的列表,例如[(x, y), (x, y), ...],或是没有元组的x和y坐标的列表,例如[x1, y1, x2, y2, ...]。fill参数是点的颜色,要么是一个RGBA元组,要么是颜色名称的字符串,如'red'。fill参数是可选的。
线
line(xy, fill, width)方法绘制一条线或一系列的线。xy要么是一个元组的列表,例如[(x, y), (x, y), ...],要么是一个整数列表,例如[x1, y1, x2, y2, ...]。每个点都是正在绘制的线上的一个连接点。可选的fill参数是线的颜色,是一个RGBA元组或颜色名称。可选的width参数是线的宽度,如果未指定,缺省值为1。
矩形
rectangle(xy, fill, outline)方法绘制一个矩形。xy参数是一个矩形元组,形式为(left, top, right, bottom)。left和top值指定了矩形左上角的x和y坐标,right和bottom指定了矩形的右下角。可选的fill参数是颜色,将填充该矩形的内部。可选的outline参数是矩形轮廓的颜色。
椭圆
ellipse(xy, fill, outline)方法绘制一个椭圆。如果椭圆的宽度和高度一样,该方法将绘制一个圆。xy参数是一个矩形元组(left, top, right, bottom),它表示正好包含该椭圆的矩形。可选的fill参数是椭圆内的颜色,可选的outline参数是椭圆轮廓的颜色。
多边形
polygon(xy, fill, outline)方法绘制任意的多边形。xy参数是一个元组列表,例如[(x, y), (x, y), ...],或者是一个整数列表,例如[x1, y1, x2, y2, ...],表示多边形边的连接点。最后一对坐标将自动连接到第一对坐标。可选的fill参数是多边形内部的颜色,可选的outline参数是多边形轮廓的颜色。
绘制示例
在交互式环境中输入以下代码:
>>> from PIL import Image, ImageDraw >>> im = Image.new('RGBA', (200, 200), 'white') >>> draw = ImageDraw.Draw(im) ❶ >>> draw.line([(0, 0), (199, 0), (199, 199), (0, 199), (0, 0)], fill='black') ❷ >>> draw.rectangle((20, 30, 60, 60), fill='blue') ❸ >>> draw.ellipse((120, 30, 160, 60), fill='red') ❹ >>> draw.polygon(((57, 87), (79, 62), (94, 85), (120, 90), (103, 113)), fill='brown') ❺ >>> for i in range(100, 200, 10): draw.line([(i, 0), (200, i - 100)], fill='green') >>> im.save('drawing.png')
为200×200的白色图像生成Image对象后,将它传入ImageDraw.Draw(),获得ImageDraw对象,将它保存在draw中,可以对draw调用绘图方法。这里,我们在图像边缘画上窄的黑色轮廓❶;一个蓝色的矩形,左上角在(20, 30),右下角在(60, 60)❷;一个红色的椭圆,由(120, 30)到(160, 60)的矩形来定义❸;一个棕色的多边形,有五个顶点❹,以及一些绿线的图案,用for循环绘制❺。得到的drawing.png文件如图17-14所示。
图17-14 得到的图像drawing.png
ImageDraw对象还有另外几个绘制形状的方法。完整的文档在http://pillow. readthedocs.org/en/latest/reference/ImageDraw.html。
17.4.2 绘制文本
ImageDraw对象还有text()方法,用于在图像上绘制文本。text()方法有4个参数:xy、text、fill和font。
· xy参数是两个整数的元组,指定文本区域的左上角。
· text参数是想写入的文本字符串。
· 可选参数fill是文本的颜色。
· 可选参数font是一个ImageFont对象,用于设置文本的字体和大小。下一节中更详细地介绍了这个参数。
因为通常很难预先知道一块文本在给定的字体下的大小,所以ImageDraw模块也提供了textsize()方法。它的第一个参数是要测量的文本字符串,第二个参数是可选的ImageFont对象。textsize()方法返回一个两整数元组,表示如果以指定的字体写入图像,文本的宽度和高度。可以利用这个宽度和高度,帮助你精确计算文本放在图像上的位置。
text()的前三个参数非常简单。在用text()向图像绘制文本之前,让我们来看看可选的第四个参数,即ImageFont对象。
text()和textsize()都接受可选的ImageFont对象,作为最后一个参数。要创建这种对象,先执行以下命令:
>>> from PIL import ImageFont
既然已经导入Pillow的ImageFont模块,就可以调用ImageFont.truetype()函数,它有两个参数。第一个参数是字符串,表示字体的TrueType文件,这是硬盘上实际的字体文件。TrueType字体文件具有.TTF文件扩展名,通常可以在以下文件夹中找到:
· 在Windows上:C:\Windows\Fonts。
· 在OS X上:/Library/Fonts and /System/Library/Fonts。
· 在Linux上:/usr/share/fonts/truetype。
实际上并不需要输入这些路径作为TrueType字体文件的字符串的一部分,因为Python知道自动在这些目录中搜索字体。如果无法找到指定的字体,Python会显示错误。
ImageFont.truetype()的第二个参数是一个整数,表示字体大小的点数(而不是像素)。请记住,Pillow创建的PNG图像默认是每英寸72像素,一点是1/72英寸。
在交互式环境中输入以下代码,用你的操作系统中实际的文件夹名称替换FONT_FOLDER:
>>> from PIL import Image, ImageDraw, ImageFont >>> import os ❶ >>> im = Image.new('RGBA', (200, 200), 'white') ❷ >>> draw = ImageDraw.Draw(im) ❸ >>> draw.text((20, 150), 'Hello', fill='purple') >>> fontsFolder = 'FONT_FOLDER' # e.g. ‘/Library/Fonts’ ❹ >>> arialFont = ImageFont.truetype(os.path.join(fontsFolder, 'arial.ttf'), 32) ❺ >>> draw.text((100, 150), 'Howdy', fill='gray', font=arialFont) >>> im.save('text.png')
导入Image、ImageDraw、ImageFont和os后,我们生成一个Image对象,是新的200×200白色图像❶,并通过这个Image对象得到一个ImageDraw对象❷。我们使用text()在(20, 150)以紫色绘制Hello❸。在这次text()调用中,我们没有传入可选的第四个参数,所以这段文本的字体和大小没有定制。
要设置字体和大小,我们首先将文件夹名称(如/Library/Fonts)保存在fontsFolder中。然后调用ImageFont.truetype(),传入我们想要的字体的.TTF文件,之后是表示字体大小的整数❹。将ImageFont.truetype()返回的Font对象保存在arialFont这样的变量中,然后将该变量传入text(),作为最后的关键字参数。❺行的text()调用绘制了Howdy,采用灰色、32点Arial字体。
得到的text.png文件如图17-15所示。
图17-15 得到的图像text.png
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论