Python中在图片上显示非英文(印地语等)文本的问题求助
解决非拉丁脚本(印地语/泰卢固语/泰米尔语)文本显示问题的实用方案
核心问题分析
OpenCV的putText方法原生对复杂表意文字(尤其是南亚语言)支持极差,因为它依赖的FreeType版本或内部渲染逻辑不处理连字、字形组合这类复杂规则。PIL的ImageDraw.text理论上支持,但需要正确配置字体和文本编码。
分步解决建议
1. 确认字体文件有效性
- 下载的TTF字体必须完整支持目标语言:比如印地语常用
Noto Sans Devanagari,泰卢固语用Noto Sans Telugu,泰米尔语用Noto Sans Tamil,避免用仅支持部分字形的字体。 - 验证字体:在系统字体预览里打开TTF,确认能显示目标语言的所有字符,避免下载到损坏或不完整的字体文件。
2. PIL的正确实现代码
from PIL import Image, ImageDraw, ImageFont # 加载正确的字体文件,注意路径要准确 font_path = "NotoSansDevanagari-Regular.ttf" try: font = ImageFont.truetype(font_path, 40) # 第二个参数为字体大小 except IOError: print("字体文件加载失败,请检查路径") exit() # 创建空白图片(或加载现有项目图片) img = Image.new("RGB", (500, 200), "white") draw = ImageDraw.Draw(img) # 直接使用目标语言的Unicode字符串(Python 3默认支持) hindi_text = "नमस्ते" telugu_text = "నమస్కారం" tamil_text = "வணக்கம்" # 绘制印地语文本 draw.text((50, 50), hindi_text, font=font, fill="black") # 绘制泰卢固语文本需加载对应字体 telugu_font = ImageFont.truetype("NotoSansTelugu-Regular.ttf", 40) draw.text((50, 120), telugu_text, font=telugu_font, fill="black") # 绘制泰米尔语文本需加载对应字体 tamil_font = ImageFont.truetype("NotoSansTamil-Regular.ttf", 40) draw.text((250, 120), tamil_text, font=tamil_font, fill="black") # 保存或预览图片 img.save("multi_lang_output.png") img.show()
3. 适配OpenCV的处理流程
如果项目必须用OpenCV处理图片,先通过PIL完成文本绘制,再转换为OpenCV兼容格式:
import cv2 import numpy as np # 将PIL图片转为OpenCV的BGR格式 cv_img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) cv2.imshow("Multi-Language Output", cv_img) cv2.waitKey(0) cv2.destroyAllWindows()
4. 常见错误排查
- 显示方框:检查字体是否真的支持目标字符,部分字体仅覆盖常用字,不包含生僻字形;
- 显示乱码:确认文本是正确的Unicode字符,可通过在线Unicode工具验证字符编码;
- 字体加载失败:Windows系统注意路径反斜杠需转义(用
\\)或使用原始字符串r"path\to\font.ttf",Linux/macOS确保路径权限正常。
内容的提问来源于stack exchange,提问作者prisha sharma
相关产品推荐
相关产品推荐

