【Photoshop】PythonによるPhotoshop操作:追記

戦国三英傑に織田信長がいるのは、のちに資料となる『信長公記』を書いた太田牛一のおかげだと思っている。詳しい資料があることは昔も今も喜ばれますから。
どうも、クリーク・アンド・リバー社 COYOTE CG STUDIO テクニカルチーム 戦国大好き人間の中林です。

こちらはCGWORLD様のブログに寄稿した「TIPS07:【Photoshop】PythonによるPhotoshop操作」の補足内容になります。

5・Pythonを使うデメリットの1つを解決

デメリットの『5-2・複数のバージョンに弱い』が寄稿後に解決したのでこちらの方法を追記します。
これ自体は最初に調べるべきだったかもしれませんが、そんなに複数のPhotoshopをインストールしているアーティストは少ないだろうと後回しにしてました。
Pythonのツールをリリースしてから、意外と案件によって複数のPhotoshopを使うアーティストが多いと分かり対応方法を調べましたが、CGWORLD様のブログでは間に合わなかったのでこちらにて補足します。

win32comでのバージョン選択

これは「PhotoShop.Application」でバージョンを指定するのでcomtypesモジュールでも共通の解決方法です。
まずは僕が最初に失敗例です。

# 失敗例
import win32com.client
psapp = win32com.client.Dispatch('PhotoShop.Application')

こちらはPhotoshopが立ち上がっていると、特定のPhotoshop以外が立ち上がっているとしばらくするとエラーが発生します。Phtoshopが立ち上がってない時に実行して立ち上がったPhotoshopで実行するとエラーは発生しません。
しかし、このPhotoshopのバージョンはユーザーよってマチマチで正直、法則はつかめませんでした。
結局、Photoshop-Python-apiのソースを調べていたら「PhotoShop.Application」には以下の法則でバージョン番号が割り振られているのが分かりました。

file

仮にPhtoshop 2020が立ち上がっていたら「PhotoShop.Application」の後ろに「.140」のバージョン番号を付けるだけでスクリプトがエラーなく使用できます。

# 成功例
import win32com.client
psapp = win32com.client.Dispatch('PhotoShop.Application.140')
_psdOpt = win32com.client.Dispatch("Photoshop.PhotoshopSaveOptions.140") #Psdファイルオプションを呼び出す

psapp.ActiveDocument.Duplicate()

SaveOptionなどを使いたい場合は個別にバージョン番号を設定する必要があるので注意が必要です。

起動しているPhotoshopのバージョンさえ分かればどうとでもできます。バージョンは「psutil.process_iter」等を利用すれば割り出せます。

import psutil
_photVer = ''
for proc in psutil.process_iter():
    try:
        if 'Photoshop.exe' in proc.exe():
            _photVer = str(proc.exe())
            break
    except:
        pass
    else:
        messagebox.showerror(u'Photoshopチェック', u'Photoshopが起動してません')
print(_photVer)

バージョンさえ分かればその後はいくらでも調理は可能です。

Photoshop-Python-apiでのバージョン選択

Photoshop-Python-apiはバージョン設定は楽になってます。
一応、先ずは失敗例です。

import photoshop.api as psapi
psapp = psapi.Application()

こちらもPhotoshopが立ち上がっていると、特定のPhotoshop以外が立ち上がっているとしばらくするとエラーが発生します。
こちらのPhotoshopは対応している2017~2020の中で一番若いバージョンのPhotoshopが立ち上がります(多分)
こちらも仮にPhtoshop 2020が立ち上がっていた時の方法を書きます。

# 成功例
import photoshop.api as psapi
psapp = psapi.Application('2020')
psapp.ActiveDocument.Duplicate()

こちらは直感的で分かり易いですね。
ただし、公式でも書いてますが残念ながらこの記事を書いてる段階ではPhotoshop 2021には対応してません。
この辺は更新を待つか自力でファイルを調べて追記をする感じになります。

まとめ

今回のPhotoshopのバージョンに合わせて起動でJSXやCEPができることは概ねPythonで再現ができることが分かりました。
CGWORLD様のブログでは予防線を張って、まだ早いと書きましたが、それはブログを書き始めた当時の僕の知識量から判断です。
しかし、ブログに並行してPythonでPhotoshopツールを作成して色々と試した結果から言うと、普通にPython(多分他の言語)でもJSXにできることは再現できます。
PhotoshopのツールをPythonで作ることはJSXコマンドかVBSコマンドを知っていれば、もう遅いくらいかもしれません。慣れないJavaScriptで苦しんで作っている人は得意な言語で作るのを試してみましょう。
少なくとも僕はこのブログが書き終わったら、PythonだけでPhotoshopツールを作るんだ。

--------------------------------------------------------------------------------

COYOTE 3DCG STUDIO

公式HP:https://www.creativevillage.ne.jp/lp/coyote/

COYOTE 3DCG STUDIOはクリーク・アンド・リバー社が運営するゲーム専門3DCG制作集団です。
キャラモデル、背景モデル、3Dアニメーション、テクニカルアーティストによるツール開発などを得意としています。
新規立ち上げにおけるコンサルティングから量産制作まで幅広く対応可能な体制を保有しており、出向にも柔軟に対応しております。

--------------------------------------------------------------------------------

Author: nakabayashinobukazu