- 使用 Adobe 官方的
photoshop-python-api(推荐):这是最现代、最强大、最稳定的方法,它通过 Photoshop 的 ExtendScript (JavaScript) 引擎来执行操作,但为你提供了 Pythonic 的接口。 - 使用
comtypes库 (传统方法):这种方法通过 Windows 的 COM (Component Object Model) 接口直接调用 Photoshop 的原生对象模型,它更底层,功能强大,但设置复杂且仅限于 Windows。
下面我将详细介绍这两种方法,并提供代码示例。
使用 Adobe 官方 API (推荐)
这是 Adobe 官方支持的 Python API,跨平台(Windows, macOS),并且与 Photoshop 的更新保持同步。
安装
你需要安装这个库,打开你的终端或命令提示符,运行:
pip install photoshop-python-api
基本使用示例
这个库的核心思想是让你用 Python 的语法来编写和执行 Photoshop 的 ExtendScript (JS) 代码,它会自动处理底层的通信。
示例 1:打开一张图片
from photoshop import Session
# 创建一个 Photoshop 会话
# app 是 Photoshop 应用程序对象
# psd 是当前活动的文档对象
with Session(action="open", path=r"C:\path\to\your\image.jpg") as ps:
# 获取当前活动的文档
doc = ps.app.activeDocument
# 打印一些文档信息
print(f"文档名称: {doc.name}")
print(f"宽度: {doc.width} 像素")
print(f"高度: {doc.height} 像素")
# 执行一个简单的操作:反相颜色
# 使用 ps.eval() 来执行 ExtendScript 代码
ps.eval("app.activeDocument.activeLayer.invert();")
# 保存修改后的图片
save_options = ps.SaveOptions(saveAs=True, extention="jpg")
doc.saveAs(r"C:\path\to\your\output_image.jpg", save_options, asCopy=True)
# 关闭文档(不保存,因为我们已经另存为)
doc.close(SaveOptions.DONOTSAVECHANGES)
print("操作完成!")
示例 2:创建一个新文档并添加文字
from photoshop import Session
with Session() as ps:
app = ps.app
# 创建一个新的 800x600 像素的文档,72dpi,RGB 颜色模式
new_doc = app.documents.add(800, 600, 72, "My New Python Doc")
# 创建一个新的文字图层
text_item = new_doc.artLayers.add()
text_item.kind = app.LayerKind.TEXT # 设置为文字图层
# 获取文字内容并编辑
text_descriptor = text_item.textItem
text_descriptor.contents = "Hello from Python!"
# 设置文字样式
text_descriptor.color = ps.SolidColor() # 创建一个颜色对象
text_descriptor.color.rgb.red = 255
text_descriptor.color.rgb.green = 0
text_descriptor.color.rgb.blue = 0
# 设置字体和大小
text_descriptor.font = "Arial"
text_descriptor.size = 72
# 保存 PSD 文件
new_doc.saveAs(r"C:\path\to\your\output_text.psd")
# 关闭文档
new_doc.close(SaveOptions.DONOTSAVECHANGES)
print("文字图层创建完成!")
如何学习使用这个 API?
Adobe 的官方文档是最好的学习资源,你可以在这里找到所有可用的方法和属性:
最强大的技巧是使用 Photoshop 自带的 ExtendScript Toolkit。
- 打开 ExtendScript Toolkit (通常在 Photoshop 的安装目录下可以找到)。
- 在工具包中,你可以编写和调试 ExtendScript (JavaScript) 代码。
- 选中一个对象(如
app.activeDocument),然后点击 "包" (Bundle) 按钮,它会为你生成该对象所有可用方法和属性的列表。 - 将这些 JS 代码转换成 Python 语法即可。
- JS:
app.activeDocument.activeLayer.invert(); - Python:
ps.eval("app.activeDocument.activeLayer.invert();")或者更高级的用法ps.app.activeDocument.activeLayer.invert()。
- JS:
使用 comtypes 库 (仅限 Windows)
这种方法更直接,它直接与 Photoshop 的 COM 对象交互,性能可能更好,但设置复杂且不跨平台。
安装和设置
- 安装
comtypes:pip install comtypes
- 生成类型库: 这是关键一步,你需要让
comtypes了解 Photoshop 的 COM 接口结构。- 打开 PowerShell 或命令提示符(以管理员身份运行)。
- 导航到你的 Photoshop 安装目录下的
Adobe Photoshop [版本号]\Plug-ins\Automation\COM文件夹。 - 运行以下命令(请根据你的 Photoshop 版本调整文件名):
python -m comtypes.client -g -p "Photoshop.Application"
- 这会在你的 Python 安装目录的
comtypes\gen文件夹下生成一个Photoshop.py文件,这个文件定义了所有可用的 COM 接口。
基本使用示例
示例 1:打开图片并获取信息
import comtypes.client
# 初始化 Photoshop COM 对象
# 确保你的 Photoshop 已经打开
ps_app = comtypes.client.CreateObject("Photoshop.Application")
# 打开一个文档
doc_path = r"C:\path\to\your\image.jpg"
ps_app.Open(doc_path)
# 获取活动文档
doc = ps_app.ActiveDocument
# 打印信息
print(f"文档名称: {doc.Name}")
print(f"宽度: {doc.Width} 像素")
print(f"高度: {doc.Height} 像素")
# 执行一个操作:反相颜色
doc.ActiveLayer.Invert()
# 另存为
jpg_save_options = comtypes.client.CreateObject("Photoshop.JPEGSaveOptions")
jpg_save_options.EmbedColorProfile = True
jpg_save_options.Quality = 12 # 1-12
doc.SaveAs(r"C:\path\to\your\output_image.jpg", jpg_save_options, asCopy=True)
# 关闭文档,不保存
doc.Close(2) # 2 = ps.PsSaveOptions.psDoNotSaveChanges
print("操作完成!")
示例 2:创建新文档
import comtypes.client
ps_app = comtypes.client.CreateObject("Photoshop.Application")
# 创建新文档
# ps_app.Documents.Add(宽度, 高度, 分辨率, 名称, 颜色模式, 初填充)
new_doc = ps_app.Documents.Add(
800,
600,
72,
"My COM Created Doc",
1 # 1 = ps.NewDocumentMode.psRGB
)
# 创建文字图层
text_layer = new_doc.ArtLayers.Add()
text_layer.Kind = 2 # 2 = ps.ArtLayerType.psTextLayer
# 编辑文字
text_item = text_layer.TextItem
text_item.Contents = "Hello from COM!"
# 保存 PSD
psd_save_options = comtypes.client.CreateObject("Photoshop.PhotoshopSaveOptions")
new_doc.SaveAs(r"C:\path\to\your\output_text.psd", psd_save_options)
# 关闭
new_doc.Close(2)
print("COM 文字图层创建完成!")
如何学习使用 comtypes?
- Adobe 的 COM 文档: Adobe 提供了详细的 COM SDK 文档,列出了所有对象、方法和常量,你需要在网上搜索 "Adobe Photoshop COM SDK"。
- 常量: 在代码中,数字(如
2代表文字图层)是 COM 常量,在comtypes生成的Photoshop.py文件中,这些常量通常被定义好了,你可以直接导入使用,from comtypes.gen import Photoshop as ps,然后使用ps.psTextLayer。
总结与对比
| 特性 | photoshop-python-api (推荐) |
comtypes (传统) |
|---|---|---|
| 官方支持 | 是,Adobe 官方维护 | 否,社区驱动 |
| 跨平台 | 是 (Windows, macOS) | 否 (仅 Windows) |
| 易用性 | 高,Pythonic 语法,自动处理通信 | 低,需要手动生成类型库,语法更接近 COM |
| 稳定性 | 高,与 Photoshop 版本更新同步 | 中等,可能因 Photoshop 版本更新而失效 |
| 性能 | 良好 | 理论上可能更好(直接调用 COM) |
| 学习曲线 | 较低(有官方文档和 ExtendScript Toolkit 辅助) | 较高(需要理解 COM 和 Adobe COM SDK) |
对于绝大多数用户和项目,强烈推荐使用 photoshop-python-api,它更易于安装、使用和维护,并且有官方支持作为后盾,只有在有特殊性能需求,或者你非常熟悉 Windows COM 编程,并且项目仅限于 Windows 环境时,才考虑使用 comtypes。
