2016年11月10日木曜日

BlenderからPhotoshopを制御2-レンダリングした画像をPhotoshpで開く


前回はBlenderのPythonからJavaScriptを実行しましたが
今回はさらにPhotoshopにデータを受け渡すことを考えます。

Blenderのレンダリング画像を保存して、引数で保存した画像のファイルパスを渡しPhotoshopで開くものとします
今回もスクリプト等はデスクトップに置きます

VBHubに受け取った引数をそのままJavaScriptに受け渡す処理を追加します
VB_Hub.vbs
Option Explicit
'コマンドライン引数の取得
Dim oParam
Set oParam = WScript.Arguments
'Photoshopを指定
Dim objApp
Set objApp = CreateObject("Photoshop.Application")
Dim arg_count
arg_count = oParam.Count -1 

If arg_count = 0 Then
    '追加の引数がない場合
    objApp.DoJavaScriptFile oParam(0)
Else
    Dim id
 '引数をjavascriptに渡すための配列
    Dim ArgArray()
 ReDim ArgArray(arg_count - 1  )
    '第一引数がスクリプトのパスのため取り除く
    For id = 0 To arg_count - 1
        ArgArray(id) = oParam(id + 1)
    Next
    ''スクリプトの実行
    objApp.DoJavaScriptFile oParam(0),ArgArray
End If
VBscriptのWScript.Argumentsで引数を配列の形で受け取ります
配列の最初の項目はJavaScriptのパスになるので それ以降をJavaScriptに渡しています


次にJavaScriptです

Photoshopで画像を開くだけなら 実はJavaScriptを使わなくてもいいので
開いた画像を今開いている書類に複製する処理にします。
var active_doc = app.activeDocument
//引数で指定したドキュメントを開いて現在のPSDに複製
if (arguments.length > 0){
    var img_file =  File(arguments[0])
    var img = app.open( img_file );
    img.artLayers[0].duplicate(active_doc)
    img.close()
    }
引数で設定された値は arguments で受け取ることができ、
配列形式で値を取り出すことができます
ここではarguments[0]でファイルパスを受け取り 画像を開くし処理をしています

最後にBlenderのスクリプト
import bpy
import os
import subprocess

#デスクトップフォルダのパス
desktop_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Desktop"
#実行するjavascriptのファイル名
js_name = "img_open.jsx"
#ファイルパスを実行するOSの形式で取得
js_path = os.path.normcase( os.path.join(desktop_path, js_name) )
VB_Hub = os.path.normcase( os.path.join(desktop_path, "VB_Hub.vbs") )
#画像を保存するパス
img_path  = os.path.join(desktop_path, "render_img.png")
#レンダリング画像を保存
bpy.data.images['Render Result'].save_render( filepath= img_path)
#VBScript経由でjavascriptを実行
subprocess.call([ "CScript",VB_Hub, js_path, img_path, "//nologo" ])
レンダリング画像をデスクトップに保存して JavaScriptのパスといっしょに保存したファイルのパスを渡しています。

実行前にPhotoshopには適当な書類を開いて置き Blenderでレンダリングで画像を生成しておいてください
スクリプトの実行で Potoshopにレンダリング画像がレイヤーとして読み込まれたでしょうか?

ここまでは説明のためにシンプルな動作のものを作成しましたが
次は実用的なようにBlenderのアドオンにしたものを紹介したいと思います

0 件のコメント:

コメントを投稿