指定画像の指定エリア(矩形)を透明色で塗りつぶすAppleScriptです。透明色で塗りつぶす=矩形で切り抜いたようなかっこうになります。
画像(NSImage)を指定色で塗りつぶすという処理はよく見かけるものですが、clearColor()(透明色)で塗りつぶすという処理を行うとどうなるかといえば…………何も起こりません。
透明色でNSImageを塗りつぶすという処理は、たいへんに「ありそう」な処理ですが、なかなか見つからない。
さんざん探し回ったのですが、自分には見つけられませんでした。ちょうどEdama2さんに相談してみたところ、こういう処理を探し出してもらえました(ありがとうございますー)。ただ、見つけてきた処理そのままでは思い通りの結果にならなかったので、修正が必要であったとのこと。
透明塗りつぶし(切り抜き)の指定座標はCocoaの座標系をそのまま利用しているので、左下が原点です。
NSBezierPathで切り抜き(透明色で塗りつぶし)できるといいのになーという感じではあります。
AppleScript名:画像の指定エリアを透明色塗りつぶし(矩形切り抜き) |
— Created 2017-11-19 by Takaaki Naganoya — Modified 2018-02-14 by Takaaki Naganoya — Modified 2020-02-03 by Edama2 & Takaaki Naganoya use AppleScript version "2.5" use scripting additions use framework "Foundation" use framework "AppKit" property NSUUID : a reference to current application’s NSUUID property NSColor : a reference to current application’s NSColor property NSString : a reference to current application’s NSString property NSImage : a reference to current application’s NSImage property NSScreen : a reference to current application’s NSScreen property NSBezierPath : a reference to current application’s NSBezierPath property NSPNGFileType : a reference to current application’s NSPNGFileType property NSCompositeClear : a reference to current application’s NSCompositeClear property NSBitmapImageRep : a reference to current application’s NSBitmapImageRep –切り抜きエリア(複数) set drawList to {{origin:{x:0, y:0}, |size|:{width:200, height:100}}, {origin:{x:100, y:100}, |size|:{width:50, height:50}}} set imgPath to POSIX path of (choose file of type {"public.image"}) set anImage to NSImage’s alloc()’s initWithContentsOfFile:imgPath set fillColor to (NSColor’s colorWithCalibratedRed:1.0 green:0.0 blue:0.0 alpha:0.9) –透明色塗りつぶし処理呼び出し set resImage to drawImageWithClearColorFill(anImage, drawList) of me set aUUIDstr to (NSUUID’s UUID()’s UUIDString()) as string set aPath to ((NSString’s stringWithString:imgPath)’s stringByDeletingLastPathComponent()’s stringByAppendingPathComponent:aUUIDstr)’s stringByAppendingPathExtension:"png" set fRes to saveImageRepAtPathAsPNG(resImage, aPath) of me on drawImageWithClearColorFill(anImage, drawList) set retinaF to (NSScreen’s mainScreen()’s backingScaleFactor()) as real –> 2.0 (Retina) / 1.0 (Non Retina) set aClearCol to NSColor’s clearColor() set op to current application’s NSCompositeClear anImage’s lockFocus() –描画開始 repeat with i in drawList set origX to (x of origin of i) / retinaF set origY to (y of origin of i) / retinaF set sizeX to (width of |size| of i) / retinaF set sizeY to (height of |size| of i) / retinaF –Draw Clear Color –http://www.drissman.com/blog/archives/2009/10/09/nsrectfill_and_nscolor_clearcolor.html set theRect to {{x:origX, y:origY}, {width:sizeX, height:sizeY}} aClearCol’s |set|() current application’s NSRectFillUsingOperation(theRect, op) end repeat anImage’s unlockFocus() –描画ここまで return anImage –returns NSImage end drawImageWithClearColorFill –画像を指定パスにPNG形式で保存 on saveImageRepAtPathAsPNG(anImage, outPath) set imageRep to anImage’s TIFFRepresentation() set aRawimg to NSBitmapImageRep’s imageRepWithData:imageRep set pathString to NSString’s stringWithString:outPath set newPath to pathString’s stringByExpandingTildeInPath() set myNewImageData to (aRawimg’s representationUsingType:(NSPNGFileType) |properties|:(missing value)) return (myNewImageData’s writeToFile:newPath atomically:true) as boolean end saveImageRepAtPathAsPNG |