杰瑞科技汇

Python真能直接打开Photoshop吗?怎么操作?

  1. 使用 Adobe 官方的 photoshop-python-api (推荐):这是最现代、最强大、最稳定的方法,它通过 Photoshop 的 ExtendScript (JavaScript) 引擎来执行操作,但为你提供了 Pythonic 的接口。
  2. 使用 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

  1. 打开 ExtendScript Toolkit (通常在 Photoshop 的安装目录下可以找到)。
  2. 在工具包中,你可以编写和调试 ExtendScript (JavaScript) 代码。
  3. 选中一个对象(如 app.activeDocument),然后点击 "包" (Bundle) 按钮,它会为你生成该对象所有可用方法和属性的列表。
  4. 将这些 JS 代码转换成 Python 语法即可。
    • JS: app.activeDocument.activeLayer.invert();
    • Python: ps.eval("app.activeDocument.activeLayer.invert();") 或者更高级的用法 ps.app.activeDocument.activeLayer.invert()

使用 comtypes 库 (仅限 Windows)

这种方法更直接,它直接与 Photoshop 的 COM 对象交互,性能可能更好,但设置复杂且不跨平台。

安装和设置

  1. 安装 comtypes:
    pip install comtypes
  2. 生成类型库: 这是关键一步,你需要让 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

分享:
扫描分享到社交APP
上一篇
下一篇