91 lines
3.1 KiB
Python
91 lines
3.1 KiB
Python
# export_psd.py - PSD导出 (适配psd-tools 1.10.0 API)
|
||
import os
|
||
from PIL import Image
|
||
import logging
|
||
|
||
# 设置日志
|
||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||
logger = logging.getLogger(__name__)
|
||
|
||
# 设置默认目录路径
|
||
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||
DEFAULT_INPUT_DIR = os.path.join(project_root, 'images')
|
||
DEFAULT_OUTPUT_DIR = os.path.join(project_root, 'outputs')
|
||
|
||
def export_to_psd(layers, output_path, layer_names=None, canvas_size=(1080, 1920)):
|
||
# 先导入compose_poster中的函数
|
||
from compose_poster import compose_layers
|
||
|
||
try:
|
||
# 导入psd-tools相关模块
|
||
from psd_tools import PSDImage
|
||
from psd_tools.api.layers import PixelLayer
|
||
from psd_tools.constants import Compression
|
||
except ImportError:
|
||
logger.error("未安装psd-tools库,无法导出PSD。请安装:pip install psd-tools>=1.10.0")
|
||
return ""
|
||
|
||
logger.info(f"开始创建PSD文件,包含{len(layers)}个图层...")
|
||
|
||
# 1. 先使用compose_layers合成图层
|
||
temp_output = os.path.join(DEFAULT_OUTPUT_DIR, "temp_composed.png")
|
||
composed_path = compose_layers(layers, temp_output, canvas_size)
|
||
|
||
if not composed_path:
|
||
logger.error("图层合成失败")
|
||
return ""
|
||
|
||
# 2. 处理输出路径
|
||
if not os.path.isabs(output_path):
|
||
output_path = os.path.join(DEFAULT_OUTPUT_DIR, output_path)
|
||
|
||
if not output_path.lower().endswith('.psd'):
|
||
output_path += '.psd'
|
||
|
||
# 确保输出目录存在
|
||
output_dir = os.path.dirname(output_path)
|
||
if output_dir and not os.path.exists(output_dir):
|
||
os.makedirs(output_dir)
|
||
|
||
try:
|
||
# 3. 创建PSD文件
|
||
psd = PSDImage.new('RGB', canvas_size)
|
||
|
||
# 4. 添加合成后的图层
|
||
composed_image = Image.open(composed_path).convert('RGBA')
|
||
pixel_layer = PixelLayer.frompil(composed_image, psd, "Composed_Layer")
|
||
psd.append(pixel_layer)
|
||
|
||
# 5. 保存PSD文件
|
||
psd.save(output_path)
|
||
logger.info(f"PSD文件已成功创建并保存到: {output_path}")
|
||
|
||
# 6. 清理临时文件
|
||
if os.path.exists(temp_output):
|
||
os.remove(temp_output)
|
||
|
||
return output_path
|
||
|
||
except Exception as e:
|
||
logger.error(f"创建PSD文件时出错: {str(e)}")
|
||
logger.exception(e)
|
||
return ""
|
||
|
||
if __name__ == "__main__":
|
||
# 简单测试
|
||
from sys import argv
|
||
|
||
if len(argv) >= 3:
|
||
# 从命令行接收参数
|
||
layers = argv[1:-1]
|
||
output = argv[-1]
|
||
result = export_to_psd(layers, output)
|
||
if result:
|
||
print(f"PSD文件已成功导出到: {result}")
|
||
else:
|
||
print("PSD文件导出失败")
|
||
else:
|
||
print("用法: python export_psd.py layer1.png layer2.png ... output.psd")
|
||
print(f"默认输入目录: {DEFAULT_INPUT_DIR}")
|
||
print(f"默认输出目录: {DEFAULT_OUTPUT_DIR}")
|
||
print("注意:如果只提供文件名,将从默认输入目录查找图片文件") |