返回介绍

17.4 在图像上绘画

发布于 2024-01-22 21:44:06 字数 5142 浏览 0 评论 0 收藏 0

如果需要在图像上画线、矩形、圆形或其他简单形状,就用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文