You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python生成可被Photoshop识别为分层的多层TIFF?

我懂你遇到的问题了——想把多张图堆叠成Photoshop能识别为独立图层的TIFF,但普通多页TIFF和用Pillow默认方法保存的文件,在PS里只能看到单个图层对吧?这是因为常规多页TIFF不带Photoshop需要的图层元数据,PS只会把它当成单图层的分页文件,而不是分层图像。

给你两个实用的解决方案,看你需求选:

方案1:用psd-tools生成PSD(跨平台,无需Photoshop)

PSD是Photoshop原生格式,完美支持图层,我们可以先把图片做成PSD,之后在PS里导出为带图层的TIFF就行,步骤很简单:

首先安装依赖:

pip install psd-tools[all]

然后用下面的代码生成带图层的PSD:

from psd_tools import PSDImage, Layer
from PIL import Image
import glob

# 遍历所有图片文件
file_list = glob.glob("photos/*")
psd_layers = []

for img_path in file_list:
    # 打开图片并转成RGB格式(PSD对RGB支持最好)
    img = Image.open(img_path).convert("RGB")
    # 把PIL图片转成PSD图层
    layer = Layer.frompil(img)
    # 给图层命名,方便在PS里识别
    layer.name = img_path.split("/")[-1]
    psd_layers.append(layer)

# 创建新的PSD文档,尺寸用第一张图的大小,背景设为白色(可按需调整)
psd = PSDImage.new(psd_layers[0].size, color=(255, 255, 255))
# 添加所有图层到PSD
for layer in psd_layers:
    psd.append(layer)

# 保存PSD文件
psd.save("layered_image.psd")

print("PSD文件已生成!打开后直接在PS里选「文件-存储为」,格式选TIFF,勾选「保留图层」就能导出带图层的TIFF了")

方案2:用Python调用Photoshop API直接生成带图层的TIFF(仅Windows,需安装PS)

如果需要完全自动化,不想手动转格式,且你用的是Windows系统、安装了Photoshop,可以用pywin32调用PS的COM接口来直接生成带图层的TIFF:

先安装依赖:

pip install pywin32

然后运行这段代码:

import win32com.client
import glob

# 启动Photoshop应用
ps_app = win32com.client.Dispatch("Photoshop.Application")
ps_app.Visible = True  # 让PS窗口显示出来,方便查看过程

# 获取第一张图片的尺寸,作为新文档的大小
first_img_path = glob.glob("photos/*")[0]
temp_doc = ps_app.Open(first_img_path)
new_doc = ps_app.Documents.Add(temp_doc.Width, temp_doc.Height, temp_doc.Resolution, "Layered TIFF")
temp_doc.Close()

# 逐个将图片添加为图层
for img_path in glob.glob("photos/*"):
    # 打开图片文档
    img_doc = ps_app.Open(img_path)
    # 复制当前图层到新文档
    img_doc.ActiveLayer.Copy()
    new_doc.Paste()
    # 给图层命名
    new_doc.ActiveLayer.Name = img_path.split("\\")[-1]  # Windows路径用反斜杠分割
    img_doc.Close()

# 设置TIFF保存选项,开启保留图层功能
save_options = win32com.client.Dispatch("Photoshop.TiffSaveOptions")
save_options.Layers = True
save_options.EmbedColorProfile = True

# 保存带图层的TIFF
new_doc.SaveAs("test_layered.tiff", save_options)
new_doc.Close()

print("带图层的TIFF已直接生成完成!")

为啥之前的方法不行?

你之前用Pillow保存的多页TIFF,本质是把图片按顺序存成TIFF的不同页码,但Photoshop不会把页码识别成图层——它需要的是带有Photoshop图层元数据的特殊TIFF结构,而Pillow默认不支持写入这种元数据,所以只能看到单个图层。

内容的提问来源于stack exchange,提问作者Vkitor

火山引擎 最新活动