84 lines
3.0 KiB
Python
84 lines
3.0 KiB
Python
# compose_poster.py - 合成图层
|
|
import os
|
|
from PIL import Image
|
|
import logging
|
|
|
|
# 设置日志
|
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# 设置默认图片目录
|
|
DEFAULT_IMAGE_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'images')
|
|
|
|
def compose_layers(layers, output_path, canvas_size=(1080, 1920)):
|
|
"""
|
|
合成多个图层为一个图像
|
|
|
|
Args:
|
|
layers: 图层文件名列表,从底到顶排序
|
|
output_path: 输出文件路径
|
|
canvas_size: 画布大小,默认为(1080, 1920)
|
|
|
|
Returns:
|
|
str: 输出文件的路径
|
|
"""
|
|
logger.info(f"开始合成{len(layers)}个图层...")
|
|
|
|
# 创建空白画布
|
|
canvas = Image.new('RGBA', canvas_size, (0, 0, 0, 0))
|
|
|
|
# 逐个添加图层
|
|
for i, layer_name in enumerate(layers):
|
|
try:
|
|
# 构建完整的图层路径
|
|
layer_path = os.path.join(DEFAULT_IMAGE_DIR, layer_name)
|
|
|
|
if os.path.exists(layer_path):
|
|
# 打开图层图像
|
|
layer = Image.open(layer_path).convert('RGBA')
|
|
|
|
# 调整图层大小以适应画布
|
|
# 如果图层尺寸与画布不同,将其居中
|
|
if layer.size != canvas_size:
|
|
new_layer = Image.new('RGBA', canvas_size, (0, 0, 0, 0))
|
|
paste_x = (canvas_size[0] - layer.width) // 2
|
|
paste_y = (canvas_size[1] - layer.height) // 2
|
|
new_layer.paste(layer, (paste_x, paste_y), layer)
|
|
layer = new_layer
|
|
|
|
# 合成图层
|
|
canvas = Image.alpha_composite(canvas, layer)
|
|
logger.info(f"已添加第{i+1}个图层: {layer_path}")
|
|
else:
|
|
logger.error(f"图层文件不存在: {layer_path}")
|
|
except Exception as e:
|
|
logger.error(f"处理图层{layer_path}时出错: {str(e)}")
|
|
|
|
# 设置默认输出目录
|
|
default_output_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'outputs')
|
|
|
|
# 确保输出目录存在
|
|
if not os.path.exists(default_output_dir):
|
|
os.makedirs(default_output_dir)
|
|
|
|
# 构建输出文件的完整路径
|
|
output_path = os.path.join(default_output_dir, os.path.basename(output_path))
|
|
|
|
# 保存合成图像
|
|
canvas.save(output_path)
|
|
logger.info(f"图层合成完成,已保存到: {output_path}")
|
|
|
|
return output_path
|
|
|
|
if __name__ == "__main__":
|
|
# 简单测试
|
|
from sys import argv
|
|
|
|
if len(argv) >= 3:
|
|
# 从命令行接收参数
|
|
layers = argv[1:-1] # 现在只需要提供文件名,不需要完整路径
|
|
output = argv[-1]
|
|
compose_layers(layers, output)
|
|
else:
|
|
print("用法: python compose_poster.py layer1.png layer2.png ... output.png")
|
|
print(f"图片将从默认目录加载: {DEFAULT_IMAGE_DIR}") |