如何使用PIL/Pillow扩展图像底部并绘制带文字的黑色矩形?
Pillow 底部扩展加标注实现方案
问题根因
两类效果不符问题的根因如下:
- 文字尺寸过小无法辨认:误用Pillow自带的默认位图字体,该字体为固定小尺寸资源,不支持矢量缩放,无论怎么调整参数都无法生成大尺寸清晰文字
- 矩形绘制效果不符合预期:画布扩展后的坐标计算逻辑错误,未以图像左上角为坐标原点对齐矩形位置,导致矩形错位、尺寸偏差
实现步骤
- 安装依赖库
执行命令安装Pillow:pip install pillow - 逻辑实现要点
- 读取原图后,按比例计算底部扩展区域高度,通常取原图高度的1/6即可匹配常规视觉比例
- 新建尺寸匹配的新画布,将原图粘贴到新画布顶部区域
- 从原图高度对应的y轴坐标开始,绘制横跨整个画布宽度的纯黑色矩形,覆盖全部新增的扩展区域
- 加载系统TrueType矢量字体,字号取扩展区域高度的70%,将4位数字编码设置为白色,居中绘制在黑色矩形区域,绘制前通过文本边界框计算偏移量保证居中准确
完整可运行代码
from PIL import Image, ImageDraw, ImageFont # 配置参数 img_path = "your_original_image.jpg" # 替换为原始图像本地路径 output_path = "result.jpg" code = "0001" # 替换为需要标注的4位数字编码 extend_ratio = 1/6 # 底部扩展区域占原图高度的比例 # 读取原图 img = Image.open(img_path).convert("RGB") origin_w, origin_h = img.size extend_h = int(origin_h * extend_ratio) new_h = origin_h + extend_h # 创建新画布,粘贴原图 new_img = Image.new("RGB", (origin_w, new_h), color="white") new_img.paste(img, (0, 0)) # 绘制底部黑色矩形 draw = ImageDraw.Draw(new_img) rect_start = (0, origin_h) rect_end = (origin_w, new_h) draw.rectangle([rect_start, rect_end], fill="black") # 加载矢量字体,设置适配字号 # 不同系统可替换对应字体路径:Windows为arial.ttf,macOS为PingFang.ttc,Linux为DejaVuSans.ttf font_size = int(extend_h * 0.7) font = ImageFont.truetype("arial.ttf", font_size) # 计算文字居中位置 text_bbox = draw.textbbox((0, 0), code, font=font) text_w = text_bbox[2] - text_bbox[0] text_h = text_bbox[3] - text_bbox[1] text_x = (origin_w - text_w) // 2 text_y = origin_h + (extend_h - text_h) // 2 # 绘制白色文字 draw.text((text_x, text_y), code, font=font, fill="white") # 保存结果 new_img.save(output_path)
调优提示
- 如果字体加载报错,将
ImageFont.truetype的第一个参数替换为本机存在的任意无衬线ttf字体的绝对路径即可 - 可以通过调整
extend_ratio参数修改底部黑色条的高度,调整font_size的比例系数修改文字相对大小 - 如果需要文字左对齐/右对齐,只需要修改
text_x的计算逻辑即可,不需要调整其他绘制逻辑
内容的提问来源于stack exchange,提问作者Somebody0812
相关产品推荐
相关产品推荐

