168 lines
5.7 KiB
Python
168 lines
5.7 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
为图片生成5种字幕封面风格
|
|
"""
|
|
from PIL import Image, ImageDraw, ImageFont
|
|
import os
|
|
|
|
def add_text_with_style(img, title, style_name, font_path):
|
|
"""在图像上添加指定风格的标题文字"""
|
|
pil_img = img.copy()
|
|
draw = ImageDraw.Draw(pil_img)
|
|
|
|
width, height = pil_img.size
|
|
|
|
# 设置字体大小
|
|
font_size = int(height * 0.12)
|
|
try:
|
|
font = ImageFont.truetype(font_path, font_size)
|
|
except:
|
|
font = ImageFont.load_default()
|
|
|
|
# 计算标题位置(顶部居中)
|
|
bbox = draw.textbbox((0, 0), title, font=font)
|
|
text_width = bbox[2] - bbox[0]
|
|
text_height = bbox[3] - bbox[1]
|
|
x = (width - text_width) // 2
|
|
y = int(height * 0.08) # 距离顶部8%的位置
|
|
|
|
if style_name == "default":
|
|
# 默认风格:黑色背景条 + 白色文字
|
|
padding = 30
|
|
draw.rectangle(
|
|
[x - padding, y - padding, x + text_width + padding, y + text_height + padding],
|
|
fill=(0, 0, 0, 200)
|
|
)
|
|
draw.text((x, y), title, font=font, fill=(255, 255, 255))
|
|
|
|
elif style_name == "blur_bg":
|
|
# 模糊背景风格
|
|
bg_region = pil_img.crop((x - 50, y - 50, x + text_width + 50, y + text_height + 50))
|
|
bg_region = bg_region.filter(Image.BLUR)
|
|
pil_img.paste(bg_region, (x - 50, y - 50))
|
|
draw = ImageDraw.Draw(pil_img)
|
|
|
|
# 添加半透明黑色遮罩
|
|
overlay = Image.new('RGBA', pil_img.size, (0, 0, 0, 0))
|
|
overlay_draw = ImageDraw.Draw(overlay)
|
|
overlay_draw.rectangle([x - 50, y - 50, x + text_width + 50, y + text_height + 50], fill=(0, 0, 0, 150))
|
|
pil_img = Image.alpha_composite(pil_img.convert('RGBA'), overlay).convert('RGB')
|
|
draw = ImageDraw.Draw(pil_img)
|
|
|
|
draw.text((x, y), title, font=font, fill=(255, 255, 255))
|
|
|
|
elif style_name == "outline":
|
|
# 描边风格:白色文字 + 黑色描边
|
|
outline_width = 4
|
|
for adj_x in range(-outline_width, outline_width + 1):
|
|
for adj_y in range(-outline_width, outline_width + 1):
|
|
draw.text((x + adj_x, y + adj_y), title, font=font, fill=(0, 0, 0))
|
|
draw.text((x, y), title, font=font, fill=(255, 255, 255))
|
|
|
|
elif style_name == "gradient":
|
|
# 渐变背景风格
|
|
gradient_height = text_height + 100
|
|
gradient = Image.new('RGBA', (width, gradient_height), (0, 0, 0, 0))
|
|
gradient_draw = ImageDraw.Draw(gradient)
|
|
for i in range(gradient_height):
|
|
alpha = int(250 * (i / gradient_height))
|
|
gradient_draw.rectangle([0, i, width, i + 1], fill=(0, 0, 0, alpha))
|
|
|
|
pil_img_rgba = pil_img.convert('RGBA')
|
|
pil_img_rgba.paste(gradient, (0, y - 50), gradient)
|
|
pil_img = pil_img_rgba.convert('RGB')
|
|
draw = ImageDraw.Draw(pil_img)
|
|
|
|
draw.text((x, y), title, font=font, fill=(255, 255, 255))
|
|
|
|
elif style_name == "split":
|
|
# 分栏风格:左侧标题 + 右侧装饰
|
|
padding = 40
|
|
|
|
# 左侧标题
|
|
left_x = padding
|
|
draw.rectangle(
|
|
[left_x - 20, y - 20, left_x + text_width + 20, y + text_height + 20],
|
|
fill=(0, 0, 0, 180)
|
|
)
|
|
draw.text((left_x, y), title, font=font, fill=(255, 255, 255))
|
|
|
|
# 右侧装饰元素
|
|
right_text = "✨ 精彩"
|
|
right_bbox = draw.textbbox((0, 0), right_text, font=font)
|
|
right_width = right_bbox[2] - right_bbox[0]
|
|
right_x = width - right_width - padding
|
|
draw.rectangle(
|
|
[right_x - 25, y - 25, right_x + right_width + 25, y + text_height + 25],
|
|
fill=(255, 193, 7, 200) # 金黄色背景
|
|
)
|
|
draw.text((right_x, y), right_text, font=font, fill=(0, 0, 0))
|
|
|
|
return pil_img
|
|
|
|
def main():
|
|
# 输入图片路径
|
|
image_path = r"C:\aigcpanel-main\微信图片_20251125215233_633_235.jpg"
|
|
title = "我是个美女啊啊啊"
|
|
|
|
# 输出目录
|
|
output_dir = r"C:\aigcpanel-main\public\cover-previews"
|
|
os.makedirs(output_dir, exist_ok=True)
|
|
|
|
# 字体路径
|
|
font_path = r"" # 微软雅黑
|
|
|
|
# 读取图片
|
|
print("正在读取图片...")
|
|
try:
|
|
img = Image.open(image_path)
|
|
print(f"图片尺寸:{img.size}")
|
|
except Exception as e:
|
|
print(f"❌ 无法读取图片: {e}")
|
|
return
|
|
|
|
# 调整图片大小以便预览
|
|
width, height = img.size
|
|
if width > 1280:
|
|
scale = 1280 / width
|
|
new_width = 1280
|
|
new_height = int(height * scale)
|
|
img = img.resize((new_width, new_height))
|
|
print(f"调整图片尺寸为:{img.size}")
|
|
|
|
# 定义5种风格
|
|
styles = [
|
|
("default", "默认风格:黑色半透明背景条"),
|
|
("blur_bg", "模糊背景风格:背景模糊效果"),
|
|
("outline", "描边风格:文字带黑色描边"),
|
|
("gradient", "渐变背景风格:渐变半透明遮罩"),
|
|
("split", "分栏风格:标题+装饰元素")
|
|
]
|
|
|
|
# 生成每种风格的封面
|
|
for style_name, description in styles:
|
|
print(f"生成 {style_name} 风格封面:{description}")
|
|
|
|
# 复制原始图片
|
|
styled_img = img.copy()
|
|
|
|
# 应用风格
|
|
styled_img = add_text_with_style(styled_img, title, style_name, font_path)
|
|
|
|
# 保存封面
|
|
output_path = os.path.join(output_dir, f"cover-title-{style_name}.png")
|
|
styled_img.save(output_path)
|
|
print(f"✅ 已保存:{output_path}")
|
|
|
|
print("\n" + "="*60)
|
|
print("🎉 所有封面生成完成!")
|
|
print(f"📁 保存位置:{output_dir}")
|
|
print("="*60)
|
|
print(f"\n标题:{title}")
|
|
print("\n封面列表:")
|
|
for style_name, description in styles:
|
|
print(f" • cover-title-{style_name}.png - {description}")
|
|
|
|
if __name__ == "__main__":
|
|
main() |