# 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}")