ImageDraw 模块
该模块提供了许多绘制 2D 图像的功能,我们可以通过绘制获取一个全新的图像,也可以在原有的图像上进行绘制。您可以绘制直线,点,椭圆,矩形,弧,二元图,和弦,扇形,多边形,形状和文本。在使用该模块进行绘制时,需要先获取 ImageDraw.Draw
对象,获取方式如下:
from PIL import ImageDraw
# 构造函数中,im为一个Image对象
drawer = ImageDraw.Draw(im)
我们获取 ImageDraw.Draw
对象后就可以进行相应的绘制了。
绘制简单形状
在绘制之前,我们先创建一个空白的图片:
from PIL import Image, ImageDraw
# 创建一个300*300的白色图片
im = Image.new("RGB", (300, 300), "white")
# 获取ImageDraw.Draw对象
drawer = ImageDraw.Draw(im)
后续的绘制都可以使用对象 drawer
绘制。
绘制直线
调用:line(xy, fill=None, width=0, joint=None)
:
-
xy
:起点坐标和终点坐标(x1, y1, x2, y2) -
fill
:填充色。"red"、"blue"... -
width
:轮廓粗细 -
joint
:连接方式,可以是曲线
# 绘制直线
drawer.line((50, 50, 150, 150), fill='green',width=2)
绘制矩形
调用:rectangle(xy, fill=None, outline=None, width=0)
:
参数同 line
。
# 使用示例
drawer.rectangle((50, 50, 150, 150), fill='green', outline='red', width=3)
绘制圆弧
调用:arc(xy, start, end, fill=None, width=0)
-
xy
:包含圆弧所在圆的矩形的左上角坐标和右下角坐标(x1, y1, x2, y2),即外接矩形 -
start
:起始角度 -
end
:终止角度 -
fill
和width
同line
# 使用示例
drawer.arc((50, 50, 150, 150), start=0, end=90, fill='green', width=3)
绘制椭圆
调用: ellipse(xy, fill=None, outline=None, width=0)
-
xy
:包含椭圆(或圆)的矩形的左上角坐标和右下角坐标(x1, y1, x2, y2) -
outline
:轮廓颜色 -
fill
和width
同line
# 使用示例
drawer.ellipse((50, 50, 150, 150),fill='green', outline='red', width=3)
绘制弦
调用:chord(xy, start, end, fill=None, outline=None, width=0)
-
xy
:弦所在椭圆的矩形的左上角坐标和右下角坐标(x1, y1, x2, y2) -
start
、end
、fill
、width
同arc
-
outline
:轮廓颜色
# 使用示例
drawer.chord((50, 50, 150, 150),start=0, end=90, fill='green', outline='red', width=3)
绘制扇形
调用:pieslice(xy, start, end, fill=None, outline=None, width=0)
参数同 chord
。
# 使用示例
drawer.pieslice((50, 50, 150, 150),start=0, end=90, fill='green', outline='red', width=3)
绘制多边形
调用:polygon(xy, fill=None, outline=None)
参数同 rectangle
# 使用示例
drawer.polygon((50, 50, 150, 150, 150, 200, 200, 250, 50, 50), fill='green', outline='red')
绘制点
调用:point(xy, fill=None)
# 使用示例
drawer.point((100, 100), fill='black')
除了上面这些简单图形外,我们还可以使用 Draw
绘制文字。
绘制文字
绘制文字和绘制图形是一样的。
调用:
text(
xy,
text,
fill=None,
font=None,
anchor=None,
spacing=4,
align='left',
direction=None,
features=None,
language=None,
stroke_width=0,
stroke_fill=None,
*args,
**kwargs,
)
-
xy
:指定文字区域的左上角在图片上的位置(x,y)
-
text
:文字内容 -
fill
:文本填充的颜色 -
font
:字体 -
stroke_width
:文本笔划的宽度 -
stroke_fill
:用于文本笔划的颜色
# 使用示例
drawer.text((100, 100), text='zack' fill='red')
当我们绘制中文时,上述代码会报错,因为默认编码是不支持中文的。我们可以在 C:/Windows/Fonts
目录下找到字体文件,我们选择一个支持中文的。代码如下:
from PIL import Image, ImageDraw, ImageFont
# 创建一个图像用于绘制文字
im = Image.new("RGB", (300, 300), "white")
drawer = ImageDraw.Draw(im)
# 获取字体对象
# ttf = ImageFont.load_default() # 默认字体
imFont = ImageFont.truetype('simkai.ttf', 30) # 'Dengl.ttf' 也是中文字体
# 绘制文字时设置字体
drawer.text((50, 100),text="啥",font=imFont,fill="red")
im.show()
我们使用了 ImageFont.truetype()
函数获取字体对象,在获取时我们可以设置字体大小。
不过,在 Window10 上测试可以直接使用中文字体,不过,中文字体的名称一般是 .ttc
格式的文件,比如“宋体”,可以这样:
from PIL import Image, ImageDraw, ImageFont
# 创建一个图像用于绘制文字
im = Image.new("RGB", (1920, 1080), "white")
drawer = ImageDraw.Draw(im)
# 获取字体对象
imFont = ImageFont.truetype('simsun.ttc', 700)
# 绘制文字时设置字体
drawer.text((600, 200),text="80",font=imFont,fill="red")
将文字区域框选出来
使用 ttf.getsize
得到文本区域,使用 img_draw.polygon
绘制矩形框。
from PIL import Image, ImageDraw, ImageFont
chars = "你好啊!"
ttf_path = 'simsun.ttc' # 宋体
chars_x, chars_y = 50, 80
image = Image.new("RGB", (1920, 1080), "white")
ttf = ImageFont.truetype(ttf_path, 50)
# 得到整个字串的宽度和高度
chars_w, chars_h = ttf.getsize(chars)
img_draw = ImageDraw.Draw(image)
coords = (chars_x, chars_y, chars_x+chars_w, chars_y+chars_h)
img_draw.rectangle(coords, outline='blue')
img_draw.text((chars_x, chars_y), chars, font=ttf, fill='red')
# image.show()
# image.save("2.jpg")
效果图:
改变文本笔画的大小
from PIL import Image, ImageDraw, ImageFont
# 创建一个图像用于绘制文字
im = Image.new("RGBA", (600, 300), (0, 0, 0, 100))
drawer = ImageDraw.Draw(im)
# 获取字体对象
# ttf = ImageFont.load_default() # 默认字体
imFont = ImageFont.truetype('simkai.ttf', 100) # 'Dengl.ttf' 也是中文字体
# 绘制文字时设置字体
drawer.text((50, 100),text="t",font=imFont,fill="red", stroke_width=5, stroke_fill='yellow')
im
效果: