共计 2483 个字符,预计需要花费 7 分钟才能阅读完成。
在前一节中,我们学习了使用 Pillow 进行图像的读取、处理和保存。本节将继续深入,介绍如何在图像上进行绘制操作,包括绘制线条、矩形、圆形、多边形以及添加文字等内容。掌握这些技能后,你可以自行生成图形化内容,如验证码、报表图标或自定义图像水印。
- 创建一个空白图像
首先,我们需要创建一个新的空白图像:
from PIL import Image, ImageDraw
# 创建一个 RGB 图像,大小为 400x300,背景为白色
img = Image.new("RGB", (400, 300), color="white")
# 获取绘图对象
draw = ImageDraw.Draw(img)
# 保存或显示图像
img.save("blank_image.jpg")
img.show()
Image.new() 可以创建不同模式的图像,如 RGB、RGBA(带透明通道)或灰度 L 模式。
- 绘制线条
可以使用line()方法绘制直线:
draw.line((50, 50, 350, 50), fill="blue", width=3)
draw.line((50, 100, 350, 200), fill="red", width=5)
img.save("lines.jpg")
参数 (x1, y1, x2, y2) 定义了起点和终点坐标,fill 表示颜色,width 控制线宽。
- 绘制矩形与圆形
矩形和椭圆都是通过边界框来定义的:
# 绘制矩形
draw.rectangle((50, 50, 150, 150), outline="green", width=3, fill="yellow")
# 绘制圆形
draw.ellipse((200, 50, 300, 150), outline="blue", width=3, fill="lightblue")
img.save("shapes.jpg")
rectangle():绘制矩形,可以添加填充色。ellipse():绘制椭圆,如果边界框为正方形则为圆形。
- 绘制多边形与点
多边形由多个点连接而成,可以绘制三角形、五边形等:
# 绘制三角形
draw.polygon([(200, 200), (250, 100), (300, 200)], outline="purple", fill="violet")
# 绘制单个点
draw.point((100, 250), fill="black")
img.save("polygon.jpg")
- 添加文字
通过ImageDraw.text()可以在图像中加入文字:
from PIL import ImageFont
font = ImageFont.load_default()
draw.text((20, 250), "Hello, Python!", fill="black", font=font)
img.save("text.jpg")
若希望使用更美观的字体,可以加载 .ttf 文件:
font = ImageFont.truetype("arial.ttf", 20)
draw.text((20, 250), " 使用自定义字体 ", fill="darkgreen", font=font)
img.save("text_custom_font.jpg")
- 绘制坐标网格示例
一个实用示例是生成坐标背景,用于测试或标注:
from PIL import Image, ImageDraw
img = Image.new("RGB", (400, 300), "white")
draw = ImageDraw.Draw(img)
# 绘制网格
for x in range(0, 401, 50):
draw.line((x, 0, x, 300), fill="lightgray")
for y in range(0, 301, 50):
draw.line((0, y, 400, y), fill="lightgray")
# 绘制坐标轴
draw.line((0, 150, 400, 150), fill="black", width=2)
draw.line((200, 0, 200, 300), fill="black", width=2)
img.save("grid.jpg")
这种网格图可用于生成教学图、绘制函数曲线或制作坐标背景。
- 生成验证码图像
验证码是绘图的常见应用之一。我们可以利用 Pillow 生成简单验证码:
import random
from PIL import Image, ImageDraw, ImageFont
chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"
code = "".join(random.choice(chars) for _ in range(5))
img = Image.new("RGB", (120, 40), "white")
draw = ImageDraw.Draw(img)
font = ImageFont.load_default()
# 绘制文字
for i, c in enumerate(code):
draw.text((10 + i * 20, 10), c, fill=(random.randint(0, 150), random.randint(0, 150), random.randint(0, 150)), font=font)
# 添加噪点
for _ in range(100):
x, y = random.randint(0, 120), random.randint(0, 40)
draw.point((x, y), fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
img.save("captcha.jpg")
运行后即可生成一个包含随机字符和噪点的验证码图像。
总结:
通过 ImageDraw 模块,Pillow 不仅能编辑图像,还能动态绘制图形内容。掌握线条、形状、文字等绘制方法后,你可以制作统计图标、验证码、图像水印甚至小游戏画面。图像绘制结合 Pillow 的图像处理功能,为可视化开发打下了坚实基础。
练习与思考:
- 尝试绘制一个彩色棋盘格图像。
- 实现一个动态生成的海报,包含文字、矩形边框和背景图片。
- 结合前一节内容,制作一个带水印和边框的图片生成脚本。
正文完