# -*- coding: utf-8 -*- """在图片上叠加文字标签:标题 + 副标题,带半透明背景条""" from PIL import Image, ImageDraw, ImageFont import sys import os def add_text_overlay(image_path, title, subtitle, output_path): img = Image.open(image_path).convert("RGBA") w, h = img.size # 创建文字图层 txt_layer = Image.new("RGBA", (w, h), (0, 0, 0, 0)) draw = ImageDraw.Draw(txt_layer) # 字体大小根据图片宽度自适应 title_size = max(48, w // 18) sub_size = max(28, w // 30) # 尝试加载中文字体 font_paths = [ r"C:\Windows\Fonts\msyhbd.ttc", # 微软雅黑粗体 r"C:\Windows\Fonts\msyh.ttc", # 微软雅黑 r"C:\Windows\Fonts\simhei.ttf", # 黑体 ] title_font = None sub_font = None for fp in font_paths: if os.path.exists(fp): title_font = ImageFont.truetype(fp, title_size) sub_font = ImageFont.truetype(fp, sub_size) break if title_font is None: title_font = ImageFont.load_default() sub_font = ImageFont.load_default() # 文字位置:左上角,带边距 margin_x = w // 15 margin_y = h // 10 # 绘制半透明背景条 title_bbox = draw.textbbox((margin_x, margin_y), title, font=title_font) sub_bbox = draw.textbbox((margin_x, title_bbox[3] + 12), subtitle, font=sub_font) bar_top = margin_y - 16 bar_bottom = sub_bbox[3] + 16 bar_right = max(title_bbox[2], sub_bbox[2]) + 30 draw.rectangle( [(margin_x - 16, bar_top), (bar_right, bar_bottom)], fill=(0, 0, 0, 140) ) # 绘制标题(白色粗体) draw.text((margin_x, margin_y), title, font=title_font, fill=(255, 255, 255, 255)) # 绘制副标题(浅白色) draw.text((margin_x, title_bbox[3] + 12), subtitle, font=sub_font, fill=(220, 230, 255, 230)) # 合成 result = Image.alpha_composite(img, txt_layer).convert("RGB") result.save(output_path, "PNG") print(f"Saved: {output_path}") if __name__ == "__main__": if len(sys.argv) < 5: print("Usage: python add_text.py <subtitle> <output_path>") sys.exit(1) add_text_overlay(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])