Photoshop + Python 釋放你的雙手來點自動化設計??

附件詳細資料 Python_Photoshop_automation_intro_feature_picture

前言:

先給大家一個背景知識,要把設計工具或是其他已經安裝好的Windows應用程式做成自動化,這樣的流程中文俗稱 二次開發、英文稱為 Automation。用對關鍵字,才能找到對的文章。

二次開發:

根據以前做二次開發的經驗,不外乎幾個方向,一個是透過COM的方法,直接在系統中控制其它的作業程式。另一種方向就是透過軟體本身自帶的API來呼叫功能。最後一種就是軟體裡面自帶Script 編輯器。

但大部分的軟體,有開放做二次開發自動化的,通常都是開放幾種語言格式,然後讓USER透過COM的方法,直接呼叫應用程式。

COM基本概論:


什麼是COM(Component Object Model).
COM,在幾年前幾乎就已經微軟對於所開發軟體使用的一種標準,COM的前身其實就是微軟在1993年推出的OLE2,OLE(Object Linking and Embeded)物件的連結與崁入,是早期的一種復合式文件技術,能單一的物件內崁連結另一份文件的技術,這已經是一種物件間連結溝通的一種協定的技術,當時有人稱為OLE Control,ActiveX,因為增早期對這些名詞的制定過於寬鬆,加上許多人很難區分出什麼是OLE什麼是ActiveX,其實它們指的都是以COM為基礎的技術。

COM是建構軟體的一種標準,在Win32下是行程與行程間溝通的一種基準,一種協定,COM是一種以物件導向(OOP)為基礎,是一個以二進位重複使用(Binary Reuse)為基礎的架構,這意味著COM不但發揮OOP的長處,二進位重複使用使COM並不需要任何原始程式碼就可重複使用,所以只要是支援COM的程式它們只要了解介面即可相互溝通不需寮解對方的實作以及使用何種程式語言。

喔,看完上面的說明,我相信你已經超載,沒關係,會應用就好。

先來一個Win32 COM的控制示範吧

import win32com.client
import os

psApp = win32com.client.Dispatch("Photoshop.Application")

執行上方的指令,windows就會開啟Photoshop,這就是com的控制方法。聰明如你,應該想到了,是不是可以把Photoshop換成其他程式呢? 答案是可以的。只是進一步的應用,要呼叫的function,還是要看原本的程式有沒有提供。

但等等我們要用另一個方法,也就是仿間Python的Package來控制PS,是透過Photoshop Python API 來調用功能。

Adobe Photoshop Script 官方文件:

在開始之前,你要拜讀的是這個文檔,因為這是Adobe Photoshop官方Script文件

https://www.adobe.com/content/dam/acom/en/devnet/photoshop/pdfs/photoshop-scripting-guide-2020.pdf

可以清楚的了解,官方提供了三種語言格式: Visual Basic(VB) 、Java Script(JS)、AppleScript(AS)

整合Python:

而我們要做的事情,是透過Python去控制Photoshop,什麼? 你問為什麼要這樣做?

因為我們其他的應用已經都寫在Python上了,所以要一氣呵成只能把Photoshop自動化透過Python來控制。 雖然到了 2020年了,官方還是沒有提供 Python ,這次我們使用的是在Github找的套件,寫成Photosohp Python用的API package。

總之我們要先在終端機安裝以下的套件

pip install photoshop_python_api

檔案很小,一下子就跑完了。

先來測試一下吧

import photoshop.api as ps
app = ps.Application()
doc = app.documents.add()
new_doc = doc.artLayers.add()
new_text_layer = new_doc
new_text_layer.kind = ps.LayerKind.TextLayer
new_text_layer.textItem.contents = 'Python Photoshop, 釋放雙手 NOW!'
new_text_layer.textItem.position = [160, 167]
new_text_layer.textItem.size = 72
options = ps.JPEGSaveOptions(quality=5)
# # save to jpg
jpg = 'e:/freehand.jpg'
doc.saveAs(jpg, options, asCopy=True)
app.doJavaScript(f'alert("save to jpg: {jpg}")')

python打開了Photoshop,開了一個文件,新增了一個文字圖層,上面寫 Python Photoshop, 釋放雙手 NOW! 並存檔到了E槽。

成功把Python 與 Photoshop 串起來了!!  

來個小範例 – 新增文字圖層 / 物件:

接下來會帶大家怎麼看文件,如何使用裡面的語法,如下圖,以新增一個文字物件為例。

Python 的語法與 JavaScript (JS) 是最接近的,因此我們來看一下文件裡面怎麼新增一個文字圖層。

JS

var newLayerRef = docRef.artLayers.add()
newLayerRef.kind = LayerKind.TEXT

Python

new_doc = doc.artLayers.add()
new_text_layer = new_doc
new_text_layer.kind = ps.LayerKind.TextLayer

比對一下是不是很接近阿,如此一來,其他的功能就可以參考文件依樣畫葫蘆。

規劃自動化流程:

接著我們就可以開始規劃自動化的流程

a. 先手動自己在Photoshop操作過一次圖片的編輯

b. 把手動的過程,鉅細靡遺的把步驟記錄下來。

c. 查找Adobe官方Scripting Guide文件,把手動過程會用到的步驟,都查找一輪。看看這些步驟的語法,在JS格式裡面是怎麼呼叫的。

d. 轉譯成Python格式,而且必須要一個功能一個功能測試,因為python對Photoshop來說是非原生工具,透過這套件,有可能沒法完整呈現或是有BUG也是有可能的。

結論:

根據以上的兩個方法,相信大家已經能用Python初步開始控制Photoshop做點事情了。期待官方能夠釋出Adobe 官方Python 的串接功能,才能保證軟體的穩定性。若以穩定性來說,COM的控制方法 > Python Phtoshop API

 未來有時間會持續撰寫相關的文章,與大家分享控制的過程或是專案實作心得。

參考:

https://github.com/loonghao/photoshop-python-api

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *