AppleScriptからPhotoshopのデータ(PSD)を出力するテストプログラムです。
AppleScriptにはPhotoshopのデータを書き出す関数や機能はとくに用意されていないため、Photoshopのデータを書くためにはPhotoshopにコマンドを送って実行してもらうのが定番です。
この定番の方法だと、Photoshopが存在しない環境でPhotoshopのデータを作ることができません。この問題を解決するためにはオープンソースで公開されている「Photoshopデータを書くプログラム部品」を呼び出すことになります。
Photoshopデータについては一定の需要があるためか、AdobeがPhotoshopデータ形式の詳細な資料を公開しているためか、Reader(読むプログラム)とWriter(書くプログラム)の2通りのプログラムが存在します。
■PSD Reader/Parser
PSD-Font-Reader
psdparse
■PSD Writer
FMPSD
PSDWriter
SFPSDWriter
ここでは、「SFPSDWriter」内に含まれる「SFPSDWriter」Frameworkを呼び出しています。
–> Download SFPSDWriter.framework(To ~/Library/Frameworks)
実行にあたっては、macOS 10.14以降ではScript Debuggerを用いるか、お使いのMacをSIP解除してScript Editor上で呼び出して実行する必要があります。
ちょっと書き換えるとXcode上でも呼び出せることでしょう。Mac App Storeに出すAppleScript Cocoaアプリケーション(Sandbox対応)内で利用する場合には、ファイル書き込みパスをユーザーに明示的に選択させる必要があるため、choose file nameダイアログでファイル名を入力・選択してもらうようにすべきです(デフォルト指定のファイル名をUUIDで自動生成するとか)。
本AppleScriptはKamenokoから書き出せるデータを増やすべく「Photoshop形式のデータを書けたらどうだろう?」と実験してみた残骸です。結局、PDFで書き出せるしPDFなら拡大縮小しても荒くなったりしないので、PDFのほうがいいという結論に。
Pixelmator Proのデータ形式とかPSD形式で書き出す実験は行っているのですが、処理結果を見るとどちらも「PDF形式のほうがいい」という結論に至っています。
▲ベクターデータではないので、拡大するとアラが見える
AppleScript名:SFPSDWriterのじっけん v2 |
— Created 2016-03-12 by Takaaki Naganoya — Modified 2019-02-27 by Takaaki Naganoya — Modified 2020–09-21 by Takaaki Naganoya — 2020 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 NSUUID : a reference to current application’s NSUUID 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 anWriter to (SFPSDWriter’s alloc()’s initWithDocumentSize:(current application’s CGSizeMake(1200, 400)) andResolution:72.0 andResolutionUnit:(SFPSDResolutionUnitPPI)) set aCount to 1 repeat with yPos from 0 to 400 by 110 repeat with xPos from 0 to 1024 by 110 set aImage to (current application’s NSImage’s alloc()’s initWithSize:{100, 100}) set aColor to current application’s NSColor’s redColor() my drawCircleOnNSIMage(aImage, 100, 0, 0, aColor) (anWriter’s addLayerWithNSImage:aImage andName:("Layer_" & aCount as string) andOpacity:1.0 andOffset:{x:(xPos as real), y:(yPos as real)}) set aCount to aCount + 1 end repeat end repeat set aPSD to anWriter’s createPSDData() set theName to NSUUID’s UUID()’s UUIDString() set pathString to NSString’s stringWithString:("~/Desktop/output_" & theName & ".psd") set newPath to pathString’s stringByExpandingTildeInPath() aPSD’s writeToFile:newPath atomically:true # MARK: Call By Reference on drawCircleOnNSIMage(aImage, aRadius, aXpos, aYpos, aColor) set aBezier to generateCircle(aRadius, aXpos, aYpos) of me (aImage)’s lockFocus() aColor’s |set|() aBezier’s fill() –ぬりつぶし (aImage)’s unlockFocus() end drawCircleOnNSIMage # MARK: circleのBezier曲線を作成して返す on generateCircle(theRadius, x, y) set aRect to current application’s NSMakeRect(x, y, theRadius, theRadius) set aCirCle to current application’s NSBezierPath’s bezierPath() aCirCle’s appendBezierPathWithOvalInRect:aRect return aCirCle end generateCircle |