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

如何使用PIL/Pillow扩展图像底部并绘制带文字的黑色矩形?

Pillow 底部扩展加标注实现方案

问题根因

两类效果不符问题的根因如下:

  • 文字尺寸过小无法辨认:误用Pillow自带的默认位图字体,该字体为固定小尺寸资源,不支持矢量缩放,无论怎么调整参数都无法生成大尺寸清晰文字
  • 矩形绘制效果不符合预期:画布扩展后的坐标计算逻辑错误,未以图像左上角为坐标原点对齐矩形位置,导致矩形错位、尺寸偏差

实现步骤

  1. 安装依赖库
    执行命令安装Pillow:
    pip install pillow
  2. 逻辑实现要点
    • 读取原图后,按比例计算底部扩展区域高度,通常取原图高度的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:09:20