« 2012年12月 | メイン | 2013年12月 »

●WindowsでのPhotoshop自動操作覚え書き

2013年5月 9日    

今までMacを仕事の環境にしていたためMacOS関連の情報が多かったのですが
Windows環境で作業することになったので
今までと同じことをするために調べたことを覚書も兼ねてまとめておきます


私は3DソフトとPhotoshop等のソフトを連携させて動画を作る仕事をしています
そのため
・3Dソフトで作成したムービーをその場で確認
・3Dソフトからスクリプトを動かしてPhotoshopからテクスチャ等のデータを読み込み
といった処理が頻繁に発生するため自動化をしていました

MacOSXではシェルやAppleScriptといった自動処理のための機能を使っていましたが
WindowsでもWSHとVBScriptで同様のことができるようです
3Dソフトのスクリプト(Python)から上記の操作をする方法を考えます
以下ではマイドキュメントのファイルパスは C:\Users\yukimi\Documents\ として解説します。

まずは3Dソフトでレンダリングが終わったら自動的にムービーを再生する方法を考えます
MacOSXでは3Dソフトからシェルに対してコマンドを打ってたので同様の方法をとります

たとえば マイドキュメントに aaa.avi がある場合コマンドプロンプトで
"C:\Program Files (x86)\Windows Media Player\wmplayer.exe" "C:\Users\yukimi\Documents\aaa.avi"
というように打てばメディアプレーヤーで指定した動画を再生できるようです

同様のコマンドをPythonから実行するためにsubprocessモジュールを使用した例がこうなります
(Pythonではファイルパスの表記の仕方が異なるのに注意)

import subprocess,os

#動画再生ソフトのパス
Prayer_path = "C:/Program Files (x86)/Windows Media Player/wmplayer.exe"
f_path = "C:/Users/yukimi/Documents/aaa.avi"

#ファイルパスをWindows形式に
f_path_w = os.path.normcase(f_path)
args = "\"" + Prayer_path + "\" " + f_path_w
subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)


subprocess.Popen()のオプションを設定して実行することにより戻り値を待たずに実行できます
一方 別のソフトの戻り値を待ちたい場合は subprocess.call() を使うことになります
(subprocess.call()ってムービーを再生させると戻り値を待って 再生中のウィンドウを閉じるまでスクリプトが止まることになります)

さて、2つ目のPhotoshopを操作する方法ですが
Windows上では Photoshopを操作できるスクリプトはVBScriptとjavascriptが利用できます
いずれもテキストエディッタで書いてファイルを実行するだけで操作でき、
また、VBScriptの場合 コマンドプロンプト上で
"C:\Users\yukimi\Documents\aaa.vbs"
といった具合にスクリプトのファイルパスを入力するだけでPhotoshopを操作できます

javascriptを使ったスクリプトも同様にコマンドプロンプトからも実行できるのですが
実行時に常に警告のダイアログが出るようになっているようです
VBScriptで書き直せば警告が出ないのですが、今回は
短いVBScriptを経由してjavascriptを実行することにしました

Photoshpで新規レイヤを作るスクリプト以下に書きます
中継用のVBScriptをVB_Hub.vbs
Photoshopを操作するためのスクリプトをtest.jsx
マイドキュメントに保存してあるものとします。

VB_Hub.vbs

Option Explicit
'コマンドライン引数の取得
Dim oParam
Set oParam = WScript.Arguments
'実行するアプリケーションとしてPhotoshopを指定
Dim objApp
Set objApp = CreateObject("Photoshop.Application")
''スクリプトの実行
objApp.DoJavaScriptFile oParam(0)


test.jsx

#target photoshop
var active_doc = activeDocument
//レイヤの作成
active_doc.artLayers.add()


python

import subprocess,os
#マイドキュメントのパス
mydoc_path = "C:/Users/moonstone/Documents/"
#実行するjavascriptのファイル名
jscript = "test.jsx"
#ファイルパスを実行するOSの形式で取得
jscript_path = os.path.normcase( os.path.join(mydoc_path,jscript) )
VB_Hub = os.path.normcase( os.path.join(mydoc_path,"VB_Hub.vbs") )
#VBScript経由でjavascriptを実行
subprocess.call("CScript \"" + VB_Hub + "\" \"" + jscript_path +"\" //nologo")

3Dソフトのスクリプトから中継になるVBScriptにjavascriptのファイルパスを引数として渡して
Photoshopを操作という形になっています。
Photoshopを自動操作するためのスクリプトはjavascriptで書けばWin・Mac両方で同じものが使えます。
中継用のソフトウェアをこうやって書いておけば指定するファイル名を変更するだけで
色々な機能を実行できるような構造になっているわけです

逆に戻り値をjavascriptからVBScript経由で実行元のソフトに戻す方法もあるようですが
ここでは割愛します。

いかがでしょうか?