pin_drop当前位置:知识文库 ❯ 图文

Pillow ImageDraw绘图教程 - 绘制形状文字与图像标注详解

一、ImageDraw绘图概述

ImageDraw模块提供了在Image对象上绘制二维图形的功能,包括直线、矩形、椭圆、多边形、圆弧、文字等。通过创建ImageDraw.Draw对象,可以在图像上进行各种绘图操作。

ImageDraw是Pillow中实现图像标注、验证码生成、图表绘制等功能的基石,是图像处理工作中不可或缺的模块。

二、Draw对象创建与参数

基本语法

代码示例

from PIL import Image, ImageDraw

draw = ImageDraw.Draw(img)

参数说明

参数 类型 必填 说明
im Image对象 要在其上绘图的图像
mode str 绘图模式,默认与图像模式一致

三、常用绘图方法

方法 说明
draw.line(xy, fill, width) 绘制直线
draw.rectangle(xy, fill, outline, width) 绘制矩形
draw.ellipse(xy, fill, outline, width) 绘制椭圆
draw.polygon(xy, fill, outline) 绘制多边形
draw.arc(xy, start, end, fill, width) 绘制圆弧
draw.pieslice(xy, start, end, fill, outline) 绘制扇形
draw.point(xy, fill) 绘制点
draw.text(xy, text, fill, font) 绘制文字
draw.chord(xy, start, end, fill, outline) 绘制弦

四、代码示例演示

示例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)表示半透明红色。这在创建水印或叠加层时非常有用。

七、绘图方法对比

方法 坐标参数 是否填充 是否有轮廓
line 起止点序列 否(只有fill)
rectangle 两点或四点
ellipse 两点(外接矩形)
polygon 顶点序列
arc 两点+角度 否(只有fill)
pieslice 两点+角度

八、小结与练习

通过本文的学习,我们掌握了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原生不支持虚线。可以通过循环绘制短线段实现:计算线段总长度和间隔,按间隔交替绘制和跳过,模拟虚线效果。

标签: Pillow ImageDraw 图像绘图 验证码 图像标注 Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Pillow Image滤镜教程 - ImageFilter内置滤镜与自定义卷积核详解 下一篇: Pillow ImageFont字体教程 - 加载字体文字尺寸与居中绘制详解

poll相关推荐