如何使用Python PIL减少透明图片中文本的字符间距?
解决PIL文本字符间距缩小的问题
嘿,我之前做类似的透明文本图时也遇到过这个需求——PIL的draw.text()默认没有直接调整字符间距的选项,但我们可以通过逐个绘制字符并手动控制偏移量来实现文字紧凑排布的效果,灵活度拉满!
具体实现思路
核心逻辑就是不一次性绘制整个文本,而是把每个字符单独画出来,给相邻字符之间设置一个比默认更小的间距(甚至负间距,让字符轻微重叠)。步骤很简单:
- 单独获取每个字符的宽度
- 设定一个间距调整值(负数表示缩小间距)
- 逐个绘制字符,累加调整后的位置坐标
修改后的完整代码
from PIL import Image, ImageDraw, ImageFont (W, H) = (140, 40) # 创建透明背景图 image = Image.new("RGBA", (140, 40), (0,0,0,0)) # 加载字体(注意本地字体路径要正确) font = ImageFont.truetype("Arial.ttf", 30) draw = ImageDraw.Draw(image) text = "kpy7n" # 设定字符间距调整值,负数缩小间距,可根据需求微调 spacing_adjust = -2 # 初始X坐标(这里做了水平居中处理,不需要的话直接设为固定值即可) current_x = (W - font.getsize(text)[0]) / 2 # 文本垂直居中的Y坐标 current_y = (H - font.getsize(text)[1]) / 2 # 逐个绘制每个字符 for char in text: # 绘制当前字符,fill改成你需要的文本颜色 draw.text((current_x, current_y), char, font=font, fill=(255,255,255,255)) # 获取当前字符宽度,加上调整后的间距,更新下一个字符的X坐标 char_width = font.getsize(char)[0] current_x += char_width + spacing_adjust # 保存处理后的图片 image.save("compact_text.png")
小提示
spacing_adjust的数值可以根据字体大小和需求灵活调整,比如-3会比-2更紧凑,多试几个值就能找到最贴合你需求的效果- 如果不需要文本居中,直接把
current_x设为0或者你想要的起始位置就行
内容的提问来源于stack exchange,提问作者toast




