Python Pillow – ImageDraw模块
Python的Pillow是已停用的Python Imaging Library(PIL)的分叉,是一个强大的库,能够为你的Python代码增加图像处理能力。Pillow提供了许多模块,以减轻工作和修改图像的过程。
在这篇文章中,我们将看一下这个库的ImageDraw模块。ImageDraw提供了各种方法,正如它的名字所暗示的,在图像上绘图。在这个模块的帮助下,我们可以在图像上画线、画圆、画矩形,甚至可以在图像上书写和格式化文本。
在图像上绘制常见的形状
我们将使用的图像可以用PIL显示,如下所示。
# Importing Image and ImageDraw from PIL
from PIL import Image, ImageDraw
# Opening the image to
# be used and displaying it
img = Image.open('img_path.png')
img.show()
输出
输出的图像如下
我们可以使用 “画图 “方法在图像上绘制形状和数字,首先创建一个 “画图 “对象。
在图像上画一个矩形
对于绘制矩形,我们使用ImageDraw模块的矩形绘制方法。
语法: ImageDraw.rectangle(xy, fill, outline, width)
这个方法的参数是:
- xy : 对应于包围你的形状的左上角和右下角坐标的点集的元组。这些点是以一个元组的形式传递的,如下所示。(左上角X坐标,左上角Y坐标,右下角X坐标,右下角Y坐标)
- fill : 对应于用于填充形状的RGB颜色值的元组。
- outline : 对应于为形状的边界分配的RGB颜色值的元组。
- width : 对应于形状边界厚度的整数值。注意:这些参数在各种形状绘制方法中是相似的。
# Importing Image and ImageDraw from PIL
from PIL import Image, ImageDraw
# Opening the image to be used
img = Image.open('img_path.png')
# Creating a Draw object
draw = ImageDraw.Draw(img)
# Drawing a green rectangle
# in the middle of the image
draw.rectangle(xy = (50, 50, 150, 150),
fill = (0, 127, 0),
outline = (255, 255, 255),
width = 5)
# Method to display the modified image
img.show()
输出:
矩形方法的输出图像
在图像上画一个椭圆(圆形)
为了绘制一个椭圆形状,我们使用ImageDraw方法中的椭圆方法。
语法: ImageDraw.ellipse(xy, fill, outline, width)
你将提供的xy坐标将作为一个盒子,圆将被围在其中。
# Importing Image and ImageDraw from PIL
from PIL import Image, ImageDraw
# Opening the image to be used
img = Image.open('img_path.png')
# Creating a Draw object
draw = ImageDraw.Draw(img)
# Drawing a green circle on the image
draw.circle(xy = (50, 50, 150, 150),
fill = (0, 127, 0),
outline = (255, 255, 255),
width = 5)
# Method to display the modified image
img.show()
输出:
椭圆法的输出图像
在图像上画一条线
为了画一条线,我们使用ImageDraw方法中的线方法。
语法: lImageDraw.ine(xy, fill, width)
在这里,不考虑轮廓参数,宽度将决定线条应该有多长。
# Importing Image and ImageDraw from PIL
from PIL import Image, ImageDraw
# Opening the image to be used
img = Image.open('img_path.png')
# Creating a Draw object
draw = ImageDraw.Draw(img)
# Drawing a green vertical
# line in the middle image
draw.line(xy=(50, 150, 150, 50),
fill=(0, 128, 0), width = 5)
# Method to display the modified image
img.show()
输出:
线条法的输出图像
在图像上画一个多边形
我们可以通过使用ImageDraw方法中的polygon方法来绘制一个所需形状的多边形。
语法: ImageDraw.polygon(xy, fill, outline)
xy元组参数将包含基于你想要的形状的边数的坐标。这里,宽度参数是无效的。
# Importing Image and ImageDraw from PIL
from PIL import Image, ImageDraw
# Opening the image to be used
img = Image.open('img_path.png')
# Creating a Draw object
draw = ImageDraw.Draw(img)
# Drawing a green diamond-shaped
# polygon in the middle of the image
draw.polygon(xy=(50, 150, 150, 50),
fill=(0, 128, 0),
outline=(255, 255, 255))
# Method to display the modified image
img.show()
输出:
多边形方法的输出图像
类似地,我们可以用这些方法画一些其他的形状:
- Arc: ImageDraw.arc(xy, start, end, fill, width)
- 弦(弓形)。ImageDraw.chord(xy, start, end, fill, outline, width)
- Point: ImageDraw.point(xy, fill)
- Pieslice: ImageDraw.pieslice(xy, start, end, fill, outline, width)
起点和终点参数对应于顺时针方向的角度程度,将用一条线连接。
在图像上书写文字
使用我们的Draw对象,我们也可以在图像上写文字。它可以用Text方法来完成。
语法: ImageDraw.text(xy, text, fill, font, anchor, spacing, align, direction, features, language, stroke_width, stroke_fill, embedded_color)
我们还将使用PIL的ImageFont来为我们的文本使用所需的字体。
# Importing Image, ImageDraw and ImageFont
# from PIL
from PIL import Image, ImageDraw, ImageFont
# Opening the image to be used
img = Image.open('img_path.png')
# Creating an instance for
# the font to be used using ImageFont
# Here we pass the font name and
# the font size as arguments
fnt = ImageFont.truetype("Pillow/Tests/fonts/FreeMono.ttf", 20)
# Creating a Draw object
draw = ImageDraw.Draw(img)
# Drawing the text on the image
draw.text(xy=(25, 160),
text="Hello, Geeks!",
font=fnt,
fill=(0, 127, 0))
img.show()
输出:
文本方法的输出图像