AppleScript名:指定日における年齢を計算する |
— Created 2015-09-10 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" –http://stackoverflow.com/questions/4463893/ –how-to-calculate-the-age-based-on-nsdate set aBirthday to "2009-04-24 12:00:00" –誕生日 set aFormatter to current application’s NSDateFormatter’s alloc()’s init() aFormatter’s setDateFormat:"yyyy-MM-dd HH:mm:ss" aFormatter’s setTimeZone:(current application’s NSTimeZone’s timeZoneForSecondsFromGMT:0) set aBirthdayDate to aFormatter’s dateFromString:aBirthday set currentDate to getDateInternational(2018, 4, 1, 9, 59, 35, "JST") of me set ageComponents to current application’s NSCalendar’s currentCalendar()’s components:(current application’s NSCalendarUnitYear) fromDate:aBirthdayDate toDate:currentDate options:0 set myAge to ageComponents’s |year|() –> 8 –Make a GMT Date Object with parameters from a given time zone. on getDateInternational(aYear, aMonth, aDay, anHour, aMinute, aSecond, timeZoneAbbreviation) set theNSCalendar to current application’s NSCalendar’s currentCalendar() theNSCalendar’s setTimeZone:(current application’s NSTimeZone’s timeZoneWithAbbreviation:(timeZoneAbbreviation)) set theDate to theNSCalendar’s dateWithEra:1 |year|:aYear |month|:aMonth |day|:aDay hour:anHour minute:aMinute |second|:aSecond nanosecond:0 return theDate end getDateInternational |
タグ: 10.13savvy
Finder上で選択中の画像を縦方向に連結 v1
Finder上で選択中の画像ファイルを縦方向に連結して結果をデスクトップ上に出力するAppleScriptです。
AppleScript名:Finder上で選択中の画像を縦方向に連結 v1 |
— Created 2017-11-21 by Takaaki Naganoya — Modified 2018-04-06 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.5" — El Capitan (10.11) or later use framework "Foundation" use framework "QuartzCore" use framework "AppKit" use scripting additions property |NSURL| : a reference to current application’s |NSURL| property NSUUID : a reference to current application’s NSUUID property NSArray : a reference to current application’s NSArray property NSString : a reference to current application’s NSString property NSImage : a reference to current application’s NSImage property NSWorkspace : a reference to current application’s NSWorkspace property NSPNGFileType : a reference to current application’s NSPNGFileType property NSMutableArray : a reference to current application’s NSMutableArray property NSBitmapImageRep : a reference to current application’s NSBitmapImageRep property NSURLTypeIdentifierKey : a reference to current application’s NSURLTypeIdentifierKey property yGap : 10 –連結時の画像間のアキ(横方向) tell application "Finder" set aSel to selection as alias list if aSel = {} or aSel = "" then return end tell –選択した画像をArrayに入れる set imgList to NSMutableArray’s new() repeat with i in aSel set aPath to POSIX path of i set imgRes to (my isImageAtPath:aPath) if imgRes as boolean = true then set aNSImage to (NSImage’s alloc()’s initWithContentsOfFile:aPath) (imgList’s addObject:aNSImage) end if end repeat –KVCで画像の各種情報をまとめて取得 set sizeList to (imgList’s valueForKeyPath:"size") as list –NSSize to list of record conversion set maxWidth to ((NSArray’s arrayWithArray:sizeList)’s valueForKeyPath:"@max.width") as real set totalHeight to (((NSArray’s arrayWithArray:sizeList)’s valueForKeyPath:"@sum.height") as real) + 50 set totalCount to ((NSArray’s arrayWithArray:sizeList)’s valueForKeyPath:"@count") as integer –出力画像作成 set tSize to current application’s NSMakeSize(maxWidth, totalHeight + (yGap * totalCount)) set newImage to NSImage’s alloc()’s initWithSize:tSize –順次画像を新規画像に上書き set yOrig to 0 repeat with i in (imgList as list) set j to contents of i set curSize to j’s |size|() –set aRect to {0, (maxWidth – (curSize’s height())), (curSize’s width()), (curSize’s height())} set aRect to {0, (totalHeight – (curSize’s height())) – yOrig, (curSize’s width()), (curSize’s height())} set newImage to composeImage(newImage, j, aRect) of me set yOrig to yOrig + (curSize’s height()) + yGap end repeat –デスクトップにPNG形式でNSImageをファイル保存 set aDesktopPath to current application’s NSHomeDirectory()’s stringByAppendingString:"/Desktop/" set savePath to aDesktopPath’s stringByAppendingString:((NSUUID’s UUID()’s UUIDString())’s stringByAppendingString:".png") set fRes to saveNSImageAtPathAsPNG(newImage, savePath) of me –2つのNSImageを重ね合わせ合成してNSImageで返す on composeImage(backImage, composeImage, aTargerRect) set newImage to NSImage’s alloc()’s initWithSize:(backImage’s |size|()) copy aTargerRect to {x1, y1, x2, y2} newImage’s lockFocus() set v2 to system attribute "sys2" if v2 ≤ 12 then –To macOS 10.12.x set bRect to current application’s NSMakeRect(x1, y1, x2, y2) set newImageRect to current application’s CGRectZero set newImageRect’s |size| to (newImage’s |size|) else –macOS 10.13 or later set bRect to {{x1, y1}, {x2, y2}} set newImageRect to {{0, 0}, (newImage’s |size|)} end if backImage’s drawInRect:newImageRect composeImage’s drawInRect:bRect newImage’s unlockFocus() return newImage end composeImage –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 –指定のパスのファイルが画像かどうかをチェック on isImageAtPath:aPath set aURL to |NSURL|’s fileURLWithPath:aPath set {theResult, theValue} to aURL’s getResourceValue:(reference) forKey:NSURLTypeIdentifierKey |error|:(missing value) return (NSImage’s imageTypes()’s containsObject:theValue) as boolean end isImageAtPath: |
配列に入れた画像を類似度でソートする
ターゲット画像に対して配列に入れた複数の画像を類似度をキーにしてソートするAppleScriptです。
最も類似度が高いと思われる画像をデスクトップにPNG形式で書き出します。
CocoaImageHashing.framework (To ~/Library/Frameworks/)
AppleScript名:配列に入れた画像を類似度でソートする |
— Created 2016-10-30 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "CocoaImageHashing" –https://github.com/ameingast/cocoaimagehashing –From Example: "Sorting an NSArray containing image data" –比較元の画像を選択 set baseData to retDataFromPath(POSIX path of (choose file {"public.image"})) of me –比較対象のデータを選択 set aData to retDataFromPath(POSIX path of (choose file {"public.image"})) of me set bData to retDataFromPath(POSIX path of (choose file {"public.image"})) of me set cData to retDataFromPath(POSIX path of (choose file {"public.image"})) of me set aList to {aData, bData, cData} set anArray to current application’s NSMutableArray’s arrayWithArray:aList –配列に入れられた画像を類似度でソートする set aRes to (current application’s OSImageHashing’s sharedInstance()’s sortedArrayUsingImageSimilartyComparator:baseData forArray:anArray) –最も類似度の高い画像データを取り出す set firstObj to aRes’s objectAtIndex:0 set anImage to current application’s NSImage’s alloc()’s initWithData:firstObj –確認のため、デスクトップにPNG形式で最も類似度の高い画像を書き出す set aFolder to POSIX path of (path to desktop folder) set fRes to retUUIDfilePathFromFolder(aFolder, "png") of me set sRes to saveNSImageAtPathAsPNG(anImage, fRes) of me on retUUIDfilePathFromFolder(aFolder, aEXT) set aUUIDstr to (current application’s NSUUID’s UUID()’s UUIDString()) as string set aPath to ((current application’s NSString’s stringWithString:aFolder)’s stringByAppendingPathComponent:aUUIDstr)’s stringByAppendingPathExtension:aEXT return aPath end retUUIDfilePathFromFolder –NSImageを指定パスにPNG形式で保存 on saveNSImageAtPathAsPNG(anImage, outPath) set imageRep to anImage’s TIFFRepresentation() set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep set pathString to current application’s NSString’s stringWithString:outPath set newPath to pathString’s stringByExpandingTildeInPath() set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value)) set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean return aRes –true/false end saveNSImageAtPathAsPNG on retDataFromPath(aFile) set aURL to current application’s |NSURL|’s fileURLWithPath:aFile set aData to current application’s NSData’s dataWithContentsOfURL:aURL return aData end retDataFromPath |
2つの画像が類似しているかを判定
2つの画像が類似しているかどうかを判定するAppleScriptです。
CocoaImageHashing.framework (To ~/Library/Frameworks/)
AppleScript名:2つの画像が類似しているかを判定 |
— Created 2016-10-30 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "CocoaImageHashing" –https://github.com/ameingast/cocoaimagehashing –From Example: "Comparing two images for similarity" set aFile to POSIX path of (choose file {"public.image"}) set bFile to POSIX path of (choose file {"public.image"}) set aRes to checkSimiliality(aFile, bFile) of me –> true / false on checkSimiliality(aFile, bFile) set aURL to current application’s |NSURL|’s fileURLWithPath:aFile set bURL to current application’s |NSURL|’s fileURLWithPath:bFile set aData to current application’s NSData’s dataWithContentsOfURL:aURL set bData to current application’s NSData’s dataWithContentsOfURL:bURL set aRes to (current application’s OSImageHashing’s sharedInstance()’s compareImageData:aData |to|:bData) as boolean return aRes end checkSimiliality |
NSImageをリサイズ(アンチエイリアス解除)pattern 4
指定ファイルをNSImageに読み込んで、アンチエイリアスを使用せずに指定倍率に拡大するAppleScriptです。
▲Original & Resized Image (x10)
AppleScript名:NSImageをリサイズ(アンチエイリアス解除)pattern 4 |
— Created 2017-02-03 by Takaaki Naganoya — Modified 2017-03-22 by Shane Stanley use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set aPath to POSIX path of (choose file of type {"public.image"} with prompt "Select Image file to scale up (x10)") set aNSImage to current application’s NSImage’s alloc()’s initWithContentsOfFile:aPath set resizedImg to my resizeNSImageWithoutAntlialias:aNSImage toScale:10 set aDesktopPath to (current application’s NSProcessInfo’s processInfo()’s environment()’s objectForKey:("HOME"))’s stringByAppendingString:"/Desktop/" set savePath to aDesktopPath’s stringByAppendingString:((current application’s NSUUID’s UUID()’s UUIDString())’s stringByAppendingString:".png") set fRes to saveNSImageAtPathAsPNG(resizedImg, savePath) of me –NSImageを指定倍率で拡大(アンチエイリアス解除状態で) on resizeNSImageWithoutAntlialias:aSourceImg toScale:imgScale set aSize to aSourceImg’s |size|() set aWidth to (aSize’s width) * imgScale set aHeight to (aSize’s height) * imgScale set aRep to current application’s NSBitmapImageRep’s alloc()’s initWithBitmapDataPlanes:(missing value) pixelsWide:aWidth pixelsHigh:aHeight bitsPerSample:8 samplesPerPixel:4 hasAlpha:true isPlanar:false colorSpaceName:(current application’s NSCalibratedRGBColorSpace) bytesPerRow:0 bitsPerPixel:0 set newSize to {width:aWidth, height:aHeight} aRep’s setSize:newSize current application’s NSGraphicsContext’s saveGraphicsState() set theContext to current application’s NSGraphicsContext’s graphicsContextWithBitmapImageRep:aRep current application’s NSGraphicsContext’s setCurrentContext:theContext theContext’s setShouldAntialias:false theContext’s setImageInterpolation:(current application’s NSImageInterpolationNone) aSourceImg’s drawInRect:(current application’s NSMakeRect(0, 0, aWidth, aHeight)) fromRect:(current application’s NSZeroRect) operation:(current application’s NSCompositeCopy) fraction:(1.0) current application’s NSGraphicsContext’s restoreGraphicsState() set newImg to current application’s NSImage’s alloc()’s initWithSize:newSize newImg’s addRepresentation:aRep return newImg end resizeNSImageWithoutAntlialias:toScale: –NSImageを指定パスにPNG形式で保存 on saveNSImageAtPathAsPNG(anImage, outPath) set imageRep to anImage’s TIFFRepresentation() set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep set pathString to current application’s NSString’s stringWithString:outPath set newPath to pathString’s stringByExpandingTildeInPath() set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value)) set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean return aRes end saveNSImageAtPathAsPNG |
画像中の色の置き換え
指定画像中の指定色を置き換えるAppleScriptです。
replaceColorKit.framework (To ~/Library/Frameworks/)
▲Color Replaced Image & Original (Yellow)
AppleScript名:画像中の色の置き換え |
— Created 2017-04-23 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "replaceColorKit" –https://github.com/braginets/NSImage-replace-color use framework "AppKit" set aThreshold to 0.2 set aFile to POSIX path of (choose file of type {"public.image"}) set anImage to (current application’s NSImage’s alloc()’s initWithContentsOfFile:aFile) set aColor to makeNSColorFromRGBA255val(246, 253, 0, 255) of me set bColor to makeNSColorFromRGBA255val(154, 154, 154, 255) of me set bImage to (anImage’s replaceColor:aColor withColor:bColor withThreshold:aThreshold) set aDesktopPath to ((current application’s NSProcessInfo’s processInfo()’s environment()’s objectForKey:("HOME"))’s stringByAppendingString:"/Desktop/") set savePath to (aDesktopPath’s stringByAppendingString:((current application’s NSString’s stringWithString:(aThreshold as string))’s stringByAppendingString:".png")) set fRes to saveNSImageAtPathAsPNG(bImage, savePath) of me –0〜255の数値でNSColorを作成する 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 –NSImageを指定パスにPNG形式で保存 on saveNSImageAtPathAsPNG(anImage, outPath) set imageRep to anImage’s TIFFRepresentation() set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep set pathString to current application’s NSString’s stringWithString:outPath set newPath to pathString’s stringByExpandingTildeInPath() set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value)) set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean return aRes end saveNSImageAtPathAsPNG |
指定画像の余白の自動トリミング
指定画像の余白トリミングを自動で行うAppleScriptです。
KGPixelBoundsClipKit.framework (To ~/Library/Frameworks/)
AppleScript名:指定画像の余白の自動トリミング |
— Created 2017-04-26 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" use framework "KGPixelBoundsClipKit" –https://github.com/kgn/KGPixelBoundsClip set aFile to POSIX path of (choose file of type {"public.image"}) set anImage to (current application’s NSImage’s alloc()’s initWithContentsOfFile:aFile) set bImage to anImage’s imageClippedToPixelBounds() set aDesktopPath to (current application’s NSProcessInfo’s processInfo()’s environment()’s objectForKey:("HOME"))’s stringByAppendingString:"/Desktop/" set savePath to aDesktopPath’s stringByAppendingString:((current application’s NSUUID’s UUID()’s UUIDString())’s stringByAppendingString:".png") set fRes to saveNSImageAtPathAsPNG(bImage, savePath) of me –NSImageを指定パスにPNG形式で保存 on saveNSImageAtPathAsPNG(anImage, outPath) set imageRep to anImage’s TIFFRepresentation() set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep set pathString to current application’s NSString’s stringWithString:outPath set newPath to pathString’s stringByExpandingTildeInPath() set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value)) set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean return aRes end saveNSImageAtPathAsPNG |
NSImageの垂直、水平反転
NSImageの垂直方向、水平方向の反転を行うAppleScriptです。
▲Original Image
▲Horizontal Flipped Image
▲Vertical Flipped Image
AppleScript名:NSImageの垂直、水平反転 |
— Created 2017-07-25 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" –https://stackoverflow.com/questions/10936590/flip-nsimage-on-both-axes set aFile to POSIX path of (choose file of type {"public.image"} with prompt "Select an Image") set currentImage to current application’s NSImage’s alloc()’s initWithContentsOfFile:aFile set imgRes to flipImageVertically(currentImage) of me set fRes to retUUIDfilePath(aFile, "png") of me set sRes to saveNSImageAtPathAsPNG(imgRes, fRes) of me –水平方向の画像反転 on flipImageHorizontally(anNSImage) set transform to current application’s NSAffineTransform’s transform() set dimList to anNSImage’s |size|() set flipList to {-1.0, 0.0, 0.0, 1.0, dimList’s width, 0.0} set tmpImage to current application’s NSImage’s alloc()’s initWithSize:(dimList) tmpImage’s lockFocus() transform’s setTransformStruct:flipList transform’s concat() anNSImage’s drawAtPoint:(current application’s NSMakePoint(0, 0)) fromRect:(current application’s NSMakeRect(0, 0, dimList’s width, dimList’s height)) operation:(current application’s NSCompositeCopy) fraction:1.0 tmpImage’s unlockFocus() return tmpImage end flipImageHorizontally –垂直方向の画像反転 on flipImageVertically(anNSImage) set transform to current application’s NSAffineTransform’s transform() set dimList to anNSImage’s |size|() set flipList to {1.0, 0.0, 0.0, -1.0, 0.0, dimList’s height} set tmpImage to current application’s NSImage’s alloc()’s initWithSize:(dimList) tmpImage’s lockFocus() transform’s setTransformStruct:flipList transform’s concat() anNSImage’s drawAtPoint:(current application’s NSMakePoint(0, 0)) fromRect:(current application’s NSMakeRect(0, 0, dimList’s width, dimList’s height)) operation:(current application’s NSCompositeCopy) fraction:1.0 tmpImage’s unlockFocus() return tmpImage end flipImageVertically on retUUIDfilePath(aPath, aEXT) set aUUIDstr to (current application’s NSUUID’s UUID()’s UUIDString()) as string set aPath to ((current application’s NSString’s stringWithString:aPath)’s stringByDeletingLastPathComponent()’s stringByAppendingPathComponent:aUUIDstr)’s stringByAppendingPathExtension:aEXT return aPath end retUUIDfilePath –NSImageを指定パスにPNG形式で保存 on saveNSImageAtPathAsPNG(anImage, outPath) set imageRep to anImage’s TIFFRepresentation() set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep set pathString to current application’s NSString’s stringWithString:outPath set newPath to pathString’s stringByExpandingTildeInPath() set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value)) set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean return aRes –true/false end saveNSImageAtPathAsPNG |
単色画像(アルファ値必要)に色を指定して塗りつぶし
単色画像に色を指定して塗りつぶしを行うAppleScriptです。
▲Original Image
▲Result Image
AppleScript名:単色画像(アルファ値必要)に色を指定して塗りつぶし |
— Created 2017-04-24 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" use framework "QuartzCore" –http://piyocast.com/as/archives/4615 set aFile to POSIX path of (choose file of type "public.image") set aColor to makeNSColorFromRGBA255val(0, 0, 255, 255) of me set aColoredImage to fillColorWithImage(aFile, aColor) of me set aDesktopPath to ((current application’s NSProcessInfo’s processInfo()’s environment()’s objectForKey:("HOME"))’s stringByAppendingString:"/Desktop/") set savePath to (aDesktopPath’s stringByAppendingString:((current application’s NSString’s stringWithString:"testOverlay")’s stringByAppendingString:".png")) set fRes to saveNSImageAtPathAsPNG(aColoredImage, savePath) of me on fillColorWithImage(aFile, aColor) set anImage to (current application’s NSImage’s alloc()’s initWithContentsOfFile:aFile) set aSize to anImage’s |size|() set aWidth to (aSize’s width) set aHeight to (aSize’s height) set colordImage to makeNSImageWithFilledWithColor(aWidth, aHeight, aColor) of me colordImage’s lockFocus() anImage’s drawAtPoint:{0, 0} fromRect:(current application’s NSZeroRect) operation:(current application’s NSCompositeDestinationIn) fraction:1.0 colordImage’s unlockFocus() return colordImage end fillColorWithImage –指定サイズの画像を作成し、指定色で塗ってファイル書き出し on makeNSImageWithFilledWithColor(aWidth, aHeight, fillColor) set anImage to current application’s NSImage’s alloc()’s initWithSize:(current application’s NSMakeSize(aWidth, aHeight)) anImage’s lockFocus() — set theRect to {{x:0, y:0}, {height:aHeight, width:aWidth}} set theNSBezierPath to current application’s NSBezierPath’s bezierPath theNSBezierPath’s appendBezierPathWithRect:theRect — fillColor’s |set|() –色設定 theNSBezierPath’s fill() –ぬりつぶし — anImage’s unlockFocus() — return anImage end makeNSImageWithFilledWithColor 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 –NSImageを指定パスにPNG形式で保存 on saveNSImageAtPathAsPNG(anImage, outPath) set imageRep to anImage’s TIFFRepresentation() set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep set pathString to current application’s NSString’s stringWithString:outPath set newPath to pathString’s stringByExpandingTildeInPath() set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value)) set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean return aRes –成功ならtrue、失敗ならfalseが返る end saveNSImageAtPathAsPNG |
AVCapture Deviceの情報を取得する
AppleScript名:AVCapture Deviceの情報を取得する |
— Created 2017-10-24 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AVFoundation" –https://github.com/pombredanne/osx_headers/blob/master/Frameworks/AVFoundation/AVCaptureHALDevice.h set inputDevs to current application’s AVCaptureDevice’s devices() set a1Res to (inputDevs’s valueForKeyPath:"manufacturer") as list –> {"ma++ ingalls for Cycling ’74", "Shape Services", "Apple Inc.", "Shape Services", "ma++ ingalls for Cycling ’74", "Allocinit.com", "Allocinit.com", "Apple Inc."} set a2Res to (inputDevs’s valueForKeyPath:"localizedName") as list –> {"Soundflower (64ch)", "Mobiola Headphone", "内蔵マイク", "Mobiola Microphone", "Soundflower (2ch)", "CamTwist", "CamTwist (2VUY)", "FaceTime HDカメラ(内蔵)"} set a3Res to (inputDevs’s valueForKeyPath:"isConnected") as list –> {1, 1, 1, 1, 1, 1, 1, 1} set a4Res to (inputDevs’s valueForKeyPath:"activeFormat") as list –> {(AVCaptureDeviceFormat) <AVCaptureDeviceFormat: 0x610000605a30> ’soun’/’lpcm’ SR=44100,FF=30,BPP=256,FPP=1,BPF=256,CH=64,BPC=32, (AVCaptureDeviceFormat) <AVCaptureDeviceFormat: 0x618000407a90> ’soun’/’lpcm’ SR=48000,FF=30,BPP=4,FPP=1,BPF=4,CH=1,BPC=32, (AVCaptureDeviceFormat) <AVCaptureDeviceFormat: 0x608000c171f0> ’soun’/’lpcm’ SR=44100,FF=4,BPP=8,FPP=1,BPF=8,CH=2,BPC=24, (AVCaptureDeviceFormat) <AVCaptureDeviceFormat: 0x600000c0ba40> ’soun’/’lpcm’ SR=48000,FF=30,BPP=4,FPP=1,BPF=4,CH=1,BPC=32, (AVCaptureDeviceFormat) <AVCaptureDeviceFormat: 0x610000606310> ’soun’/’lpcm’ SR=44100,FF=30,BPP=8,FPP=1,BPF=8,CH=2,BPC=32, (AVCaptureDeviceFormat) <AVCaptureDeviceFormat: 0x618000a07010> ’vide’/’BGRA’ enc dims = 720×480, pres dims = 720×480 { 30.00 fps }, (AVCaptureDeviceFormat) <AVCaptureDeviceFormat: 0x608000a15070> ’vide’/’2vuy’ enc dims = 720×480, pres dims = 720×480 { 30.00 fps }, (AVCaptureDeviceFormat) <AVCaptureDeviceFormat: 0x610000605bb0> ’vide’/’2vuy’ enc dims = 160×120, pres dims = 160×120 { 29.97 25.00 24.00 15.00 fps }} set a5Res to (inputDevs’s valueForKeyPath:"transportType") as list –> {0, 0, 1.651274862E+9, 0, 0, 1.651274862E+9, 1.651274862E+9, 1.651274862E+9} set a6Res to (inputDevs’s valueForKeyPath:"modelID") as list –> {"com_cycling74_driver_SoundflowerDevice:Soundflower", "com_ShapeServices_driver_HSAudioDevice:Headset Audio Device", "AppleHDA:40", "com_ShapeServices_driver_HSAudioDevice:Headset Audio Device", "com_cycling74_driver_SoundflowerDevice:Soundflower", "Stiltskin", "Stiltskin", "UVC Camera VendorID_1452 ProductID_34064"} set a7Res to (inputDevs’s valueForKeyPath:"formats") as list –> {{(AVCaptureDeviceFormat) <AVCaptureDeviceFormat: 0x610000606240> ’soun’/’lpcm’ SR=192000,FF=30,BPP=256,FPP=1,BPF=256,CH=64,BPC=32, (AVCaptureDeviceFormat) <AVCaptureDeviceFormat: 0x610000605d30> ’soun’/’lpcm’ SR=176400,FF=30,BPP=256,FPP=1,BPF=256,CH=64,BPC=32, (AVCaptureDeviceFormat) <AVCaptureDeviceFormat: 0x610000605020> ’soun’/’lpcm’ SR=96000,FF=30,BPP=256,FPP=1,BPF=256,CH=64,BPC=32, (AVCaptureDeviceFormat) <AVCaptureDeviceFormat: 0x610000605a90> ’soun’/’lpcm’ SR=88200,FF=30,BPP=256,FPP=1,BPF=256,CH=64,BPC=32, (AVCaptureDeviceFormat) <AVCaptureDeviceFormat: 0x610000601b70> ’soun’/’lpcm’ SR=48000,FF=30,BPP=256,FPP=1,BPF=256,CH=64,BPC=32, (AVCaptureDeviceFormat) <AVCaptureDeviceFormat: 0x610000605a30> ’soun’/’lpcm’ SR=44100,FF=30,BPP=256,FPP=1,BPF=256,CH=64,BPC=32}, set a8Res to (inputDevs’s valueForKeyPath:"connectionID") as list –> {65, 40, 200, 47, 54, 33, 36, 39} set a9Res to (inputDevs’s valueForKeyPath:"connectionUnitComponentSubType") –> (NSArray) {1751215136, 1751215136, 1751215136, 1751215136, 1751215136, 1684106272, 1684106272, 1684106272} set a10Res to (inputDevs’s valueForKeyPath:"deviceID") as list –> {65, 40, 200, 47, 54, 33, 36, 39} set a11Res to (inputDevs’s valueForKeyPath:"deviceSystem") as list –> {2, 2, 2, 2, 2, 1, 1, 1} set a12Res to (inputDevs’s valueForKeyPath:"isInUseByAnotherApplication") as list –> {0, 0, 0, 0, 0, 0, 0, 0} set a13Res to (inputDevs’s valueForKeyPath:"activeInputSource") as list –> {missing value, missing value, (AVCaptureDeviceInputSource) <AVCaptureDeviceInputSource: 0x610000606290 ’imic’ "内蔵マイク">, missing value, missing value, missing value, missing value, missing value} set a14Res to (inputDevs’s valueForKeyPath:"uniqueID") as list –> {"SoundflowerEngine:1", "HSAudioPipeEngine:0", "AppleHDAEngineInput:1B,0,1,0:1", "HSAudioPipeEngine:1", "SoundflowerEngine:0", "CDC85FD0-E73A-4FC2-B3A8-EA237D6990E0", "CDC85FD0-E73A-4FC2-B3A8-EA237D6990E1", "0x1a11000005ac8510"} set a15Res to (inputDevs’s valueForKeyPath:"inputSources") as list –> {{}, {}, {(AVCaptureDeviceInputSource) <AVCaptureDeviceInputSource: 0x610000606290 ’imic’ "内蔵マイク">}, {}, {}, {}, {}, {}} set a16Res to (inputDevs’s valueForKeyPath:"description") as list –> {"<AVCaptureHALDevice: 0x6180002f6d80 [Soundflower (64ch)][SoundflowerEngine:1]>", "<AVCaptureHALDevice: 0x6000002fba00 [Mobiola Headphone][HSAudioPipeEngine:0]>", "<AVCaptureHALDevice: 0x6180002fbe80 [内蔵マイク][AppleHDAEngineInput:1B,0,1,0:1]>", "<AVCaptureHALDevice: 0x6180002e8900 [Mobiola Microphone][HSAudioPipeEngine:1]>", "<AVCaptureHALDevice: 0x6100004f2c00 [Soundflower (2ch)][SoundflowerEngine:0]>", "<AVCaptureDALDevice: 0x7f804e6bae00 [CamTwist][CDC85FD0-E73A-4FC2-B3A8-EA237D6990E0]>", "<AVCaptureDALDevice: 0x7f804e5a3fa0 [CamTwist (2VUY)][CDC85FD0-E73A-4FC2-B3A8-EA237D6990E1]>", "<AVCaptureDALDevice: 0x7f804e5a24c0 [FaceTime HDカメラ(内蔵)][0x1a11000005ac8510]>"} |
画像+文字作成テスト_v4
指定サイズの画像に対して指定の文字を描画して指定ファイル名のPNG画像を書き出すAppleScriptです。
AppleScript名:画像+文字作成テスト_v4 |
— Created 2015-07-31 by Takaaki Naganoya — Modified 2015-08-01 by Shane Stanley — Modified 2017-11-19 by Takaaki Naganoya / macOS 10.13のバグに対応 use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set aWidth to 400.0 –幅 set aHeight to 200.0 –高さ set outPath to "~/Desktop/test.png" –書き出し先のファイルパス set fillColor to current application’s NSColor’s blackColor –塗り色 set drawColor to current application’s NSColor’s whiteColor –文字色 set aText to "ぴよまるソフトウェア" set {xPos, yPos} to {1, 5} –新規画像を作成して背景を塗る set anImage to makeImageWithFilledColor(aWidth, aHeight, outPath, fillColor) of me –画像に文字を塗る(参照渡し(call by reference)で、結果はaImage1に入る) drawStringsOnImage(anImage, aText, "HiraKakuStd-W8", 36.0, drawColor, xPos, yPos) of me –ファイル保存 set aRes to saveImageRepAtPathAsPNG(anImage, outPath) of me –画像のうえに指定の文字を描画して画像を返す on drawStringsOnImage(anImage, aText, aFontName, aPoint, drawColor) set retinaF to (current application’s NSScreen’s mainScreen()’s backingScaleFactor()) as real –> 2.0 (Retina) / 1.0 (Non Retina) set aString to current application’s NSString’s stringWithString:aText set aDict to current application’s NSDictionary’s dictionaryWithObjects:{current application’s NSFont’s fontWithName:aFontName |size|:aPoint, drawColor} forKeys:{current application’s NSFontAttributeName, current application’s NSForegroundColorAttributeName} set imageSize to anImage’s |size|() set textSize to aString’s sizeWithAttributes:aDict set xPos to ((width of imageSize) – (width of textSize)) / 2 / retinaF set yPos to ((height of imageSize) – (height of textSize)) / 2 / retinaF –文字描画開始 anImage’s lockFocus() aString’s drawAtPoint:(current application’s NSMakePoint(xPos, yPos)) withAttributes:aDict anImage’s unlockFocus() end drawStringsOnImage –指定サイズの画像を作成し、背景を指定色で塗る on makeImageWithFilledColor(aWidth, aHeight, outPath, fillColor) set anImage to current application’s NSImage’s alloc()’s initWithSize:(current application’s NSMakeSize(aWidth, aHeight)) –描画開始 anImage’s lockFocus() set theRect to {{x:0, y:0}, {width:aWidth, height:aHeight}} set theNSBezierPath to current application’s NSBezierPath’s bezierPath theNSBezierPath’s appendBezierPathWithRect:theRect fillColor’s |set|() –色設定 theNSBezierPath’s fill() –ぬりつぶし anImage’s unlockFocus() –描画ここまで return anImage –画像を返す end makeImageWithFilledColor –画像を指定パスにPNG形式で保存 on saveImageRepAtPathAsPNG(anImage, outPath) set imageRep to anImage’s TIFFRepresentation() set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep –書き出しファイルパス情報を作成 set pathString to current application’s NSString’s stringWithString:outPath set newPath to pathString’s stringByExpandingTildeInPath() –書き出し set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value)) set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean return aRes –成功ならtrue、失敗ならfalseが返る end saveImageRepAtPathAsPNG |
DSCaptureで画面キャプチャ
shellのscreencaptureコマンドを使わずにフレームワーク経由で画面キャプチャを行うAppleScriptです。
オープンソースのDSCaptureを利用しており、キャプチャ内容をファイルではなくNSImageに格納できる(メモリ上に、ファイルI/Oを経由せずに取得できる)ので、割と使い手があります。とくに、ファイルI/Oに対してはセキュリティ機能による制約が多いために、メモリ上で処理できることのメリットははかりしれません。
本サンプルScriptでは、動作確認のためにキャプチャ内容をファイルに保存していますが、本来このFrameworkの性格からいえばファイル保存するのは「特徴」を台無しにしています。キャプチャしたイメージ(NSImage)をメモリ上で加工するのに向いています。
–> Download DSCapture.framework (To ~/Library/Frameworks/)
AppleScript名:DSCaptureで画面キャプチャ |
— Created 2017-01-16 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "DSCapture" –https://github.com/kiding/DSCapture.framework use framework "AppKit" –Full Screen (Every Display) set aCapt to current application’s DSCapture’s sharedCapture()’s |full|()’s captureWithTarget:me selector:"displayCaptureData:" useCG:false –Selected Area (Selected Area Only by user operation) –set bCapt to current application’s DSCapture’s sharedCapture()’s |selection|()’s captureWithTarget:me selector:"displayCaptureData:" useCG:false –Delegate Handler on displayCaptureData:aSender set aCount to aSender’s |count|() repeat with i from 0 to (aCount – 1) set anImage to (aSender’s imageAtIndex:i) –Make Save Image Path set aDesktopPath to ((current application’s NSProcessInfo’s processInfo()’s environment()’s objectForKey:("HOME"))’s stringByAppendingString:"/Desktop/") set savePath to (aDesktopPath’s stringByAppendingString:((current application’s NSUUID’s UUID()’s UUIDString())’s stringByAppendingString:".png")) saveNSImageAtPathAsPNG(anImage, savePath) of me end repeat end displayCaptureData: –NSImageを指定パスにPNG形式で保存 on saveNSImageAtPathAsPNG(anImage, outPath) set imageRep to anImage’s TIFFRepresentation() set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep set pathString to current application’s NSString’s stringWithString:outPath set newPath to pathString’s stringByExpandingTildeInPath() set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value)) set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean return aRes –成功ならtrue、失敗ならfalseが返る end saveNSImageAtPathAsPNG |
Finder上で選択中の画像を横方向に連結 v4
Finder上で選択中の画像ファイルを横方向に連結して結果をデスクトップ上に出力するAppleScriptです。
Shane Stanleyから「macOS 10.13で動かないよ」とツッコミが入ってmacOS 10.13に対応するよう書き換えたものです。
AppleScript名:Finder上で選択中の画像を横方向に連結 v4 |
— Created 2017-11-21 by Takaaki Naganoya — Modified 2018-04-06 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.5" — El Capitan (10.11) or later use framework "Foundation" use framework "QuartzCore" use framework "AppKit" use scripting additions property |NSURL| : a reference to current application’s |NSURL| property NSUUID : a reference to current application’s NSUUID property NSArray : a reference to current application’s NSArray property NSString : a reference to current application’s NSString property NSImage : a reference to current application’s NSImage property NSWorkspace : a reference to current application’s NSWorkspace property NSPNGFileType : a reference to current application’s NSPNGFileType property NSMutableArray : a reference to current application’s NSMutableArray property NSBitmapImageRep : a reference to current application’s NSBitmapImageRep property NSURLTypeIdentifierKey : a reference to current application’s NSURLTypeIdentifierKey property xGap : 10 –連結時の画像間のアキ(横方向) tell application "Finder" set aSel to selection as alias list if aSel = {} or aSel = "" then return end tell –選択した画像をArrayに入れる set imgList to NSMutableArray’s new() repeat with i in aSel set aPath to POSIX path of i set imgRes to (my isImageAtPath:aPath) if imgRes as boolean = true then set aNSImage to (NSImage’s alloc()’s initWithContentsOfFile:aPath) (imgList’s addObject:aNSImage) end if end repeat –KVCで画像の各種情報をまとめて取得 set sizeList to (imgList’s valueForKeyPath:"size") as list –NSSize to list of record conversion set maxHeight to ((NSArray’s arrayWithArray:sizeList)’s valueForKeyPath:"@max.height") as real set totalWidth to ((NSArray’s arrayWithArray:sizeList)’s valueForKeyPath:"@sum.width") as real set totalCount to ((NSArray’s arrayWithArray:sizeList)’s valueForKeyPath:"@count") as integer –出力画像作成 set tSize to current application’s NSMakeSize((totalWidth + (xGap * totalCount)), maxHeight) set newImage to NSImage’s alloc()’s initWithSize:tSize –順次画像を新規画像に上書き set xOrig to 0 repeat with i in (imgList as list) set j to contents of i set curSize to j’s |size|() set aRect to {xOrig, (maxHeight – (curSize’s height())), (curSize’s width()), (curSize’s height())} set newImage to composeImage(newImage, j, aRect) of me set xOrig to xOrig + (curSize’s width()) + xGap end repeat –デスクトップにPNG形式でNSImageをファイル保存 set aDesktopPath to current application’s NSHomeDirectory()’s stringByAppendingString:"/Desktop/" set savePath to aDesktopPath’s stringByAppendingString:((NSUUID’s UUID()’s UUIDString())’s stringByAppendingString:".png") set fRes to saveNSImageAtPathAsPNG(newImage, savePath) of me –2つのNSImageを重ね合わせ合成してNSImageで返す on composeImage(backImage, composeImage, aTargerRect) set newImage to NSImage’s alloc()’s initWithSize:(backImage’s |size|()) copy aTargerRect to {x1, y1, x2, y2} newImage’s lockFocus() set v2 to system attribute "sys2" if v2 ≤ 12 then –To macOS 10.12.x set bRect to current application’s NSMakeRect(x1, y1, x2, y2) set newImageRect to current application’s CGRectZero set newImageRect’s |size| to (newImage’s |size|) else –macOS 10.13 or later set bRect to {{x1, y1}, {x2, y2}} set newImageRect to {{0, 0}, (newImage’s |size|)} end if backImage’s drawInRect:newImageRect composeImage’s drawInRect:bRect newImage’s unlockFocus() return newImage end composeImage –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 –指定のパスのファイルが画像かどうかをチェック on isImageAtPath:aPath set aURL to |NSURL|’s fileURLWithPath:aPath set {theResult, theValue} to aURL’s getResourceValue:(reference) forKey:NSURLTypeIdentifierKey |error|:(missing value) return (NSImage’s imageTypes()’s containsObject:theValue) as boolean end isImageAtPath: |
画像の指定エリアを塗りつぶしで縦棒グラフを作成 v4
指定データをもとに縦棒グラフの画像をデスクトップフォルダ上に作成するAppleScriptです。
グラフの画像を作ろうとしたら、Keynote上で作成して画像書き出しするとかExcel上でグラフを作成して画像書き出しすることを考えますが、アプリケーションを利用しないでグラフ画像を作ってみました。
前バージョンがmacOS 10.13上で動作しなかったので、対処してみました。
▲macOS 10.13.5beta & macOS 10.12.6 (same result)
AppleScript名:画像の指定エリアを塗りつぶしで縦棒グラフを作成 v4 |
— Created 2017-11-19 by Takaaki Naganoya — Modified 2018-04-01 by 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 NSBitmapImageRep : a reference to current application’s NSBitmapImageRep set plotData to {20, 30, 100, 80, 150, 90} set plotArea to {300, 200} set innerGapL to 30 set innerGapU to 10 set innerGapR to 20 set innerGapD to 20 set barGap to 10 –パラメータから下地になる画像を作成する set aSize to current application’s NSMakeSize(first item of plotArea, second item of plotArea) set anImage to NSImage’s alloc()’s initWithSize:aSize –各種パラメータの計算 copy plotArea to {plotWidth, plotHeight} set itemNum to count every item of plotData set barThickness to (plotWidth – (itemNum * barGap * 2)) div itemNum –プロットデータの最大値 set anArray to current application’s NSArray’s arrayWithArray:plotData set aYmax to (anArray’s valueForKeyPath:"@max.self")’s intValue() set aMaxYVal to plotHeight – innerGapU – innerGapD set aYPlotArea to plotHeight – innerGapU – innerGapD – 20 set aYUnit to aYPlotArea / aYmax –数値データをもとに描画データを組み立てる set drawList to {} set startX to innerGapL copy startX to origX repeat with i in plotData set the end of drawList to current application’s NSMakeRect(startX, innerGapD, barThickness, innerGapD + (i * aYUnit)) set startX to startX + barThickness + barGap end repeat –グラフ塗りつぶし処理呼び出し set fillColor to (NSColor’s colorWithCalibratedRed:0.1 green:0.1 blue:0.1 alpha:0.3) set resImage to drawImageWithColorFill(anImage, drawList, fillColor) of me –数値データ(文字)をグラフィックに記入 set fillColor2 to NSColor’s blackColor() set resImage to drawImageWithString(resImage, drawList, fillColor2, plotData, "HiraginoSans-W1", 16.0) of me –補助線を引く set fillColor3 to (NSColor’s colorWithCalibratedRed:0.0 green:0.0 blue:0.0 alpha:0.8) set aVertical to current application’s NSMakeRect(origX, innerGapD, plotWidth – innerGapL – innerGapR, 1) set aHorizontal to current application’s NSMakeRect(origX, innerGapD, 1, plotHeight – innerGapU – innerGapD) set draw2List to {aVertical, aHorizontal} set resImage to drawImageWithColorFill(resImage, draw2List, fillColor3) of me –画像のファイル出力 set imgPath to POSIX path of (path to desktop folder) set aUUIDstr to (NSUUID’s UUID()’s UUIDString()) as string set aPath to ((NSString’s stringWithString:imgPath)’s stringByAppendingPathComponent:aUUIDstr)’s stringByAppendingPathExtension:"png" set fRes to saveImageRepAtPathAsPNG(resImage, aPath) of me –NSImageに対して文字を描画する on drawImageWithString(anImage, drawList, fillColor, dataList, aPSFontName, aFontSize) set retinaF to (NSScreen’s mainScreen()’s backingScaleFactor()) as real –> 2.0 (Retina) / 1.0 (Non Retina) set aDict to (current application’s NSDictionary’s dictionaryWithObjects:{current application’s NSFont’s fontWithName:aPSFontName |size|:aFontSize, fillColor} forKeys:{current application’s NSFontAttributeName, current application’s NSForegroundColorAttributeName}) anImage’s lockFocus() –描画開始 set aLen to length of drawList repeat with i from 1 to aLen set i1 to contents of item i of drawList set v2 to system attribute "sys2" if v2 ≤ 12 then –To macOS 10.12.x set origX to (x of origin of i1) / retinaF set origY to (y of origin of i1) / retinaF set sizeX to (width of |size| of i1) / retinaF set sizeY to (height of |size| of i1) / retinaF set theRect to {{x:origX, y:origY}, {width:sizeX, height:sizeY}} else –macOS 10.13 or later set origX to (item 1 of item 1 of i1) / retinaF set origY to (item 2 of item 1 of i1) / retinaF set sizeX to (item 1 of item 2 of i1) / retinaF set sizeY to (item 2 of item 2 of i1) / retinaF set theRect to {{origX, origY}, {sizeX, sizeY}} end if set aString to (current application’s NSString’s stringWithString:((contents of item i of dataList) as string)) (aString’s drawAtPoint:(current application’s NSMakePoint(origX + (sizeX / 2), sizeY)) withAttributes:aDict) end repeat anImage’s unlockFocus() –描画ここまで return anImage –returns NSImage end drawImageWithString –NSImageに対して矩形を塗りつぶす on drawImageWithColorFill(anImage, drawList, fillColor) set retinaF to (NSScreen’s mainScreen()’s backingScaleFactor()) as real –> 2.0 (Retina) / 1.0 (Non Retina) anImage’s lockFocus() –描画開始 repeat with i in drawList set v2 to system attribute "sys2" if v2 ≤ 12 then –To macOS 10.12.x 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 set theRect to {{x:origX, y:origY}, {width:sizeX, height:sizeY}} else –macOS 10.13 or later set origX to (item 1 of item 1 of i) / retinaF set origY to (item 2 of item 1 of i) / retinaF set sizeX to (item 1 of item 2 of i) / retinaF set sizeY to (item 2 of item 2 of i) / retinaF set theRect to {{origX, origY}, {sizeX, sizeY}} end if set theNSBezierPath to NSBezierPath’s bezierPath (theNSBezierPath’s appendBezierPathWithRect:theRect) fillColor’s |set|() –色設定 theNSBezierPath’s fill() –ぬりつぶし end repeat anImage’s unlockFocus() –描画ここまで return anImage –returns NSImage end drawImageWithColorFill –画像を指定パスに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 |
指定のムービーファイルのエクスポート可能な形式一覧を取得する
AppleScript名:指定のムービーファイルのエクスポート可能な形式一覧を取得する |
— Created 2016-10-24 by Shane Stanley use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AVFoundation" set posixPath to POSIX path of (choose file with prompt "Choose an Movie file:") set theURL to current application’s |NSURL|’s fileURLWithPath:posixPath set theAsset to current application’s AVAsset’s assetWithURL:theURL set allowedPresets to (current application’s AVAssetExportSession’s exportPresetsCompatibleWithAsset:theAsset) as list –> {"AVAssetExportPreset1920x1080", "AVAssetExportPresetLowQuality", "AVAssetExportPresetAppleM4V720pHD", "AVAssetExportPresetAppleM4VAppleTV", "AVAssetExportPresetAppleM4A", "AVAssetExportPreset640x480", "AVAssetExportPresetAppleProRes422LPCM", "AVAssetExportPreset3840x2160", "AVAssetExportPresetAppleM4VWiFi", "AVAssetExportPresetHighestQuality", "AVAssetExportPresetAppleM4VCellular", "AVAssetExportPreset1280x720", "AVAssetExportPresetMediumQuality", "AVAssetExportPresetAppleM4V1080pHD", "AVAssetExportPresetAppleM4V480pSD", "AVAssetExportPreset960x540", "AVAssetExportPresetAppleM4ViPod"} |
アニメーションGIFをフレームごとに画像に分解する
AppleScript名:アニメーションGIFをフレームごとにTIFF画像に分解する |
— Created 2016-11-29 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set gifFile to POSIX path of (choose file of type "com.compuserve.gif" with prompt "Select Animation-GIF file") set destFol to POSIX path of (choose folder with prompt "Select the folder to save gif’s frames") set anImage to current application’s NSImage’s alloc()’s initWithContentsOfFile:gifFile if anImage is equal to missing value then error "Illegal GIF Image" set anImgRep to anImage’s representations()’s firstObject() set framesNum to (anImgRep’s valueForProperty:"NSImageFrameCount") as integer repeat with i from 0 to (framesNum – 1) (anImgRep’s setProperty:"NSImageCurrentFrame" withValue:i) set aRep to (anImgRep’s representationUsingType:(current application’s NSTIFFFileType) |properties|:(missing value)) (aRep’s writeToFile:(destFol & (i as string) & ".tif") atomically:true) end repeat |
AppleScript名:アニメーションGIFをフレームごとにPNG画像に分解する |
— Created 2016-11-29 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set gifFile to POSIX path of (choose file of type "com.compuserve.gif" with prompt "Select Animation-GIF file") set destFol to POSIX path of (choose folder with prompt "Select the folder to save gif’s frames") set anImage to current application’s NSImage’s alloc()’s initWithContentsOfFile:gifFile if anImage is equal to missing value then error "Illegal GIF Image" set anImgRep to anImage’s representations()’s firstObject() set framesNum to (anImgRep’s valueForProperty:"NSImageFrameCount") as integer repeat with i from 0 to (framesNum – 1) (anImgRep’s setProperty:"NSImageCurrentFrame" withValue:i) set aRep to (anImgRep’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value)) (aRep’s writeToFile:(destFol & (i as string) & ".png") atomically:true) end repeat |
AppleScript名:アニメーションGIFをフレームごとにJPG画像に分解する |
— Created 2016-11-29 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set gifFile to POSIX path of (choose file of type "com.compuserve.gif" with prompt "Select Animation-GIF file") set destFol to POSIX path of (choose folder with prompt "Select the folder to save gif’s frames") set anImage to current application’s NSImage’s alloc()’s initWithContentsOfFile:gifFile if anImage is equal to missing value then error "Illegal GIF Image" set anImgRep to anImage’s representations()’s firstObject() set framesNum to (anImgRep’s valueForProperty:"NSImageFrameCount") as integer repeat with i from 0 to (framesNum – 1) (anImgRep’s setProperty:"NSImageCurrentFrame" withValue:i) set aRep to (anImgRep’s representationUsingType:(current application’s NSJPEGFileType) |properties|:(missing value)) (aRep’s writeToFile:(destFol & (i as string) & ".jpg") atomically:true) end repeat |
AppleScript名:アニメーションGIFをフレームごとにGIFF画像に分解する |
— Created 2016-11-29 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set gifFile to POSIX path of (choose file of type "com.compuserve.gif" with prompt "Select Animation-GIF file") set destFol to POSIX path of (choose folder with prompt "Select the folder to save gif’s frames") set anImage to current application’s NSImage’s alloc()’s initWithContentsOfFile:gifFile if anImage is equal to missing value then error "Illegal GIF Image" set anImgRep to anImage’s representations()’s firstObject() set framesNum to (anImgRep’s valueForProperty:"NSImageFrameCount") as integer repeat with i from 0 to (framesNum – 1) (anImgRep’s setProperty:"NSImageCurrentFrame" withValue:i) set aRep to (anImgRep’s representationUsingType:(current application’s NSGIFFileType) |properties|:(missing value)) (aRep’s writeToFile:(destFol & (i as string) & ".gif") atomically:true) end repeat |
MediaInfoKitでQuickTimeムービーから詳細な情報を取得する
MediaInfoKit.frameworkを呼び出して、QuickTimeムービーから詳細な情報を取得するAppleScriptです。
MediaInfoKit.framework(To ~/Library/Frameworks/)
AppleScript名:MediaInfoKitでQuickTimeムービーから詳細な情報を取得する |
— Created 2017-01-24 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "MediaInfoKit" –https://github.com/jeremyvizzini/MediaInfoKit set aMovie to POSIX path of (choose file) –(choose file of type {"com.apple.quicktime-movie"}) set aURL to current application’s |NSURL|’s fileURLWithPath:aMovie set aInfo to current application’s MIKMediaInfo’s alloc()’s initWithFileURL:aURL set a1info to aInfo’s valuesOfStream:"General" –Get Each Information set a2info to aInfo’s valueForKey:"Complete name" ofStream:"General" –> (NSString) "/Users/me/Desktop/IMG_0217.MOV" set a4Info to aInfo’s jsonText() –json形式で取得 –set a5Info to aInfo’s plistText()–plist形式で取得 –set a6Info to aInfo’s csvText()–csv形式で取得 –set a3Info to aInfo’s attributedText()–スタイルつきテキストで取得 —JSON to NSDictionary to record set jsonData to a4Info’s dataUsingEncoding:(current application’s NSUTF8StringEncoding) set aJsonDict to current application’s NSJSONSerialization’s JSONObjectWithData:jsonData options:0 |error|:(missing value) set aRec to aJsonDict as record –Movie file –> {General:{Encoded date:"UTC 2017-01-24 04:03:48", Format profile:"QuickTime", Overall bit rate mode:"Variable", Tagged date:"UTC 2017-01-24 04:04:40", Codec ID:"qt 0000.00 (qt )", com.apple.quicktime.software:"10.2", Format:"MPEG-4", Complete name:"/Users/me/Desktop/IMG_0219.MOV", Duration:"52 s 53 ms", File size:"50.8 MiB", Writing library:"Apple QuickTime", Overall bit rate:"8 191 kb/s", com.apple.quicktime.make:"Apple", com.apple.quicktime.model:"iPhone 7", com.apple.quicktime.creationdate:"2017-01-24T13:03:47+0900", com.apple.quicktime.location.ISO6709:"+35.xxxx+139.xxxx+043.xxx/"}, Video:{Minimum frame rate:"28.571 FPS", Display aspect ratio:"16:9", Bit depth:"8 bits", Scan type:"Progressive", Title:"Core Media Video", Chroma subsampling:"4:2:0", Color range:"Limited", Format/Info:"Advanced Video Codec", Frame rate:"29.970 (29970/1000) FPS", Bits/(Pixel*Frame):"0.292", Frame rate mode:"Variable", Format:"AVC", Matrix coefficients:"BT.709", Encoded date:"UTC 2017-01-24 04:03:48", Rotation:"90°", Height:"720 pixels", Color space:"YUV", Transfer characteristics:"BT.709", Duration:"52 s 53 ms", Bit rate:"8 079 kb/s", Codec ID:"avc1", ID:"1", Width:"1 280 pixels", Tagged date:"UTC 2017-01-24 04:04:40", Format profile:"High@L3.1", Color primaries:"BT.709", Maximum frame rate:"30.000 FPS", Stream size:"50.1 MiB (99%)", Codec ID/Info:"Advanced Video Coding", Format settings:"CABAC,Yes"}, Audio:{Other:"1", Title:"Core Media Audio", Channel(s):"1 channel", Format/Info:"Advanced Audio Codec", Frame rate:"43.066 FPS (1024 spf)", Sampling rate:"44.1 kHz", Source duration:"52 s 106 ms", Format:"AAC", Compression mode:"Lossy", Encoded date:"UTC 2017-01-24 04:03:48", Channel positions:"Front: C", Type:"meta", Duration:"52 s 53 ms", Bit rate mode:"Variable", Source stream size:"568 KiB (1%)", Bit rate:"89.3 kb/s", Codec ID:"40", ID:"2", Tagged date:"UTC 2017-01-24 04:04:40", Format profile:"LC", Stream size:"568 KiB (1%)"}} –Image file –> {General:{Format/Info:"Portable Network Graphic", Complete name:"/Users/me/Desktop/スクリーンショット 2.png", File size:"33.3 KiB", Format:"PNG"}, Image:{Height:"319 pixels", Format:"PNG", Bit depth:"32 bits", Format/Info:"Portable Network Graphic", Width:"352 pixels", Compression mode:"Lossless", Stream size:"33.3 KiB (100%)"}} |
ffmpegでムービーの静止画書き出し
QuickTimeムービーから指定ポイント(先頭からの再生秒)のフレームを静止画(PNG)に書き出すAppleScriptです。
ffmpegをバンドル内に格納して、それを呼び出すようにしています。ffmpegでフレーム抽出処理を行うと、QuickTime Playerに比べて処理時間がかかるようです。
AppleScript名:ffmpegでムービーの静止画書き出し |
— Created 2017-03-13 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AVFoundation" –Caution: Don’t run on ASObjc Explorer 4 property NSUUID : a reference to current application’s NSUUID property AVAsset : a reference to current application’s AVAsset property AVAssetImageGenerator : a reference to current application’s AVAssetImageGenerator property |NSURL| : a reference to current application’s |NSURL| set targTime to 320 –target duration (seconds) set inPath to choose file of type {"public.mpeg-4", "public.movie"} set outPathPosix to getImageFromMovie(inPath, targTime) of me on getImageFromMovie(inPath, outTime) –https://yuichon.com/2016/02/ffmpeg-install/ –https://www.npmjs.com/package/ffmpeg-static set ffmpegPath to POSIX path of (path to me) & "Contents/Resources/ffmpeg" –ffmpeg-static –Adjust the pickup frame duration of the target set aDuration to getMovieDurationInSeconds(inPath) of me if outTime > aDuration then set outTime to aDuration end if –Generate Out File Path set outPath to POSIX path of (path to desktop) set aUUID to NSUUID’s UUID()’s UUIDString() as string set outFullPath to (outPath & aUUID & ".png") set sText to ffmpegPath & space & "-i" & space & (quoted form of POSIX path of inPath) & space & "-ss " & (outTime as string) & space & "-vframes 1" & space & quoted form of outFullPath do shell script sText return outFullPath end getImageFromMovie –指定ムービーの再生時間を秒で取得する on getMovieDurationInSeconds(aMoviePathAlias) set aPOSIX to POSIX path of aMoviePathAlias set aURL to |NSURL|’s fileURLWithPath:aPOSIX set anAsset to AVAsset’s assetWithURL:aURL set imageGenerator to AVAssetImageGenerator’s alloc()’s initWithAsset:anAsset set durTimes to current application’s CMTimeGetSeconds(anAsset’s duration()) return durTimes end getMovieDurationInSeconds |
実行中のコンピュータのアイコン画像を取得してデスクトップにPNG形式で保存
AppleScript名:実行中のコンピュータのアイコン画像を取得してデスクトップにPNG形式で保存 |
— Created 2016-02-09 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" –Get Computer Icon set anImage to current application’s NSImage’s imageNamed:(current application’s NSImageNameComputer) set aDesktopPath to (current application’s NSProcessInfo’s processInfo()’s environment()’s objectForKey:("HOME"))’s stringByAppendingString:"/Desktop/" set savePath to aDesktopPath’s stringByAppendingString:((current application’s NSUUID’s UUID()’s UUIDString())’s stringByAppendingString:".png") set fRes to saveNSImageAtPathAsPNG(anImage, savePath) of me –NSImageを指定パスにPNG形式で保存 on saveNSImageAtPathAsPNG(anImage, outPath) set imageRep to anImage’s TIFFRepresentation() set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep set pathString to current application’s NSString’s stringWithString:outPath set newPath to pathString’s stringByExpandingTildeInPath() set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value)) set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean return aRes –成功ならtrue、失敗ならfalseが返る end saveNSImageAtPathAsPNG |
TwitterへのTweet文字数チェック
Twitterへの投稿可能な文字数のチェックを行うAppleScriptです。
Twitterへの投稿可能な文字数の計算は、なかなか頭の痛い処理です。つい先日廃止されたMac版のクライアントアプリケーションはついに最後まで正しい文字数をカウントできていませんでした(本来の仕様よりも少ない文字数しか投稿できなかった)。
# macOS 10.15以降向けにCatalystアプリケーションとしてMac用クライアントが再公開されました。が……
Twitter, IncがGithubで公開しているフレームワーク「twitter-text」を使えば、Tweet文字数カウントシミュレーションを行えるようだったので、フレームワークをXcodeでビルドして試してみました。
この(↑)テスト文字列は、普通にlengthで文字数をカウントすると155文字ですが、Twitterの文字カウントロジックを用いると139文字。実際にTwitterのWebサイト上から投稿してみると、なるほどたしかにエラーになりません(じゃあなんでMac版のTwitterクライアントにこの機能が乗ってなかったんだろう。とっても不思議)。
TwitterText.framework (To ~/Library/Frameworks/)
AppleScript名:TwitterへのTweet文字数チェック |
— Created 2018-04-03 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "TwitterText" –https://github.com/twitter/twitter-text set aText to "【Twitter文字数カウントテスト】:MS Cognitive Serviceに画像認識させてみたら、前回認識させた時よりも突っ込んだ情景描写のテキストが返ってきた。前回「犬」と認識されたイルカは「なんかの泳いでいる動物」と認識。https://github.com/twitter/twitter-text" set aParser to current application’s TwitterTextParser’s defaultParser()’s parseTweet:aText set aLen to aParser’s weightedLength() –> 139 set aPerm to aParser’s permillage() –Twitter文字数Fullで1,000 –> 992 set aValid to aParser’s isValid() as boolean –> true set aRange to aParser’s displayTextRange() –> {location:0, length:155} set aVDTRange to aParser’s validDisplayTextRange() –> {location:0, length:155} |