オープンソースのSFPSDWriterを呼び出して、レイヤー分けしたPhotoshopデータを作成するAppleScriptです。
SFPSDWriterは基本的にCGImageを与えてPSDを作成するプログラムですが、AppleScriptからはCGImageを作れません。
SFPSDWriterのソースコードを読んでみたら、コメントにNSImageからCGImageへの変換方法が書かれていたので、NSImageを受け付けるメソッドを新規追加してAppleScriptから呼べるようにしてみました。
–> Download SFPSDWriter.framework(To ~/Library/Frameworks)
PSDを読み書きするObjective-Cのプログラムは割とすぐに見つかるのですが、AppleScriptから呼べない(CGImageをパラメータにするため)ものが多く、どれか1つぐらいは使えてほしいと思っていました。
SFPSDWriterの機能はすべて試せていませんが、名前どおり本ソフトはPSDファイルを書き込む専用であって、読むためのものではありません。これ以外にPSDファイルを読み込んでオブジェクトを取り出せる(ように改造できる)ものを探しておきたいところです。Photoshopを用いないでPSDデータにアクセスできることには価値があります。Mac App Storeに出すソフトウェアだととくにそうです。
Photoshopを操作してほぼ同様の処理を行うものを書いてみましたが、SFPSDWriterを用いて処理したほうがシンプルなことに驚きます。
AppleScript名:SFPSDWriterのじっけん |
— Created 2016-03-12 by Takaaki Naganoya — Modified 2019-02-27 by Takaaki Naganoya — 2019 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" use framework "SFPSDWriter" –https://github.com/shinyfrog/SFPSDWriter property |NSURL| : a reference to current application’s |NSURL| property NSString : a reference to current application’s NSString property NSImage : a reference to current application’s NSImage property SFPSDWriter : a reference to current application’s SFPSDWriter property NSWorkspace : a reference to current application’s NSWorkspace property SFPSDResolutionUnitPPI : 1 property SFPSDResolutionUnitPPC : 2 set layer1 to NSImage’s alloc()’s initWithContentsOfURL:(|NSURL|’s fileURLWithPath:(POSIX path of (choose file of type {"public.png"}))) set layer2 to NSImage’s alloc()’s initWithContentsOfURL:(|NSURL|’s fileURLWithPath:(POSIX path of (choose file of type {"public.png"}))) set anWriter to SFPSDWriter’s alloc()’s initWithDocumentSize:(current application’s CGSizeMake(1024, 400)) andResolution:72.0 andResolutionUnit:(SFPSDResolutionUnitPPI) anWriter’s addLayerWithNSImage:layer1 andName:"Layer_01" andOpacity:1.0 andOffset:{x:0.0, y:0.0} anWriter’s addLayerWithNSImage:layer2 andName:"Layer_02" andOpacity:1.0 andOffset:{x:50.0, y:50.0} set aPSD to anWriter’s createPSDData() set pathString to NSString’s stringWithString:"~/Desktop/output.psd" set newPath to pathString’s stringByExpandingTildeInPath() aPSD’s writeToFile:newPath atomically:true –Open with Adobe Photoshop NSWorkspace’s sharedWorkspace()’s openFile:newPath |
AppleScript名:PhotoshopでSFPSDWriterと同じような処理を行う |
— Created 2019-02-27 by Takaaki Naganoya — 2019 Piyomaru Software set layer1 to (choose file of type {"public.png"}) as string set layer2 to (choose file of type {"public.png"}) as string tell application id "com.adobe.photoshop" activate close every document saving no set aDoc to make new document with properties {height:900, width:900, resolution:72.0, mode:RGB, bits per channel:eight, initial fill:transparent, color profile kind:none, pixel aspect ratio:1.0} tell aDoc set origLayer to (first item of (name of every art layer)) as string end tell open file layer1 set bDoc to a reference to current document tell bDoc select all copy close without saving end tell tell aDoc set artLayerRef to make new art layer with properties {name:"Layer_01"} set current layer to artLayerRef tell artLayerRef paste end tell end tell open file layer2 set cDoc to a reference to current document tell cDoc select all copy close without saving end tell tell aDoc set artLayerRef to make new art layer with properties {name:"Layer_02"} set current layer to artLayerRef tell artLayerRef paste end tell delete art layer origLayer end tell end tell |