如何在Python PIL中自动调整文本字距?批量处理CSV中40+词汇
解决PIL生成图片文本间距过大及批量处理CSV词汇的问题
PIL的ImageDraw.text()方法没有直接调整字符间距的API,要解决字距过大的问题,我们可以手动逐个绘制每个字符,通过控制每个字符的水平偏移量来自定义字距。结合批量处理CSV的需求,以下是完整解决方案:
核心思路
- 自定义函数实现带字距控制的文本绘制:遍历文本的每个字符,依次绘制,每个字符的X坐标在前一个字符的基础上加上字符宽度和自定义字距。
- 批量读取CSV中的词汇:使用Python内置的
csv模块读取所有词汇,循环生成对应图片。 - 保持文本居中:计算所有字符加上字距后的总宽度,再结合图片尺寸计算居中起始位置。
完整代码示例
from PIL import Image, ImageDraw, ImageFont import csv def draw_text_with_kerning(img_draw, start_x, start_y, text, font, fill, kerning=0): """ 绘制带自定义字距的文本 :param img_draw: ImageDraw对象 :param start_x: 文本起始X坐标 :param start_y: 文本起始Y坐标 :param text: 要绘制的文本 :param font: ImageFont对象 :param fill: 文本颜色 :param kerning: 字距(正数增大间距,负数减小间距) """ current_x = start_x for char in text: # 绘制单个字符 img_draw.text((current_x, start_y), char, font=font, fill=fill) # 获取当前字符的宽度,更新下一个字符的X坐标 char_width = img_draw.textlength(char, font=font) current_x += char_width + kerning # 图片尺寸配置 width = 2480 height = 3071 font = ImageFont.truetype("Arial.ttf", size=900) fill_color = (255, 255, 255) bg_color = 'black' # 自定义字距,负数表示缩小间距,可根据实际效果调整 custom_kerning = -50 # 批量处理CSV中的词汇 with open('vocab.csv', 'r', encoding='utf-8') as csv_file: reader = csv.reader(csv_file) for idx, row in enumerate(reader): # 假设CSV每行第一个元素是要生成的词汇 message = row[0].strip() if not message: continue # 创建图片和绘图对象 img = Image.new('RGB', (width, height), color=bg_color) img_draw = ImageDraw.Draw(img) # 计算文本总宽度(含自定义字距) total_text_width = sum(img_draw.textlength(char, font=font) for char in message) + (len(message)-1)*custom_kerning # 计算居中的起始坐标 x_text = (width - total_text_width) / 2 # 这里可以根据需求调整Y坐标,比如保持和你原来的2100一致,或者也计算居中 y_text = 2100 # 或者用 (height - font.size) / 2 实现垂直居中 # 绘制带字距的文本 draw_text_with_kerning(img_draw, x_text, y_text, message, font, fill_color, custom_kerning) # 保存图片,用索引或词汇名命名 img.save(f'result_{idx+1}_{message}.png') print(f'已生成图片: result_{idx+1}_{message}.png')
关键说明
- 字距调整:通过
custom_kerning参数控制,负数会缩小字符间距,正数会增大间距,你可以根据生成的图片效果反复调整这个值(比如从-30、-50开始测试)。 - CSV处理:假设你的CSV文件
vocab.csv每行存储一个词汇,若格式不同,可修改row[0]的取值逻辑适配你的CSV结构。 - 文本居中:通过计算所有字符宽度总和加上字距的总长度,再用图片宽度减去这个总长度后除以2,得到居中的起始X坐标。
- 字体兼容性:确保
Arial.ttf文件在你的Python运行环境可访问,若找不到,可替换为系统中存在的其他字体路径或名称。
内容的提问来源于stack exchange,提问作者AztlanSurfer
相关产品推荐
相关产品推荐

