ai_service/scripts/export_psd.py
2025-07-05 04:24:43 +08:00

100 lines
3.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
测试文件从多个图片创建PSD文件
将图片列表作为输入从底到顶添加为PSD图层并将图片居中放置
"""
from psd_tools import PSDImage
from PIL import Image
from psd_tools.constants import Compression
import os
from typing import List, Tuple
# 导入PixelLayer类用于从PIL图像创建图层
from psd_tools.api.layers import PixelLayer
def create_psd_from_images(
image_paths: List[str],
output_path: str,
canvas_size: Tuple[int, int] = (1000, 800),
mode: str = 'RGB'
) -> None:
"""
从图片列表创建PSD文件将图片从底到顶堆叠
参数:
image_paths: 图片路径列表
output_path: 保存PSD文件的路径
canvas_size: PSD画布大小格式为(宽度, 高度)
mode: PSD文件的颜色模式
"""
# 确保输出目录存在
os.makedirs(os.path.dirname(os.path.abspath(output_path)), exist_ok=True)
try:
# 1. 创建一个新的PSD文件
psd = PSDImage.new(mode, canvas_size)
# 2. 打开并添加每个图片作为图层
for i, img_path in enumerate(image_paths):
# 打开图片
image = Image.open(img_path)
# 计算居中位置
left = (canvas_size[0] - image.width) // 2
top = (canvas_size[1] - image.height) // 2
# 根据图片文件名创建图层名称
layer_name = f"layer {i+1} - {os.path.basename(img_path)}"
# 创建并添加图层
layer = PixelLayer.frompil(image, psd, layer_name, top, left, Compression.RLE)
# 确保图层可见
layer.visible = True
psd.append(layer)
# 确保所有图层都是可见的
for layer in psd:
if not layer.visible:
print(f"图层 {layer.name} 不可见,正在设置为可见")
layer.visible = True
# 生成合成图像
composite_image = psd.composite(force=True)
# 更新PSD文件的图像数据
psd._record.image_data.set_data([channel.tobytes() for channel in composite_image.split()], psd._record.header)
# 3. 保存PSD文件
psd.save(output_path)
print(f"PSD文件已成功创建保存在: {output_path}")
# 4. 生成并保存预览
preview_path = os.path.splitext(output_path)[0] + "_预览.png"
composite_image.save(preview_path)
print(f"预览已保存在: {preview_path}")
# 5. 验证PSD文件结构
saved_psd = PSDImage.open(output_path)
print(f"PSD文件信息: {saved_psd}")
print(f"图层数量: {len(saved_psd)}")
for i, layer in enumerate(saved_psd):
print(f"图层 {i}: {layer.name}, 位置: ({layer.left}, {layer.top}), 大小: {layer.width}x{layer.height}")
except Exception as e:
print(f"创建PSD文件时出错: {e}")
if __name__ == "__main__":
# 示例用法
preassigned_img_list_path=[
"../outputs/background.png",
"../outputs/lotus.jpg",
"../outputs/nankai.png",
"../outputs/stamp.jpg"
]
create_psd_from_images(
image_paths=preassigned_img_list_path,
output_path='../outputs/combined_output.psd'
)