Python图像处理教程(Pillow)11 画图与添加文字
绘图简介
Pillow可以在图像上绘制基本形状和文字。例如,它可以通过在图像的关键部分画出轮廓,或在图像上添加标题或时间戳来为图像做注释。
绘图功能比较基本--你只能用颜色(不是图案或渐变)来填充或勾勒形状,而且不支持变换,如缩放或旋转形状。但对于自动注释和类似的功能来说,它们已经够用。
坐标系统
绘图的坐标系统与像素的坐标系统相同。
- 图像的左上方坐标(0,0)。
- X坐标随着你向右移动而增加。每个像素在坐标系中是一个单位。
- y坐标随着你在图像上的下移而增加。。
例如,从图像的左上角向右10个像素和向下20个像素的图像像素将有坐标(10,20)。
与大多数矢量绘图库不同,你不能以任何方式改变坐标系统。
绘制
绘制必须首先创建Draw对象,我们可以绘制各种形状。
绘制矩形
from PIL import Image, ImageDraw, ImageFont
# Rectangles
image = Image.open('boat-small.jpg')
draw = ImageDraw.Draw(image)
draw.rectangle((20, 100, 80, 250), 'red')
draw.rectangle((150, 100, 250, 200), outline=(0, 128, 0), width=6)
draw.rectangle((300, 50, 350, 200), fill='white', outline='black', width=10)
image.save('imagedraw-rectangles.jpg')
draw.rectangle((20, 100, 80, 250), 'red')
第一个参数是序列,给出了矩形四角的坐标,即(20,100)和(80,250)。
凡是Draw方法需要x、y值的列表,你都可以使用值的序列(x1, y1, x2, y2)或一个对的序列((x1, y1),(x2, y2))。
许多图形库用角以及宽度和高度来指定矩形。Pillow使用两个角。
第二个参数是矩形的填充颜色。 "red"被自动转换为一个RGB值。
draw.rectangle((150, 100, 250, 200), outline=(0, 128, 0), width=6)
draw.rectangle((300, 50, 350, 200), fill='white', outline='black', width=10)
我们画了一个未填充的矩形,其轮廓为(0, 128, 0),为深绿色,线宽为6像素。我们还画了一个用白色填充、用黑色勾勒的矩形,线宽为10像素。
绘制其他形状
除了绘制矩形之外,ImageDraw模块还可以绘制。
- 线条(和多条线)。
- 一般的多边形。
- 规则多边形。
- 椭圆(包括圆形)。
- 弧线、弦线和饼状线段。
from PIL import Image, ImageDraw, ImageFont
# Other shapes
image = Image.new('RGB', (600, 400), 'lightgrey')
draw = ImageDraw.Draw(image)
draw.line((50, 50, 100, 150), fill='red', width=6)
draw.line((50, 200, 75, 300, 100, 250, 75, 200), fill='blue', width=10, joint='curve')
draw.polygon((150, 50, 220, 150, 250, 50), fill='green')
draw.regular_polygon((200, 300, 75), n_sides=6, rotation=10, fill='orange')
draw.ellipse((300, 50, 450, 150), outline='black', width=4)
draw.arc((300, 200, 450, 350), start=90, end=200, fill='yellow', width=4)
draw.chord((400, 200, 550, 350), start=90, end=200, fill='cyan')
draw.pieslice((500, 200, 650, 350), start=90, end=200, fill='magenta')
image.save('imagedraw-shapes.png')
point
point方法可以用来将一个或多个像素设置为给定的颜色。比如说
draw.point((100, 200), fill='black')
draw.point((50, 70, 150, 140), fill='red')
第一个例子将把图像像素(100,200)设置为黑色。第二个例子将把像素(50, 70)和(150, 140)都设置为红色。
这方面的典型应用可能是通过将像素组设置为特定的颜色来绘制小形状。如果你想个圆形或方形等形状,通常最好使用矩形或椭圆的方法,但对于非标准形状,点的方法会很有用。
另一个应用可能是用计算好的颜色来填充图像的一部分,例如,梯度甚至是分形图像。请注意,多次调用point来设置大量的像素可能会很慢,所以你最好使用本书中其他地方描述的更有效的像素访问方法。
处理文本
Pillow通过ImaegFont模块(用于选择字体)和ImageDraw模块提供处理文本的功能。
在这一节中,我们将主要关注以拉丁文为基础的文字的创建和定位,正如许多欧洲语言所使用的那样。Pillow能够处理其他书写系统,包括那些从右到左和垂直方向的文字,但我们在这里不涉及这些。
12.3.1 绘制简单文本
绘制简单文本有两个阶段。
选择一种字体。
使用该字体绘制一个文本字符串。
字体是一种特殊的字体。它定义了字母、数字、标点符号和其他符号的形状,具有特定的风格。
下面是我们如何加载一种叫做Arial的字体。
font = ImageFont.truetype('alar.ttf', 100)
有许多不同的格式来存储字体。TrueType是一种流行的格式,大多数系统都有一套可用的TrueType字体(其中几乎肯定包括Arial字体,一种标准的基本字体)。