クリップボードに入れた画像を、グレースケール化したあとに指定の色のベタ塗り画像とフィルタで合成し、単色の色付き画像に変換するAppleScriptです。
資料に掲載する画像の情報量を減らすために、単色画像に変換したいと考えました。Photoshopだと2つのレイヤーの重ね合わせで指定して処理するような内容です。ただ、もうPhotoshopにできるぐらいのことの大部分は、AppleScriptだけで単独でできてしまうのが2022年的な状況です。
アプリケーションを使わずに処理するためには、CIFilterを用いて画像処理して、単色画像にすることになります。
CIFilterにもいろいろな画像フィルタ機能が用意されているわけで、ここから「どのフィルタを使うか」選ぶことになります。
# フィルタが200種類ぐらいあるんですけど!!
このような場合のために、FileMaker Proで作った「FileMaker Pro PowerPack」だとひととおりのCIFilterをサンプルデータで処理できるようにしておきました。
FileMaker Proのデータベース上にサンプルデータをコピー&ペーストしておけば、DB上でフィルタ処理してどのような処理をしてくれるかがわかります。
いやーー、作っておいてよかったー。「なんでこんなにフィルタ処理ばっかりあるんだよ!」的な話がありましたが、こうして実際に役立つわけで。フィルタの名称、編集できるテストデータ、処理結果が表示されるところまで……「動かせる資料」的なものに仕上がっています>FileMaker Pro PowerPack
ひととおりAppleScriptを作ってみて、いろいろ調整してみたところ……調整し切れなかったので、edama2さんに相談して(送りつけて)こんな感じに仕上がりました。
これでなんとか動くはずなのに、なぜこうなるのか。。。CIFilterを実際に日常的に使うツールで使ったのは実はこれが最初だったので、意外な挙動に割と困りました。
▲画面上の指定範囲のスクリーンショットを撮ってクリップボードへ
▲ScriptをmacOS標準搭載のスクリプトメニューから呼び出すことを前提に作った。
▲クリップボードの内容をペーストすると、単色化された画像が出力される
AppleScript名:クリップボードの画像を指定色でモノクロ化してクリップボードへ v3.scpt |
— – Created by: Takaaki Naganoya – Created on: 2022/03/11 — – Copyright © 2022 Piyomaru Software, All Rights Reserved – v2 Takaaki Naganoya : マスクが1/4の大きさになったり2倍になったりしていた – v3 edama2:上記の問題に対処。クリーンナップ — use AppleScript version "2.7" use framework "AppKit" use framework "CoreImage" use framework "Foundation" use scripting additions on run my main() end run on main() –クリップボード内のデータをNSImageとして取得 set sourceImg to my getClipboardASImage() # 色指定 set aColor to my makeNSColorFromRGBA255val(252, 2, 128, 255) # 同じ大きさの塗りつぶし画像を作成 tell current application’s NSImage’s alloc() tell initWithSize_(sourceImg’s |size|()) lockFocus() aColor’s |set|() set aRect to current application’s NSMakeRect(0, 0, its |size|()’s width, its |size|()’s height) current application’s NSBezierPath’s fillRect:aRect unlockFocus() set fillImg to it end tell end tell # NSImage –> CIimage set sourceImage to my convNSImageToCIimage(sourceImg) set fillImage to my convNSImageToCIimage(fillImg) set newImage to my filterImage2(fillImage, sourceImage) my restoreClipboard({newImage}) end main on filterImage2(fillImage, sourceImage) set redValue to 0.295719844358 set greenValue to 0.295719844358 set blueValue to 0.295719844358 set alphaVlaue to 1.0 set aCIColor to current application’s CIColor’s alloc()’s initWithRed:redValue green:greenValue blue:blueValue alpha:alphaVlaue tell current application’s CIFilter — CIFilter(モノクロ化) tell filterWithName_("CIColorMonochrome") setDefaults() setValue_forKey_(sourceImage, "inputImage") setValue_forKey_(aCIColor, "inputColor") set filteredImage to valueForKey_("outputImage") end tell — CIFilter(モノクロ化) tell filterWithName_("CIAdditionCompositing") setDefaults() setValue_forKey_(fillImage, "inputImage") setValue_forKey_(filteredImage, "inputBackgroundImage") set theCIImage to valueForKey_(current application’s kCIOutputImageKey) end tell end tell # CIImage –> NSImage set imageRep to current application’s NSCIImageRep’s alloc()’s initWithCIImage:theCIImage set rNSImage to current application’s NSImage’s alloc()’s initWithSize:(imageRep’s |size|()) rNSImage’s addRepresentation:imageRep return rNSImage end filterImage2 # NSImage –> CIimage on convNSImageToCIimage(aNSImage) set tiffDat to aNSImage’s TIFFRepresentation() set aRep to current application’s NSBitmapImageRep’s imageRepWithData:tiffDat set newImg to current application’s CIImage’s alloc()’s initWithBitmapImageRep:aRep return newImg end convNSImageToCIimage — クリップボードの内容をNSImageとして取り出して返す on getClipboardASImage() set thePasteboard to current application’s NSPasteboard’s generalPasteboard() set theAttributedStringNSArray to thePasteboard’s readObjectsForClasses:({current application’s NSImage}) options:(missing value) set theNSImage to theAttributedStringNSArray’s objectAtIndex:0 return theNSImage end getClipboardASImage on restoreClipboard(theArray as list) set thePasteboard to current application’s NSPasteboard’s generalPasteboard() thePasteboard’s clearContents() thePasteboard’s writeObjects:theArray end restoreClipboard on makeNSColorFromRGBA255val(redValue as integer, greenValue as integer, blueValue as integer, alphaValue as integer) set aRedCocoa to (redValue / 255) as real set aGreenCocoa to (greenValue / 255) as real set aBlueCocoa to (blueValue / 255) as real set aAlphaCocoa to (alphaValue / 255) as real set aColor to current application’s NSColor’s colorWithCalibratedRed:aRedCocoa green:aGreenCocoa blue:aBlueCocoa alpha:aAlphaCocoa return aColor end makeNSColorFromRGBA255val |