pin_drop当前位置:知识文库 ❯ 图文
Pillow ImageDraw绘图教程 - 绘制形状文字与图像标注详解
一、ImageDraw绘图概述
ImageDraw模块提供了在Image对象上绘制二维图形的功能,包括直线、矩形、椭圆、多边形、圆弧、文字等。通过创建ImageDraw.Draw对象,可以在图像上进行各种绘图操作。
ImageDraw是Pillow中实现图像标注、验证码生成、图表绘制等功能的基石,是图像处理工作中不可或缺的模块。
二、Draw对象创建与参数
基本语法
代码示例
from PIL import Image, ImageDraw
draw = ImageDraw.Draw(img)参数说明
三、常用绘图方法
四、代码示例演示
示例1:绘制基本形状
演示直线、矩形、椭圆和多边形的绘制方法:
代码示例
from PIL import Image, ImageDraw
img = Image.new('RGB', (400, 300), color='white')
draw = ImageDraw.Draw(img)
# 绘制直线
draw.line((10, 10, 200, 10), fill='red', width=3)
draw.line((10, 10, 10, 200), fill='blue', width=3)
# 绘制矩形
draw.rectangle((50, 50, 200, 150), fill='lightblue', outline='navy', width=2)
# 绘制椭圆
draw.ellipse((220, 50, 380, 200), fill='pink', outline='red', width=2)
# 绘制多边形
draw.polygon([(100, 200), (150, 250), (50, 250)], fill='green', outline='darkgreen')
img.save('shapes.png')
print("基本形状已绘制并保存")输出:
代码示例
基本形状已绘制并保存示例2:绘制圆弧和扇形
演示圆弧、扇形和弦的绘制,注意角度从3点钟方向开始顺时针增加:
代码示例
from PIL import Image, ImageDraw
img = Image.new('RGB', (400, 300), color='white')
draw = ImageDraw.Draw(img)
# 绘制圆弧(0-90度)
draw.arc((20, 20, 180, 180), start=0, end=90, fill='red', width=3)
# 绘制圆弧(90-270度)
draw.arc((20, 20, 180, 180), start=90, end=270, fill='blue', width=3)
# 绘制扇形
draw.pieslice((200, 20, 380, 180), start=0, end=120, fill='orange', outline='black')
draw.pieslice((200, 20, 380, 180), start=120, end=240, fill='yellow', outline='black')
draw.pieslice((200, 20, 380, 180), start=240, end=360, fill='lime', outline='black')
# 绘制弦
draw.chord((20, 200, 180, 300), start=30, end=150, fill='purple', outline='black')
img.save('arcs.png')
print("圆弧和扇形已绘制并保存")输出:
代码示例
圆弧和扇形已绘制并保存示例3:绘制网格和标注
综合运用绘图方法创建带网格和标注的坐标系:
代码示例
from PIL import Image, ImageDraw
img = Image.new('RGB', (400, 400), color='white')
draw = ImageDraw.Draw(img)
# 绘制网格
for x in range(0, 401, 50):
draw.line((x, 0, x, 400), fill='lightgray', width=1)
for y in range(0, 401, 50):
draw.line((0, y, 400, y), fill='lightgray', width=1)
# 绘制坐标轴
draw.line((200, 0, 200, 400), fill='black', width=2)
draw.line((0, 200, 400, 200), fill='black', width=2)
# 标注坐标
draw.text((205, 5), "Y+", fill='black')
draw.text((380, 205), "X+", fill='black')
# 在第一象限绘制点
points = [(250, 150), (300, 100), (350, 180)]
for p in points:
draw.ellipse((p[0]-3, p[1]-3, p[0]+3, p[1]+3), fill='red')
# 连接点
draw.line(points, fill='blue', width=2)
img.save('grid.png')
print("网格和标注已绘制并保存")输出:
代码示例
网格和标注已绘制并保存五、实际应用场景
-
图像标注:在目标检测的结果图上绘制边界框和标签,可视化模型预测结果。
-
验证码生成:在画布上绘制随机字符和干扰线,生成图形验证码。
-
数据可视化:绘制简单的柱状图、折线图或饼图,无需依赖matplotlib。
六、注意事项
-
直接修改原图:ImageDraw的绘图操作直接修改原图,如需保留原图请先copy()。
-
字体问题:绘制文字时默认使用很小的字体,通常需要配合ImageFont指定字体。
-
角度方向:圆弧的角度使用度数,0度为3点钟方向,顺时针增加。
-
坐标格式:矩形和椭圆的坐标是(left, upper, right, lower),不是(left, upper, width, height)。
小贴士
如果需要绘制半透明图形,可以先创建RGBA模式的图像,在fill和outline参数中使用RGBA元组,例如fill=(255, 0, 0, 128)表示半透明红色。这在创建水印或叠加层时非常有用。
七、绘图方法对比
八、小结与练习
通过本文的学习,我们掌握了Pillow中ImageDraw绘图的核心方法:
-
ImageDraw.Draw()创建绘图对象,所有绘图操作直接修改原图。
-
支持多种图形:直线、矩形、椭圆、多边形、圆弧、扇形、文字等绘制。
-
绘制文字需配合ImageFont模块指定字体大小和样式。
练习题
练习1:编写程序,在白色画布上绘制一个简单的柱状图,包含5个不同高度的柱子。
练习2:编写程序,生成一个简单的验证码图片,包含4个随机数字和若干干扰线。
常见问题
如何绘制抗锯齿的图形?
Pillow的ImageDraw不支持原生抗锯齿。可以先在2倍尺寸的画布上绘制,然后使用Image.Resampling.LANCZOS缩小到目标尺寸,获得类似抗锯齿的效果。
rectangle的坐标参数为什么是四个值?
rectangle使用前两个值表示左上角坐标(left, upper),后两个值表示右下角坐标(right, lower)。这与(left, upper, width, height)不同,需要注意right和lower是绝对坐标而非相对偏移。
如何在图片上绘制中文文字?
需要使用支持中文的TrueType字体文件,通过ImageFont.truetype("msyh.ttf", 24)加载微软雅黑等中文字体,然后在draw.text()中传入font参数。
如何绘制虚线?
ImageDraw原生不支持虚线。可以通过循环绘制短线段实现:计算线段总长度和间隔,按间隔交替绘制和跳过,模拟虚线效果。
本文涉及AI创作
内容由AI创作,请仔细甄别