如何使用Python的PIL绘制倾斜文本?

43 投票
8 回答
50293 浏览
提问于 2025-04-11 09:32

我想用Python和PIL库来绘制不同角度的文字。

比如说,想象一下你在画一个时钟上的数字。数字3会正常显示,而12则会逆时针旋转90度来绘制。

所以,我需要能够在很多不同的角度绘制很多不同的字符串。

8 个回答

9

这里有一个可用的版本,灵感来自于之前的回答,但它在处理图片时不需要打开或保存图片。

这两张图片有彩色的背景,并且它们的透明度(alpha通道)不为零,这样可以让我们看到发生了什么。如果把这两个透明度从92改成0,它们就会完全透明。

from PIL import Image, ImageFont, ImageDraw

text = 'TEST'
font = ImageFont.truetype(r'C:\Windows\Fonts\Arial.ttf', 50)
width, height = font.getsize(text)

image1 = Image.new('RGBA', (200, 150), (0, 128, 0, 92))
draw1 = ImageDraw.Draw(image1)
draw1.text((0, 0), text=text, font=font, fill=(255, 128, 0))

image2 = Image.new('RGBA', (width, height), (0, 0, 128, 92))
draw2 = ImageDraw.Draw(image2)
draw2.text((0, 0), text=text, font=font, fill=(0, 255, 128))

image2 = image2.rotate(30, expand=1)

px, py = 10, 10
sx, sy = image2.size
image1.paste(image2, (px, py, px + sx, py + sy), image2)

image1.show()
10

在创建图像对象之前,知道我们文本的像素大小是很有用的。我在绘制图表时用过这样的代码。这样一来,我就不会遇到数据标签对齐的问题(图像的大小正好和文本一样大)。

(...)
img_main = Image.new("RGB", (200, 200))
font = ImageFont.load_default()

# Text to be rotated...
rotate_text = u'This text should be rotated.'

# Image for text to be rotated
img_txt = Image.new('L', font.getsize(rotate_text))
draw_txt = ImageDraw.Draw(img_txt)
draw_txt.text((0,0), rotate_text, font=font, fill=255)
t = img_value_axis.rotate(90, expand=1)

将这两张图片合并的其他部分已经在这个页面上描述过了。当你以一个“不规则”的角度旋转时,你需要稍微改进一下这段代码。实际上,这段代码适用于90度、180度、270度等角度。

53

先在一个空白的临时图像上写上文字,然后把这个图像旋转一下,最后再把旋转后的图像粘贴到原来的图像上。你可以把这些步骤放在一个函数里,这样使用起来会方便一些。祝你好运,找出具体的坐标位置可能会有点难,我现在脑子有点晕,想不清楚。

这个示例是在一张图片上斜着写黄色文字:

# Demo to add rotated text to an image using PIL

import Image
import ImageFont, ImageDraw, ImageOps

im=Image.open("stormy100.jpg")

f = ImageFont.load_default()
txt=Image.new('L', (500,50))
d = ImageDraw.Draw(txt)
d.text( (0, 0), "Someplace Near Boulder",  font=f, fill=255)
w=txt.rotate(17.5,  expand=1)

im.paste( ImageOps.colorize(w, (0,0,0), (255,255,84)), (242,60),  w)

撰写回答