python 实现PIL模块在图片画线写字

  • Post category:Python

下面就是Python实现PIL模块在图片画线写字的攻略:

1. 安装PIL模块和Python环境

在实现之前,首先需要在本地安装Python环境,以及PIL模块。可以使用pip命令进行安装,安装命令如下:

pip install pillow

2. 打开图片

使用PIL的Image.open()方法打开待处理的图片,代码示例如下:

from PIL import Image
img = Image.open('test.jpg')

3. 绘制线条

绘制线条可以使用ImageDraw的line()方法。这个方法接收一个元组,表示绘制的线条的两个端点坐标。可以指定线条颜色、宽度等属性。代码示例如下:

from PIL import Image, ImageDraw

img = Image.new('RGB', (200, 200), (255, 255, 255))
draw = ImageDraw.Draw(img)
draw.line([(0, 0), (199, 0), (199, 199), (0,199), (0,0)], fill = (0, 0, 0), width = 2)
img.show()

上述示例中,我们使用了Image.new方法创建了一个白色背景的图片,使用ImageDraw创建了一个在图片内任意指定的线条,线条的颜色和宽度均可以修改。其中linewidth表示线条的宽度,fill表示线条的颜色。

4. 写文字

可以使用ImageDraw的text方法在指定位置绘制文本。也可以通过定义字体等属性来修改文本的样式。代码示例如下:

from PIL import Image, ImageDraw, ImageFont

img = Image.new('RGB', (200, 200), (255, 255, 255))
draw = ImageDraw.Draw(img)
text = 'Hello World!'
font = ImageFont.truetype('arial.ttf', 36)
draw.text((50, 50), text, font=font, fill=(0, 0, 0))
img.show()

上述示例中,我们创建了一个白色背景的图片,并在图像上绘制了”Hello World!”文本。通过ImageFont.truetype()方法加载字体文件,并通过font属性指定字体的大小和类型。

5. 保存图片

在绘制完线条和文字后,可以将结果保存为图片文件。使用Image的save()方法即可实现图片的保存,代码示例如下:

from PIL import Image, ImageDraw

img = Image.new('RGB', (200, 200), (255, 255, 255))
draw = ImageDraw.Draw(img)
draw.line([(0, 0), (199, 0), (199, 199), (0,199), (0,0)], fill = (0, 0, 0), width = 2)
img.save('line.jpg')

上述示例中的save方法自动识别了保存的文件类型和后缀,想把图片保存为其他格式可以在文件名中指定后缀即可。

最后,这是一个综合练习示例,可以在图片内部创建一个20行,20列的方格图,并在每个小方格中心添加数字:

import os
from PIL import Image, ImageDraw, ImageFont

# 创建图片,定义大小和背景颜色
img = Image.new('RGB', (450, 450), (255, 255, 255))

# 计算小方格的大小
size = 20
width, height = img.size
rows = height // size
cols = width // size

# 绘制方格图
draw = ImageDraw.Draw(img)
for y in range(rows):
    for x in range(cols):
        x1 = x * size
        y1 = y * size
        x2 = x1 + size
        y2 = y1 + size
        draw.rectangle((x1, y1, x2, y2), outline=(0, 0, 0), width=1)

# 添加数字
font = ImageFont.truetype('arial.ttf', 16)
draw = ImageDraw.Draw(img)
for y in range(rows):
    for x in range(cols):
        cx = x * size + size // 2
        cy = y * size + size // 2
        draw.text((cx, cy), str(x + y * cols), font=font, fill=(0, 0, 0))

# 保存图片
img.save('grid.png')

这个示例程序首先创建了一个白色背景的图片,然后计算出每个小方格的大小并在图片内部循环绘制方格图。最终使用ImageDraw的text方法在每个小方格的中心添加数字,最终保存成文件。