You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:15:43