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

基于xy坐标在图像放置文本时显示不全的代码错误排查

文本显示不全问题排查

你的代码存在三个直接导致显示异常的问题:

  • 硬编码固定20号字体,完全没有匹配每个OCR检测框的实际尺寸。最后一段长正文对应的检测框高度远大于20号字的行高,且文本长度极长,默认draw.text()方法不会自动换行,单行文本直接超出图片右边界,超出部分会被直接截断。
  • 绘制翻译文本前没有遮盖原图上的原有文字,新旧文本重叠在一起,视觉上也会呈现显示错乱的效果。
  • 没有根据检测框的实际可用宽度对长文本做换行处理,所有文本不管多长都按单行输出,必然会溢出。
可直接运行的修复代码

修复逻辑包含三点:绘制前用纯色覆盖原文本区域、按检测框高度动态匹配字号、按检测框宽度对长文本自动换行。

from PIL import Image, ImageDraw, ImageFont
import textwrap

# 读取原图
image = Image.open("image.jpg")
draw = ImageDraw.Draw(image)
fontpath = "/content/drive/MyDrive/ArialTh.ttf"

for idx, bound in enumerate(output):
    # 解析OCR输出的四边形坐标
    tl, tr, br, bl = bound[0]
    tl = (int(tl[0]), int(tl[1]))
    br = (int(br[0]), int(br[1]))
    box_width = br[0] - tl[0]
    box_height = br[1] - tl[1]

    # 用白色填充原文本区域,遮盖原有文字避免重叠
    draw.rectangle([tl, br], fill="white")

    # 动态计算适配当前文本框的字号,取框高的80%预留上下边距
    fit_font_size = int(box_height * 0.8)
    text_font = ImageFont.truetype(fontpath, fit_font_size)

    # 计算单字符平均宽度,按文本框宽度自动折行
    avg_char_width = draw.textlength("A", font=text_font)
    wrap_char_count = max(1, int(box_width / avg_char_width))
    wrapped_content = textwrap.fill(translation[idx], width=wrap_char_count)

    # 绘制处理好的换行文本
    draw.text(tl, wrapped_content, font=text_font, fill="black")

# 保存结果
image.save('image_translation_fixed.jpg')
优化提示
  • 如果后续要渲染中文翻译,必须替换为支持中文字符集的字体文件,否则会出现方框乱码。
  • 原代码中定义的color = (0,0,255)、thickness = 1两个变量全程没有被调用,属于冗余代码可以直接删除。
  • 如果对排版精度要求更高,可以在折行后计算所有行的总高度,和文本框高度做二次匹配,动态微调字号避免文本超出文本框下边界。

内容的提问来源于stack exchange,提问作者sha25

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 23:54:32