指定アプリケーションのメインウィンドウのサイズとポジションを取得し、画面キャプチャから該当エリアを切り抜いてPNG画像に書き出すAppleScriptです。
Mac Blue-ray Playerの再生中のポジションを取得しようとして、AppleScript用語辞書の中身を確認したところ、そのような属性値は存在していません。
そこで、GUI Scripting経由でウィンドウ上のUser Interfaceを確認してみたところ、
といったように、現在の再生ポジションを取得できるような部品にアクセスすることはできませんでした。
ここまで試してダメということは、さすがにAppleScriptでも画面上からまっとうな方法で文字情報を拾うことはできません。
そこで試してみたのがコレです。GUI Scripting経由でメインウィンドウの大きさと位置は取得できます。画面のスクリーンキャプチャから当該エリアのみ切り抜くことも可能です。
そして、現在再生位置を示す文字情報(おそらく画像としてレンダリングして表示)のエリアはウィンドウ位置とサイズから計算で求められます。
これらの文字を、たとえばMicrosoftのCognitive APIなどを呼び出してOCR処理を行うか、あるいは画素数がきわめて少ない情報であるためAppleScript単独で画像解析して0〜9の数字との類似度を計算して擬似的に文字認識を行うといったことは可能でしょう。
いまひとつ、そうした試行錯誤を行う時間がないため、「とりあえず」の場所で止めておきますが、、、、できそうといえばできそうな感じが、、、するようなしないような。
AppleScript名:画面キャプチャから指定アプリケーションの表示エリアを切り抜いてファイル書き出し v2 |
— Created 2015-12-22 by Takaaki Naganoya — Modified 2018-03-02 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "Quartz" use framework "AppKit" use framework "ApplicationServices" property |NSURL| : a reference to current application’s |NSURL| property NSUUID : a reference to current application’s NSUUID property NSString : a reference to current application’s NSString property NSImage : a reference to current application’s NSImage property NSPNGFileType : a reference to current application’s NSPNGFileType property NSBitmapImageRep : a reference to current application’s NSBitmapImageRep tell application "Blu-ray Player" to activate tell application "System Events" tell application process "Mac Blu-ray Player" tell window 1 set {xSize, ySize} to size set {xPos, yPos} to position end tell end tell end tell do shell script "/usr/sbin/screencapture -c -x" set aImage to current application’s NSImage’s alloc()’s initWithPasteboard:(current application’s NSPasteboard’s generalPasteboard()) set cropedImage to my cropNSImageBy:{xPos, yPos, xSize, ySize} fromImage:aImage set aPath to POSIX path of (path to desktop) set fRes to retUUIDfilePathFromDir(aPath, "png") of me set sRes to saveNSImageAtPathAsPNG(cropedImage, fRes) of me on cropNSImageTo:{x1, y1, x2, y2} fromImage:theImage set newWidth to x2 – x1 set newHeight to y2 – y1 set theSize to (theImage’s |size|()) as record set oldHeight to height of theSize — transpose y value for Cocoa coordintates set y1 to oldHeight – newHeight – y1 set newRect to {{x:x1, y:y1}, {width:newWidth, height:newHeight}} theImage’s lockFocus() set theRep to NSBitmapImageRep’s alloc()’s initWithFocusedViewRect:newRect theImage’s unlockFocus() set outImage to NSImage’s alloc()’s initWithSize:(theRep’s |size|()) outImage’s addRepresentation:theRep return outImage end cropNSImageTo:fromImage: –NSImageを指定の大きさでトリミング on cropNSImageBy:{x1, y1, newWidth, newHeight} fromImage:theImage set theSize to (theImage’s |size|()) as record set oldHeight to height of theSize — transpose y value for Cocoa coordintates set y1 to oldHeight – newHeight – y1 set newRect to {{x:x1, y:y1}, {width:newWidth, height:newHeight}} theImage’s lockFocus() set theRep to NSBitmapImageRep’s alloc()’s initWithFocusedViewRect:newRect theImage’s unlockFocus() set outImage to NSImage’s alloc()’s initWithSize:(theRep’s |size|()) outImage’s addRepresentation:theRep return outImage end cropNSImageBy:fromImage: on retUUIDfilePathFromDir(aPath, aEXT) set aUUIDstr to (NSUUID’s UUID()’s UUIDString()) as string set aPath to ((NSString’s stringWithString:aPath)’s stringByAppendingPathComponent:aUUIDstr)’s stringByAppendingPathExtension:aEXT return aPath end retUUIDfilePathFromDir –NSImageを指定パスにPNG形式で保存 on saveNSImageAtPathAsPNG(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)) set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean return aRes –true/false end saveNSImageAtPathAsPNG |