基于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
相关产品推荐
相关产品推荐

