- 修正3个i3-3代SKU文件总成本与配件之和不一致的问题:i3-3代-4G-32G总成本221.5->236.5,i3-3代-4G-64G总成本236.5->251.5,i3-3代-8G-64G总成本313.5->298.5 - 删除售价验证临时图片,新增nascab产品和2.5金单有产品目录
71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
# -*- 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 <image_path> <title> <subtitle> <output_path>")
|
|
sys.exit(1)
|
|
add_text_overlay(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])
|