Archive for the 'NSImage' Category

2017/04/27 単色画像(アルファ値必要)に色を指定して塗りつぶし

背景を透明(アルファ値指定)にした単色の画像に、指定の色を指定して塗りつぶしを行うAppleScriptです。

input_and_output.png

単色の画像を作成して、指定画像との合成を行い「塗りつぶし」の状態を作り出すものです。Photoshopを使えば、あっという間にできてしまう処理ですが、Photoshopは並列処理に使えないのでこうした部品を作っておいたものです。

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

★Click Here to Open This Script 

2017/04/26 指定画像の余白の自動トリミング

オープンソースのKGPixelBoundsClip(By David Keegan)をフレームワーク化した「KGPixelBoundsClipKit」を呼び出して指定画像を自動でトリミングするAppleScriptです。

OS X 10.10以降用にビルドしたフレームワークのバイナリを用意しておきました。興味のある方は自己責任で~/Library/Frameworksフォルダに入れてお試しください。

–> Download Framework Binary

指定画像(背景を透明に指定したPNGで実行)を自動トリミングして、デスクトップに結果を書き出します。

Photoshopにも同様の機能があったような記憶がありますが、フレームワーク経由で実行することで並列処理を行いやすい部品を作っておくことが目的です。

original_and_trimed.png

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
–http://piyocast.com/as/archives/4611

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

★Click Here to Open This Script 

2017/04/24 画像中の色の置き換え

オープンソースのNSImage-replace-color(By braginets)をフレームワーク化した「replaceColorKit」を呼び出して指定画像中の指定色を置き換えるAppleScriptです。

OS X 10.10以降用にビルドしたフレームワークのバイナリを用意しておきました。興味のある方は自己責任で~/Library/Frameworksフォルダに入れてお試しください。

–> Download Framework Binary

piyo_wolf.png
▲Original

piyo_gray_02.png
▲Color Replaced Image (Yellow->Gray)

rep_doc.png

R, G, Bのグラデーション画像を作成して、色の置き換えをテストしてみたところ、置き換え色がR:255やB:255の色の場合に置き換え色がやや変わってしまうという傾向があるようです。

specificated_sampledata.png

rep_color_diff.png

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"
–http://piyocast.com/as/archives/4604

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

★Click Here to Open This Script 

2017/03/21 CoreImage(CIFilter)で指定画像を2階調ポスタライズ v2

CoreImageのCIFilterを用いて、指定の画像を2階調でポスタライズするAppleScriptです。

CPUImageにも同様のポスタライズ用のフィルタが存在しているのですが、パラメータを指定してもうまく効かなかったので、CIFilterを使ってみました。

6ba2129c-12c5-42bf-b1a6-48dc883a97ec.png
▲実行前

81421d35-72aa-4d9d-9e6b-e2c59f9c9109.png
▲実行後

AppleScript名:CoreImageで指定画像を2階調ポスタライズ v2
– Created 2017-03-21 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ASObjCExtras”
use framework “QuartzCore”
–http://piyocast.com/as/archives/4541

–画像を選択
set aPath to POSIX path of (choose file of type {“public.image”})
set aNSImage to current application’s NSImage’s alloc()’s initWithContentsOfFile:aPath

set imgRes to execCIFilterWithNSImage(aNSImage, “CIColorPosterize”) 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 NSUUID’s UUID()’s UUIDString())’s stringByAppendingString:“.png”)

set fRes to saveNSImageAtPathAsPNG(imgRes, savePath) of me

on convCIimageToNSImage(aCIImage)
  set aRep to current application’s NSBitmapImageRep’s alloc()’s initWithCIImage:aCIImage
  
set tmpSize to aRep’s |size|()
  
set newImg to current application’s NSImage’s alloc()’s initWithSize:tmpSize
  
newImg’s addRepresentation:aRep
  
return newImg
end convCIimageToNSImage

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をCIImageに変換してCIfilterを実行
on execCIFilterWithNSImage(aNSImage, aFilterName)
  set aCIImage to convNSImageToCIimage(aNSImage) of me
  
  
set aFilter to current application’s CIFilter’s filterWithName:aFilterName
  
aFilter’s setDefaults()
  
aFilter’s setValue:aCIImage forKey:“inputImage”
  
aFilter’s setValue:2 forKey:“inputLevels”
  
set aOutImage to aFilter’s valueForKey:“outputImage”
  
  
set newNSImage to convCIimageToNSImage(aOutImage) of me
  
return newNSImage
end execCIFilterWithNSImage

–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

★Click Here to Open This Script 

2017/03/21 CIImageとNSImageの相互変換

CIImageとNSImageの相互変換を行うAppleScriptです。

ファイル入出力をはじめ、さまざまな処理を行う場合にはNSImageで指定するように各種ライブラリの入出力を統一するようにしています。そのため、CIFilterを利用するような場合でもNSImageで画像データを渡すようにしています。

CIFilterを実行するサブルーチン内では、CoreImageで画像データを扱うのでCIImageで画像を渡す必要があるためCIImageに変換してFilter処理を行い、その後にNSImageに変換して結果を返すようにしています。

似たような名前のオブジェクトとして「CGImage」(CoreGraphicsの)がありますが、これはAppleScript側からは手が出ないオブジェクトに見えます。少なくとも、自分はCGImageと他フォーマットとの変換についてはやり方はわかりません。

AppleScript名:CIImageとNSImageの相互変換
– Created 2017-03-21 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/4540

–Get Computer Icon (NSImage)
set anImage to current application’s NSImage’s imageNamed:(current application’s NSImageNameComputer)

set aCIImage to convNSImageToCIimage(anImage) of me
–> (CIImage)

set bNSImage to convCIimageToNSImage(aCIImage) of me
–> (NSImage)

on convCIimageToNSImage(aCIImage)
  set aRep to current application’s NSBitmapImageRep’s alloc()’s initWithCIImage:aCIImage
  
set tmpSize to aRep’s |size|()
  
set newImg to current application’s NSImage’s alloc()’s initWithSize:tmpSize
  
newImg’s addRepresentation:aRep
  
return newImg
end convCIimageToNSImage

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

★Click Here to Open This Script 

2017/03/11 256×3のグラフ画像を縦方向に拡大する v2

GPUImage.frameworkの明度ヒストグラムの出力画像を加工するために作成したAppleScriptの改良版です。

256×3ドットの画像から、

6ed48d0a-5718-4562-9ad3-b7a63269678f.png

明度ヒストグラムのデータ部分である中央の256×1ドットのパターンを切り抜いて取得。そのパターンで256×90の空白の画像を塗りつぶして保存します。

53da8086-f585-4d45-9d4b-e5b9ceee7f03.png

最初のバージョンでは、バカていねいに元の画像の色情報を読み取って、その通りに新規画像に点で描画していました。そのため、処理に数秒(4秒ぐらい?)かかっていました。

本バージョンは、MacBook Pro Retina 2012(Core i7 2.66GHz)で0.008秒ぐらいでファイル書き込みも含めて終了します。

AppleScript名:256×3のグラフ画像を縦方向に拡大する v2
– Created 2017-03-11 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
–http://piyocast.com/as/archives/4522

set aHeight to 90
set aWidth to 256

set aPath to POSIX path of (choose file of type {“public.image”})
set anImage to current application’s NSImage’s alloc()’s initWithContentsOfFile:aPath

–256×1で切り抜き
set bImage to my cropNSImageBy:{0, 1, 256, 1} fromImage:anImage
set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:(anImage’s TIFFRepresentation())

–256×90の画像を作成
set cImage to current application’s NSImage’s alloc()’s initWithSize:(current application’s NSMakeSize(aWidth, aHeight))

–256×1のパターンでぬりつぶし
set theRect to {{x:0, y:0}, {height:aHeight, width:aWidth}}
cImage’s lockFocus()
(
current application’s NSColor’s colorWithPatternImage:bImage)’s |set|()
current application’s NSBezierPath’s fillRect:theRect
cImage’s unlockFocus()

–PNG形式で保存
set aPath to (POSIX path of (path to desktop) & (current application’s NSUUID’s UUID())’s UUIDString() as string) & “.png”
saveNSImageAtPathAsPNG(cImage, aPath)

–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

–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 current application’s NSBitmapImageRep’s alloc()’s initWithFocusedViewRect:newRect
  
theImage’s unlockFocus()
  
  
set outImage to current application’s NSImage’s alloc()’s initWithSize:(theRep’s |size|())
  
outImage’s addRepresentation:theRep
  
  
return outImage
end cropNSImageBy:fromImage:

★Click Here to Open This Script 

2017/03/09 ASCIImageでPNG画像をデスクトップに作成する

オープンソースのプログラム「ASCIImage」(By Charles Parnot)を用いて、ASCII ARTからPNG画像を作成するAppleScriptです。AppleScriptからの呼び出しは、同プログラムをフレームワーク化した「asciiImageKit」を経由しています。

本AppleScriptのテストのためには、asciiImageKit.frameworkを~/Library/Frameworksフォルダに入れておく必要があります。バイナリを用意しておきましたので、自己責任でおためしください。

Download Binary (30KB)

ASCIImageは(どうして作者がこれを作ったのかが)とても不思議なプログラムで、画像描画を文字で(ASCII ARTっぽく)指定するとNSImageが得られます。NSImageが得られれば、あとはPNGなりJPEGなり好みの画像フォーマットで書き出しできます。

ascii1.png
▲shouldAntialias=falseでレンダリングした画像

ascii2.png
▲shouldAntialias=trueでレンダリングした画像

inv.png
▲自分でデータ作成をこころみてみたものの、思い通りに描画されなかったデータ。コツが必要なのか意外と難しい、、、、

AppleScript名:ASCIImageでPNG画像をデスクトップに作成する
– Created 2017-03-09 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “asciiImageKit” –https://github.com/cparnot/ASCIImage
use framework “AppKit”
–http://piyocast.com/as/archives/4517

set aColor to current application’s NSColor’s blackColor()

set aRep to {· · · 1 2 · · · · ·, ¬
  · · · A # # · · · ·, ¬
  
· · · · # # # · · ·, ¬
  
· · · · · # # # · ·, ¬
  
· · · · · · 9 # 3 ·, ¬
  
· · · · · · 8 # 4 ·, ¬
  
· · · · · # # # · ·, ¬
  
· · · · # # # · · ·, ¬
  
· · · 7 # # · · · ·, ¬
  
· · · 6 5 · · · · ·}

set anImage to current application’s NSImage’s imageWithASCIIRepresentation:aRep |color|:aColor shouldAntialias:false

set aPath to (POSIX path of (path to desktop) & (current application’s NSUUID’s UUID())’s UUIDString() as string) & “.png”
set fRes to saveNSImageAtPathAsPNG(anImage, aPath) 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

★Click Here to Open This Script 

2017/03/02 指定の画像が真っ白かどうか判定する

オープンソースのフレームワーク「GPUImage」(By Brad Larson)を利用して、指定の画像が真っ白かどうかを判定するAppleScriptです。指定画像が真っ白の場合にはtrueを、そうでない場合にはfalseを返します。

テストにあたっては、GPUImageフレームワークをXcodeでビルドして、~/Library/Frameworksフォルダに入れておいてください。

GPUImage.frameworkには特殊なフィルタが存在しており、その中で最もユニークなのが指定画像(NSImage)のヒストグラムを求めるものです。つまり、画像をフィルタ加工するのではなく、分析した結果を画像(NSImage)に出力します。

そのうちの「明度ヒストグラム」のフィルタ(?)を指定して、指定画像の明度分布を求めます(一瞬で)。明度分布のヒストグラムは、横256ドット・高さ3ドットの画像(NSImage)として出力されます。うち、中央の1ドットが左側が0(暗い=黒)右側が255(明るい=白)を表現しています。

white.png
▲GPUImage.frameworkで出力した明度ヒストグラム(真っ白な画像を処理した場合)。幅256ドット、高さ3ドットの画像(高さを90ドットに拡大)。右端(明度=255)のみ白く反応しており、他に明度分布は存在しないことが見て取れる

test2.png

test1.png
▲GPUImage.frameworkで出力した明度ヒストグラム(真っ白ではない画像を処理した場合の処理例)

つまり、画像が真っ白かどうかを判定するという、気が遠くなるほど重そうな画像処理が、わずか256箇所の色情報を調べるだけで、しかもGPUの機能を活用して一瞬で処理できることになります。しかも、AppleScriptで。

  1024×768@72DPIの画像=786,432ドット
  1920×1200@72DPIの画像=2,304,000ドット

これらを全部ループで色検出処理すると、相当の時間がかかるはずです。230万アイテム超のループ処理なんて想像したくもありません。

一応、テストのために、

  1024×768@72DPIの画像で、1ドットだけ黒くしたもの
  1920×1200@72DPIの画像で、1ドットだけ黒くしたもの

の2つを用意して、黒くした1ドットの存在を検出できるかテストしてみたところ、無事検出できました(しかも一瞬で)。

ただし、このことが4Kとか5Kの白い画像に1ドットだけ黒くした場合でも同様に検出できるかどうかは保証のかぎりではありません。

実際に利用するさいには事前にターゲットサイズの白い画像に1ドットだけ黒くして実験して検出可能かどうかを確認。検出できなかった場合には事前に解像度を落とす処理を行うなどの対応が必要です。

AppleScript名:指定の画像が真っ白かどうか判定する
– Created 2017-02-12 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
use framework “GPUImage”
–http://piyocast.com/as/archives/4492

set aFile to POSIX path of (choose file of type {“public.image”} with prompt “Select a Image to check it is white (or not) “)
set anNSImage to current application’s NSImage’s alloc()’s initWithContentsOfFile:aFile
set wRes to my detectAllWhite:anNSImage

–指定のNSImageが真っ白かどうかをチェック
on detectAllWhite:anNSImage
  
  
–明度ヒストグラム画像を取得
  
set imgRes to getHistogramFromImage(anNSImage, 4) of me
  
  
set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:(imgRes’s TIFFRepresentation())
  
  
–白い画像のデータパターン
  
set aWhitePattern to current application’s NSMutableArray’s arrayWithArray:{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}
  
  
set resArray to current application’s NSMutableArray’s alloc()’s init()
  
repeat with i from 0 to 255
    set origColor to (aRawimg’s colorAtX:i y:1)
    
set srgbColSpace to current application’s NSColorSpace’s genericGrayColorSpace
    
set aColor to (origColor’s colorUsingColorSpace:srgbColSpace)
    
set aWhite to aColor’s whiteComponent()
    (
resArray’s addObject:aWhite)
  end repeat
  
  
set aRes to (resArray’s isEqualTo:aWhitePattern) as boolean
  
return aRes
  
end detectAllWhite:

–指定のNSImageをGPUImage.frameworkで明度ヒストグラム化してNSImageで返す
on getHistogramFromImage(aNSImage, histogramType)
  set aFilter to current application’s GPUImageHistogramFilter’s alloc()’s initWithHistogramType:histogramType
  
set aProcImg to (aFilter’s imageByFilteringImage:aNSImage)
  
return aProcImg
end getHistogramFromImage

–NSImageをGPUImage.frameworkの指定フィルタで処理してNSImageを返す
on filterWithNSImage(aNSImage, filterName as string)
  set aClass to current application’s NSClassFromString(filterName)
  
set aImageFilter to aClass’s alloc()’s init()
  
set aProcImg to (aImageFilter’s imageByFilteringImage:aNSImage)
  
return aProcImg
end filterWithNSImage

★Click Here to Open This Script 

2017/02/05 GPUImageで画像にすべてのフィルタを実行してデスクトップにPNG形式で保存

オープンソースのフレームワーク「GPUImage」(By Brad Larson)を呼び出して、指定画像にGPUImageのすべてのフィルタを実行して、デスクトップにフィルタ名でPNGに保存するAppleScriptです。

テストにあたっては、GPUImageフレームワークをXcodeでビルドして、~/Library/Frameworksフォルダに入れておいてください。

ドキュメントによれば125種類ものフィルタを内蔵しているというGPUImageですが、どれがどのような処理を行ってくれるのかは、実際に呼び出してみないとわかりません。また、単に呼び出して画像にフィルタを実行しただけでは記述内容が不足しているというものもありそうです(パラメータを指定しないと意味がないケース、フィルタが仕様の都合で複数の画像を要求するものも)。

そこで、ヘッダーファイルからすべてのフィルタ名称を取り出して、ループで順次実行させてみました。デスクトップにフィルター名称でPNG画像を書き出します。

ヘッダーファイルに記載されていたフィルターとおぼしきものが145、うち実行可能だったものが100、エラーが45となりました。また、エラーは出なかったものの何らかのパラメータを指定しないとおそらく意味がない(オリジナル画像と変わらない)ものもありました。

samples_out.png

フィルタをallocしてinitした段階でエラーが出るものもあったり、エラーをキャッチできるまでに時間がかかるものもありましたが、with timedoutでタイムアウト時間を指定してもエラーとして検出することはできませんでした。

フレームワークを呼び出すのはAppleEventの枠組みの中でやっているわけではないはずなので、タイムアウトを仕掛けて適用されなくても仕方ありません。

AppleScript名:GPUImageで画像にすべてのフィルタを実行してデスクトップにPNG形式で保存
– Created 2017-02-05 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
use framework “GPUImage”
–https://github.com/BradLarson/GPUImage
–http://piyocast.com/as/archives/4441

–Read JPEG file
set aFile to POSIX path of (choose file of type {“public.image”})
set anImage to current application’s NSImage’s alloc()’s initWithContentsOfFile:aFile

–Select Filter
set erroredFilter to {}
set aList to {“GPUImageFilter”, “GPUImageTwoPassFilter”, “GPUImage3×3TextureSamplingFilter”, “GPUImageContrastFilter”, “GPUImageSaturationFilter”, “GPUImageBrightnessFilter”, “GPUImageLevelsFilter”, “GPUImageExposureFilter”, “GPUImageRGBFilter”, “GPUImageHueFilter”, “GPUImageWhiteBalanceFilter”, “GPUImageMonochromeFilter”, “GPUImagePixellateFilter”, “GPUImageSobelEdgeDetectionFilter”, “GPUImageSketchFilter”, “GPUImageToonFilter”, “GPUImageGrayscaleFilter”, “GPUImageKuwaharaFilter”, “GPUImageFalseColorFilter”, “GPUImageSharpenFilter”, “GPUImageUnsharpMaskFilter”, “GPUImageTwoInputFilter”, “GPUImageGaussianBlurFilter”, “GPUImageTwoPassTextureSamplingFilter”, “GPUImageFilterGroup”, “GPUImageTransformFilter”, “GPUImageCropFilter”, “GPUImageGaussianBlurPositionFilter”, “GPUImageGaussianSelectiveBlurFilter”, “GPUImageBilateralFilter”, “GPUImageBoxBlurFilter”, “GPUImageSingleComponentGaussianBlurFilter”, “GPUImageMedianFilter”, “GPUImageMotionBlurFilter”, “GPUImageZoomBlurFilter”, “GPUImageAddBlendFilter”, “GPUImageColorBurnBlendFilter”, “GPUImageDarkenBlendFilter”, “GPUImageDivideBlendFilter”, “GPUImageLightenBlendFilter”, “GPUImageMultiplyBlendFilter”, “GPUImageOverlayBlendFilter”, “GPUImageColorDodgeBlendFilter”, “GPUImageLinearBurnBlendFilter”, “GPUImageScreenBlendFilter”, “GPUImageColorBlendFilter”, “GPUImageExclusionBlendFilter”, “GPUImageHueBlendFilter”, “GPUImageLuminosityBlendFilter”, “GPUImageNormalBlendFilter”, “GPUImagePoissonBlendFilter”, “GPUImageSaturationBlendFilter”, “GPUImageSoftLightBlendFilter”, “GPUImageHardLightBlendFilter”, “GPUImageSubtractBlendFilter”, “GPUImageTwoInputCrossTextureSamplingFilter”, “GPUImageDifferenceBlendFilter”, “GPUImageDissolveBlendFilter”, “GPUImageChromaKeyBlendFilter”, “GPUImageMaskFilter”, “GPUImageOpacityFilter”, “GPUImageAlphaBlendFilter”, “GPUImageColorMatrixFilter”, “GPUImageSepiaFilter”, “GPUImageGammaFilter”, “GPUImageHazeFilter”, “GPUImageToneCurveFilter”, “GPUImageHighlightShadowFilter”, “GPUImageLookupFilter”, “GPUImageAmatorkaFilter”, “GPUImageMissEtikateFilter”, “GPUImageSoftEleganceFilter”, “GPUImage3×3ConvolutionFilter”, “GPUImageEmbossFilter”, “GPUImageLaplacianFilter”, “GPUImageLanczosResamplingFilter”, “GPUImageThreeInputFilter”, “GPUImageFourInputFilter”, “GPUImageColorInvertFilter”, “GPUImageHistogramFilter”, “GPUImageHistogramGenerator”, “GPUImageAverageColor”, “GPUImageLuminosity”, “GPUImageSolidColorGenerator”, “GPUImageAdaptiveThresholdFilter”, “GPUImageAverageLuminanceThresholdFilter”, “GPUImageLuminanceThresholdFilter”, “GPUImageSolarizeFilter”, “GPUImageHalftoneFilter”, “GPUImagePixellatePositionFilter”, “GPUImagePolarPixellateFilter”, “GPUImagePolkaDotFilter”, “GPUImageCrosshatchFilter”, “GPUImageXYDerivativeFilter”, “GPUImageDirectionalNonMaximumSuppressionFilter”, “GPUImageDirectionalSobelEdgeDetectionFilter”, “GPUImageCannyEdgeDetectionFilter”, “GPUImagePrewittEdgeDetectionFilter”, “GPUImageThresholdEdgeDetectionFilter”, “GPUImageHarrisCornerDetectionFilter”, “GPUImageNobleCornerDetectionFilter”, “GPUImageShiTomasiFeatureDetectionFilter”, “GPUImageThresholdedNonMaximumSuppressionFilter”, “GPUImageColorPackingFilter”, “GPUImageHoughTransformLineDetector”, “GPUImageParallelCoordinateLineTransformFilter”, “GPUImageCrosshairGenerator”, “GPUImageLineGenerator”, “GPUImageBuffer”, “GPUImageLowPassFilter”, “GPUImageHighPassFilter”, “GPUImageMotionDetector”, “GPUImageThresholdSketchFilter”, “GPUImageSmoothToonFilter”, “GPUImageTiltShiftFilter”, “GPUImageCGAColorspaceFilter”, “GPUImagePosterizeFilter”, “GPUImageKuwaharaRadius3Filter”, “GPUImageChromaKeyFilter”, “GPUImageVignetteFilter”, “GPUImageBulgeDistortionFilter”, “GPUImagePinchDistortionFilter”, “GPUImageStretchDistortionFilter”, “GPUImageClosingFilter”, “GPUImageRGBClosingFilter”, “GPUImageDilationFilter”, “GPUImageRGBDilationFilter”, “GPUImageErosionFilter”, “GPUImageRGBErosionFilter”, “GPUImageOpeningFilter”, “GPUImageRGBOpeningFilter”, “GPUImageSphereRefractionFilter”, “GPUImageGlassSphereFilter”, “GPUImageSwirlFilter”, “GPUImageJFAVoronoiFilter”, “GPUImageVoronoiConsumerFilter”, “GPUImageLocalBinaryPatternFilter”, “GPUImageColorLocalBinaryPatternFilter”, “GPUImageMosaicFilter”, “GPUImagePerlinNoiseFilter”, “GPUImageWeakPixelInclusionFilter”, “GPUImageNonMaximumSuppressionFilter”, “GPUImageSourceOverBlendFilter”, “GPUImageColourFASTFeatureDetector”, “GPUImageColourFASTSamplingOperation”}

repeat with i in aList
  set j to contents of i
  
set aClass to current application’s NSClassFromString(j)
  
  
–Filter Image
  
set errorFlag to true
  
try
    with timeout of 5 seconds
      set stillImageFilter to aClass’s alloc()’s init()
      
set aProcImg to (stillImageFilter’s imageByFilteringImage:anImage)
    end timeout
  on error erM
    set the end of erroredFilter to {j, erM, 1}
    
set errorFlag to false
  end try
  
  
if errorFlag = true then
    –Make New File Name
    
set aPath to (((current application’s NSString’s stringWithString:aFile)’s stringByDeletingLastPathComponent()’s stringByAppendingPathComponent:j)’s stringByAppendingPathExtension:“png”)
    
try
      set sRes to saveNSImageAtPathAsPNG(aProcImg, aPath as string) of me
    on error erM
      set the end of erroredFilter to {j, erM, 2}
    end try
  end if
end repeat

return erroredFilter
–> {{”GPUImageTwoInputFilter”, “missing valueは“representationUsingType_properties_”メッセージを認識できません。”, 2}, …..

–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

★Click Here to Open This Script 

2017/02/05 GPUImageで画像にGPUImageMonochromeFilterを実行してデスクトップにPNG形式で保存

オープンソースのフレームワーク「GPUImage」(By Brad Larson)を呼び出して、指定画像にフィルタ(モノクローム画像化)を実行して、デスクトップにPNGで保存するAppleScriptです。

テストにあたっては、GPUImageフレームワークをXcodeでビルドして、~/Library/Frameworksフォルダに入れておいてください。

GPUImageはもともとiOSデバイス用に作られたようですが、Macもサポートしており、さまざまな(125種類もの)画像フィルタが用意されており、手軽に利用できます。CoreImageをAppleScriptから呼び出してフィルタを実行してみたこともありますが、CoreImageよりも手軽に感じられました。

フィルタ実行部分は2行だけで、ファイルを選択したり画像を保存する部分がほとんどなので、やることはほとんどありません。ある意味、Photoshopを呼び出すよりも手軽です。

img_0007_resized.png
▲実行前のオリジナル画像(Haneda Airport, Tokyo, Japan)

a5dfc34c-d1e4-47e6-8379-f46412dbc30d_resized.png
▲GPUImageMonochromeFilterを実行した画像

AppleScript名:GPUImageで画像にGPUImageMonochromeFilterを実行してデスクトップにPNG形式で保存
– Created 2017-02-05 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
use framework “GPUImage”
–https://github.com/BradLarson/GPUImage
–http://piyocast.com/as/archives/4438

–Read JPEG file
set aFile to POSIX path of (choose file of type {“public.image”})
set anImage to current application’s NSImage’s alloc()’s initWithContentsOfFile:aFile

–Filter Image
set stillImageFilter to current application’s GPUImageMonochromeFilter’s alloc()’s init()
set aProcImg to stillImageFilter’s imageByFilteringImage:anImage

–Make New File Name
set aUUIDstr to (current application’s NSUUID’s UUID()’s UUIDString()) as string
set aPath to ((current application’s NSString’s stringWithString:aFile)’s stringByDeletingLastPathComponent()’s stringByAppendingPathComponent:aUUIDstr)’s stringByAppendingPathExtension:“png”
set sRes to saveNSImageAtPathAsPNG(aProcImg, aPath as string) 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

★Click Here to Open This Script 

2017/02/03 倍率を指定してNSImageをリサイズする

与えられたNSImageをリサイズするAppleScriptです。

実行サンプルとして、実行中のコンピュータの画像(NSImageNameComputer)をNSImageで取得、このNSImageを16倍の大きさにリサイズし、指定場所&名称でPNG形式で保存します。

AppleScript名:NSImageの倍率を変更してNSImageをリサイズする
– Created 2017-02-03 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
–http://stackoverflow.com/questions/11949250/how-to-resize-nsimage
–http://piyocast.com/as/archives/4437

set aPath to POSIX path of (choose file name with prompt “Enter PNG file name”)

–Get Computer Icon
set anImage to current application’s NSImage’s imageNamed:(current application’s NSImageNameComputer)

–Resize it to x16
set resizedImg to my resizedImage:anImage toScale:16
set aRes to saveNSImageAtPathAsPNG(resizedImg, aPath) of me

on resizedImage:aSourceImg toScale:imgScale
  if (aSourceImg’s isValid()) as boolean = false then error “Invalid NSImage”
  
  
set aSize to aSourceImg’s |size|()
  
–>  {width:32.0, height:32.0}
  
  
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()
  
current application’s NSGraphicsContext’s setCurrentContext:(current application’s NSGraphicsContext’s graphicsContextWithBitmapImageRep:aRep)
  
  
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 resizedImage:toScale:

–NSImageを指定パスにPNG形式で保存
on saveNSImageAtPathAsPNG(anImage, outPath)
  –画像のRaw画像を作成
  
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

★Click Here to Open This Script 

2016/12/05 アニメーションGIFをフレームごとに画像に分解する

アニメーションGIFを指定すると、指定フォルダ内にフレームごとに個別の連番GIF画像に分解出力するAppleScriptです。

AppleScript名:アニメーションGIFをフレームごとに画像に分解する
– Created 2016-11-29 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
–http://piyocast.com/as/archives/4341

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

★Click Here to Open This Script 

2016/09/20 連番JPEGファイルを読み込んで連結したPDFを作成(新規作成)

連番JPEG画像を番号順にソートして、順次連結したPDFを新規作成するAppleScriptです。

jpeg_catfiles.jpg

このような連番画像を連結して任意のファイル名のPDFに合成します。出来上がるPDFは、元のJPEGファイルの圧縮度に応じて大きくなります。

新規作成よりも、すでに存在しているPDFにJPEGファイルを連結するほうが実用的だと思います。

AppleScript名:連番JPEGファイルを読み込んで連結したPDFを作成(新規作成)
– Created 2016-09-20 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “QuartzCore”
use framework “Quartz”
use framework “AppKit”

set aExt to “.jpg”
set aFol to choose folder
set fList to getFilePathList(aFol, aExt) of me
set f2List to my sort1DList:fList ascOrder:true –sort by ascending

set newFile to POSIX path of (choose file name with prompt “新規PDFファイルの名称を選択”)
set newFilePath to current application’s NSString’s stringWithString:newFile

–Make Blank PDF
set aPDFdoc to current application’s PDFDocument’s alloc()’s init()

set pageNum to 0

repeat with i in f2List
  set j to contents of i
  
set aURL to (current application’s |NSURL|’s fileURLWithPath:j)
  
set bImg to (current application’s NSImage’s alloc()’s initWithContentsOfURL:aURL)
  (
aPDFdoc’s insertPage:(current application’s PDFPage’s alloc()’s initWithImage:bImg) atIndex:pageNum)
  
set pageNum to pageNum + 1
end repeat

aPDFdoc’s writeToFile:newFilePath

–ASOCで指定フォルダのファイルパス一覧取得(拡張子指定つき)
on getFilePathList(aFol, aExt)
  set aPath to current application’s NSString’s stringWithString:(POSIX path of aFol)
  
set aFM to current application’s NSFileManager’s defaultManager()
  
set nameList to (aFM’s contentsOfDirectoryAtPath:aPath |error|:(missing value)) as list
  
set anArray to current application’s NSMutableArray’s alloc()’s init()
  
  
repeat with i in nameList
    set j to i as text
    
if (j ends with aExt) and (j does not start with “.”) then –exclude invisible files
      set newPath to (aPath’s stringByAppendingString:j)
      (
anArray’s addObject:newPath)
    end if
  end repeat
  
  
return anArray as list
end getFilePathList

–1D List(文字)をsort / ascOrderがtrueだと昇順ソート、falseだと降順ソート
on sort1DList:theList ascOrder:aBool
  set aDdesc to current application’s NSSortDescriptor’s sortDescriptorWithKey:“self” ascending:aBool selector:“localizedCaseInsensitiveCompare:”
  
set theArray to current application’s NSArray’s arrayWithArray:theList
  
return (theArray’s sortedArrayUsingDescriptors:{aDdesc}) as list
end sort1DList:ascOrder:

★Click Here to Open This Script 

2016/07/27 PDFをページごとに分解してJPEGで保存する v2

PDFをページごとに分解してJPEG画像で保存するAppleScriptのアップデート版です。

実際に連番画像に変換して、ePub書類に変換させてみたらページの順序が狂ってしまいました。連番を振るときにゼロパディングしなかったためだとすぐにわかったので、ゼロパディングの処理を追加したものです。

ただし、実際にはこれだと解像度が不足しており、2倍の解像度で出力するように改良して実戦投入(Retina Display環境に配慮しつつ)しました。

AppleScript名:ASOCでPDFをページごとに分解してJPEGで保存する v2
– Created 2014-12-26 by Takaaki Naganoya
– Modified 2015-09-26 by Takaaki Naganoya
– Modified 2015-10-01 by Takaaki Naganoya
– Modified 2016-07-27 by Takaaki Naganoya–save each PDF page as jpeg
– Modified 2016-07-27 by Takaaki Naganoya–added zero padding function
– 2016 Piyomaru Software
# http://piyocast.com/as/archives/4176

use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “Quartz”
use framework “QuartzCore”
use framework “AppKit”

set aHFSPath to (choose file of type {“com.adobe.pdf”} with prompt “ページごとに分解するPDFを指定してください”)
set aPOSIX to POSIX path of aHFSPath
set aURL to (current application’s |NSURL|’s fileURLWithPath:aPOSIX)

set aPOSIXpath to POSIX path of aHFSPath —書き出し先パスをPOSIX pathで用意しておく(あとで加工)

set aPDFdoc to current application’s PDFDocument’s alloc()’s initWithURL:aURL
set pCount to aPDFdoc’s pageCount()

set compFactor to 1.0 – 0.0 = max jpeg compression, 1.0 = none

–PDFをページごとに分割してJPEGでファイル書き出し
repeat with i from 0 to (pCount - 1)
  set thisPage to (aPDFdoc’s pageAtIndex:(i))
  
set thisDoc to (current application’s NSImage’s alloc()’s initWithData:(thisPage’s dataRepresentation()))
  
if thisDoc = missing value then error “Error in getting imagerep from PDF in page:” & (i as string)
  
  
set theData to thisDoc’s TIFFRepresentation()
  
set newRep to (current application’s NSBitmapImageRep’s imageRepWithData:theData)
  
set targData to (newRep’s representationUsingType:(current application’s NSJPEGFileType) |properties|:{NSImageCompressionFactor:compFactor, NSImageProgressive:false})
  
set zText to retZeroPaddingText((i + 1), 4) of me
  
set outPath to addString_beforeExtensionIn_addingExtension_(“_” & zText, aPOSIXpath, “jpg”)
  
  (
targData’s writeToFile:outPath atomically:true) –書き出し
end repeat

–ファイルパス(POSIX path)に対して、文字列(枝番)を追加。任意の拡張子を追加
on addString:extraString beforeExtensionIn:aPath addingExtension:aExt
  set pathString to current application’s NSString’s stringWithString:aPath
  
set theExtension to pathString’s pathExtension()
  
set thePathNoExt to pathString’s stringByDeletingPathExtension()
  
  
set newPath to (thePathNoExt’s stringByAppendingString:extraString)’s stringByAppendingPathExtension:aExt
  
return newPath as string
end addString:beforeExtensionIn:addingExtension:

on retZeroPaddingText(aNum as integer, aDigitNum as integer)
  if aNum > (((10 ^ aDigitNum) as integer) - 1) then return “” –Range Check
  
set aFormatter to current application’s NSNumberFormatter’s alloc()’s init()
  
aFormatter’s setUsesGroupingSeparator:false
  
aFormatter’s setAllowsFloats:false
  
aFormatter’s setMaximumIntegerDigits:aDigitNum
  
aFormatter’s setMinimumIntegerDigits:aDigitNum
  
aFormatter’s setPaddingCharacter:“0″
  
set aStr to aFormatter’s stringFromNumber:(current application’s NSNumber’s numberWithFloat:aNum)
  
return aStr as string
end retZeroPaddingText

★Click Here to Open This Script 

2016/07/27 PDFをページごとに分解してJPEGで保存する

指定したPDFをページごとに分解してJPEG画像として保存するAppleScriptです。

書籍のPDFからePubを作ろうとして、さまざまなツールを試して撃沈。日本語のフォントが通らなかったり、オリジナルからかけ離れたレイアウトになったりと散々でした。

ePub版を作るのにそれほど労力を割きたくなかったので、「画像からePub作ろう」と割り切り、PDFをページごとにJPEGに分解することにしました。これを手作業で行っていたのでは日が暮れます。

splittedjpegs.png

そこで、本AppleScriptを作成。ありものを組み合わせたぐらいの作業で完成。さくっとPDFをページごとのJPEG画像に分解できました。

AppleScript名:ASOCでPDFをページごとに分解してJPEGで保存する
– Created 2014-12-26 by Takaaki Naganoya
– Modified 2015-09-26 by Takaaki Naganoya
– Modified 2015-10-01 by Takaaki Naganoya
– Modified 2016-07-27 by Takaaki Naganoya–save each PDF page as jpeg
– 2016 Piyomaru Software
# http://piyocast.com/as/archives/4174

use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “Quartz”
use framework “QuartzCore”
use framework “AppKit”

set aHFSPath to (choose file of type {“com.adobe.pdf”} with prompt “ページごとに分解するPDFを指定してください”)
set aPOSIX to POSIX path of aHFSPath
set aURL to (current application’s |NSURL|’s fileURLWithPath:aPOSIX)

set aPOSIXpath to POSIX path of aHFSPath —書き出し先パスをPOSIX pathで用意しておく(あとで加工)

set aPDFdoc to current application’s PDFDocument’s alloc()’s initWithURL:aURL
set pCount to aPDFdoc’s pageCount()

set compFactor to 1.0 – 0.0 = max jpeg compression, 1.0 = none

–PDFをページごとに分割してJPEGでファイル書き出し
repeat with i from 0 to (pCount - 1)
  set thisPage to (aPDFdoc’s pageAtIndex:(i))
  
set thisDoc to (current application’s NSImage’s alloc()’s initWithData:(thisPage’s dataRepresentation()))
  
if thisDoc = missing value then error “Error in getting imagerep from PDF in page:” & (i as string)
  
  
set theData to thisDoc’s TIFFRepresentation()
  
set newRep to (current application’s NSBitmapImageRep’s imageRepWithData:theData)
  
set targData to (newRep’s representationUsingType:(current application’s NSJPEGFileType) |properties|:{NSImageCompressionFactor:compFactor, NSImageProgressive:false})
  
  
set outPath to addString_beforeExtensionIn_addingExtension_(“_” & (i + 1) as string, aPOSIXpath, “jpg”)
  
  (
targData’s writeToFile:outPath atomically:true) –書き出し
end repeat

–ファイルパス(POSIX path)に対して、文字列(枝番)を追加。任意の拡張子を追加
on addString:extraString beforeExtensionIn:aPath addingExtension:aExt
  set pathString to current application’s NSString’s stringWithString:aPath
  
set theExtension to pathString’s pathExtension()
  
set thePathNoExt to pathString’s stringByDeletingPathExtension()
  
  
set newPath to (thePathNoExt’s stringByAppendingString:extraString)’s stringByAppendingPathExtension:aExt
  
return newPath as string
end addString:beforeExtensionIn:addingExtension:

★Click Here to Open This Script 

2016/05/31 デスクトップピクチャを白いピクチャとトグルで差し替え

ソフトウェアの説明書などを作る際に、ウィンドウやメニューなどの画面のスクリーンショットを撮ることが多々あります。そのような場合に、一時的にデスクトップピクチャを白い色にしておきたいことがあります。通常デスクトップピクチャと白いピクチャの切り替えを行うAppleScriptです。

普通にスクリプトエディタで本スクリプトをオープンしておいて、実行するたびにトグルで状態が切り替わります。

img_3596_resized.png
▲通常のデスクトップピクチャの表示状態

img_3597_resized.png
▲スクリーンショットを撮るために背景を白い画像に設定した状態

AppleScript名:デスクトップピクチャを白いピクチャとトグルで差し替え
– Created 2016-05-31 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

property aSwitch : false
property desktopPictures : {}
property aColpath : “”

if aSwitch = false then
  –デスクトップを白くする
  
set desktopPictures to getDesktopPicturePathList() of me
  
–白い画像を作成してデスクトップピクチャに設定
  
set aColpath to makeColordImageToTmp(255, 255, 255, 255) of me –R,G,B,A(それぞれ 0〜255)
  
setDesktopPicture(aColpath) of me
  
set aSwitch to true
else
  –保存しておいたDesktop Pictureのリストを戻す
  
setDesktopPicturePathList(desktopPictures) of me
  
do shell script “rm -f “ & quoted form of aColpath
  
set aSwitch to false
end if

–デスクトップピクチャの状態を復帰する
on setDesktopPicturePathList(aliasList)
  if aliasList = {} then
    display notification “保存しておいたデスクトップピクチャのリストが空になっています”
    
return
  end if
  
  
tell application “System Events”
    set dCount to count every desktop
    
repeat with i from 1 to dCount
      set j to contents of item i of aliasList
      
tell desktop i
        set picture to (POSIX path of j)
      end tell
    end repeat
  end tell
end setDesktopPicturePathList

–デスクトップピクチャの強制指定
on setDesktopPicture(aPathStr)
  tell application “System Events”
    set picture of every desktop to aPathStr
  end tell
end setDesktopPicture

–デスクトップピクチャのパスをaliasリストで取得
on getDesktopPicturePathList()
  set pList to {}
  
tell application “System Events”
    set dCount to count every desktop
    
repeat with i from 1 to dCount
      tell desktop i
        set aPic to (picture as POSIX file) as alias
        
set end of pList to aPic
      end tell
    end repeat
  end tell
  
return pList
end getDesktopPicturePathList

–テンポラリフォルダに指定色の画像を作成
on makeColordImageToTmp(rDat as integer, gDat as integer, bDat as integer, aDat as integer)
  set rCol to 255 / rDat
  
set gCol to 255 / gDat
  
set bCol to 255 / bDat
  
set aCol to 255 / aDat
  

  
set aColor to current application’s NSColor’s colorWithDeviceRed:rCol green:gCol blue:bCol alpha:aCol
  
set aDesktopPath to current application’s NSString’s stringWithString:(POSIX path of (path to temporary items))
  
set savePath to aDesktopPath’s stringByAppendingString:((current application’s NSUUID’s UUID()’s UUIDString())’s stringByAppendingString:“.png”)
  
set aRes to makeImageWithFilledWithColor(1, 1, savePath, aColor) of me
  
return (savePath as string)
end makeColordImageToTmp

–指定サイズの画像を作成し、指定色で塗ってファイル書き出し
on makeImageWithFilledWithColor(aWidth, aHeight, outPath, fillColor)
  –Imageの作成  
  
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() –描画ここまで
  
  
–生成した画像のRaw画像を作成
  
set imageRep to anImage’s TIFFRepresentation()
  
set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep
  
set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value))
  
  
–書き出しファイルパス情報を作成
  
set pathString to current application’s NSString’s stringWithString:outPath
  
set newPath to pathString’s stringByExpandingTildeInPath()
  
set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean
  
return aRes –成功ならtrue、失敗ならfalseが返る
  
end makeImageWithFilledWithColor

★Click Here to Open This Script 

2016/04/19 Multi Page Tiffを読み込んで、PDFに変換する

Multipage Tiffを読み込んで、PDFに書き出すAppleScriptです。

意外とサンプルもなく、さまざまなObjective-Cのサンプルの断片をかき集めて、ようやくできました。着手してから1年ぐらい放置してあったぐらいです。

Multipage Tiffのサンプルをここから入手し、試行錯誤してようやく変換できました。

multipage1.png

大昔から存在しているものの、ずーーっとマイナーな存在だったMultipage Tiffなので、こんなもん書いて有用性がどーのとかいうことは一切ないわけですが、1年間放置しておいた未解決の問題を解決できてスッキリしました。

AppleScript名:multi page tiffを読み込んで、PDFにする
– Created 2015-01-01 by Takaaki Naganoya
– Modified 2016-04-18 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “QuartzCore”
use framework “Quartz”
use framework “AppKit”

set a to choose file of type {“public.tiff”} with prompt “Select Multi-page tiff file” –tiff

–Make Output Path
set b to POSIX path of a
set bb to changeExtensionInPath(“pdf”, b) –OutPath

–Read Multi-Page TIFF
set aURL to current application’s |NSURL|’s fileURLWithPath:b
set aImage to current application’s NSImage’s alloc()’s initWithContentsOfURL:aURL
set aRawimg to aImage’s TIFFRepresentation()
set eachTiffPages to (current application’s NSBitmapImageRep’s imageRepsWithData:aRawimg) as list

–Make Blank PDF
set aPDFdoc to current application’s PDFDocument’s alloc()’s init()

set pageNum to 0

repeat with curPage in eachTiffPages
  set thisImage to contents of curPage
  
set aImg to (current application’s NSImage’s alloc()’s initWithSize:(thisImage’s |size|()))
  (
aImg’s addRepresentation:thisImage)
  (
aPDFdoc’s insertPage:(current application’s PDFPage’s alloc()’s initWithImage:aImg) atIndex:pageNum)
  
set pageNum to pageNum + 1
end repeat

aPDFdoc’s writeToFile:bb

–ファイルパス(POSIX path)に対して、拡張子のみ付け替える
on changeExtensionInPath(extStr as string, aPath as string)
  set pathString to current application’s NSString’s stringWithString:aPath
  
set theExtension to pathString’s pathExtension()
  
set thePathNoExt to pathString’s stringByDeletingPathExtension()
  
set newPath to thePathNoExt’s stringByAppendingPathExtension:extStr
  
return newPath as string
end changeExtensionInPath

★Click Here to Open This Script 

2016/03/17 barCodeKitのじっけん

Oliver Drobnik氏によるオープンソースのフレームワーク「BarCodeKit」を利用してCode39のバーコード画像をデスクトップにPNG形式で出力するAppleScriptです。

あくまで実験レベルなので、オプション指定の内容に間違いが存在している可能性もあります。

BarCodeKitがサポートしているバーコード形式は、

–EAN-13/UPC-A
–EAN-8
–UPC-E
–Codabar
–Code 11
–Code 39 (plain, mod 43, Full ASCII plain and mod 43)
–Code 93 (with mod 47)
–Code 128
–Interleaved 2 of 5
–MSI - Modified Plessey (plain, mod 10, mod 11, mod 1010, mod 1011)
–Standard/Industrial 2 of 5
–Facing Identification Mark (FIM)
–EAN-2 and EAN-5 supplement codes
–ISBN (10 and 13 digits)
–ISMN
–ISSN
–POSTNET

とのことで、一番難易度の低いCode39でテストを行ってみたというところです(チェックサム・ディジットがないので簡単)。

出力した画像をKeynote書類に貼り付けてレーザープリンターで印刷し、バーコードリーダーでスキャンして指定したデータを取得できることを確認しました。

6423b354-4d0f-4307-9ef4-c26dddc7d822.png
▲本AppleScriptで出力したCode39画像

img_3342_resized.png

img_3343_resized.png

screens.png

OS X 10.10以降用にビルドしたフレームワークのバイナリを用意しておきました。興味のある方は自己責任で~/Library/Frameworksフォルダに入れてお試しください。

–> Download Framework Binary

AppleScript名:barCodeKitのじっけん
– Created 2016-03-17 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “QuartzCore”
use framework “barCodeKit”

–Generate Barcode Image (Code 39)
set aBarcode to current application’s BCKCode39Code’s alloc()’s initWithContent:“PIYOMARU” |error|:(missing value)

set aRec to current application’s NSDictionary’s dictionaryWithObjectsAndKeys_(2.0, current application’s BCKCodeDrawingBarScaleOption, false, current application’s BCKCodeDrawingFillEmptyQuietZonesOption, true, current application’s BCKCodeDrawingPrintCaptionOption, false, current application’s BCKCodeDrawingMarkerBarsOverlapCaptionPercentOption, true, current application’s BCKCodeDrawingShowCheckDigitsOption, (current application’s NSColor’s whiteColor()), current application’s BCKCodeDrawingBackgroundColorOption, missing value)

set anNSImage to current application’s NSImage’s imageWithBarCode:aBarcode options:aRec

–Save Barcode Image as PNG
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(anNSImage, 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

★Click Here to Open This Script 

2016/02/19 Viewを作成してPNGで保存

View/Controlを作成して、View/Controlをデスクトップ上に画像として保存するAppleScriptです。

103bc611-92d0-45e0-b092-9caadc9439a1.png
▲本Scriptの出力結果

デバッグ用に作ったScriptです。各種ViewやControlをプログラム上から生成した際に、その内容をWindowのsubviewに指定して表示するというデバッグもありますが、それよりも手軽にビューの内容そのものをPNG画像として書き出してしまおうというものです。

Retina Display上で実行しても、得られるイメージはRetina Resolutionではないところが注意点でしょうか。

AppleScript名:ASOCで指定Viewを作成してPNGで保存
– Created 2016-02-19 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

–Get Desktop Path
set aDesktopPath to (current application’s NSProcessInfo’s processInfo()’s environment()’s objectForKey:(“HOME”))’s stringByAppendingString:“/Desktop/”

–Make Save Image Path
set savePath to aDesktopPath’s stringByAppendingString:((current application’s NSUUID’s UUID()’s UUIDString())’s stringByAppendingString:“.png”)

–Make a Control (View/Control)
set aButton to current application’s NSButton’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, 180, 80))
aButton’s setButtonType:(current application’s NSMomentaryLightButton)
aButton’s setBezelStyle:(current application’s NSRoundedBezelStyle)
aButton’s setTitle:“Button Image Test”

–Save a View/Control as PNG
set aRes to saveViewAtPathAsPNG(aButton, savePath) of me
–>  true

–指定Viewを指定パスにPNG形式で保存
on saveViewAtPathAsPNG(aView, outPath)
  set aIMG to current application’s NSImage’s alloc()’s initWithData:(aView’s dataWithPDFInsideRect:(aView’s |bounds|()))
  
return saveNSImageAtPathAsPNG(aIMG, outPath) of me
end saveViewAtPathAsPNG

–NSImageを指定パスにPNG形式で保存
on saveNSImageAtPathAsPNG(anImage, outPath)
  –画像のRaw画像を作成
  
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

–ImageRepを指定パスにPNG形式で保存
on saveImageRepAtPathAsPNG(imageRep, outPath)
  –書き出しファイルパス情報を作成
  
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

★Click Here to Open This Script 

2016/02/09 コンピュータの画像を取得して表示

実行しているコンピュータのアイコン画像を取得してWindow表示するAppleScriptです。アイコンを取得するのがメインで、表示部分はオマケです。

Script Editor上で、ControlーCommandーRで実行してください。

icondisp.png
▲MacBookPro10,1上で実行したところ

icondisp2.png
▲Macmini7,1上で実行したところ

icondisp3.jpg
▲MacBookAir4,1上で実行したところ

AppleScript名:コンピュータの画像を取得して表示
– 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)

–Load Image to NSImageView
set aRect to current application’s NSMakeRect(0, 0, 128, 128)
set aView to current application’s NSImageView’s alloc()’s initWithFrame:aRect
aView’s setImage:anImage

–Display with Window
set aWin to current application’s NSWindow’s alloc()’s init()
aWin’s setContentSize:(aView’s frame()’s |size|())
aWin’s setContentView:aView
aWin’s |center|()
aWin’s makeKeyAndOrderFront:(me)
delay 5
aWin’s |close|()

★Click Here to Open This Script 

2015/10/21 指定フォルダに指定アイコン画像をつける[Update]

Cocoaの機能を用いて、指定フォルダに指定アイコン(カスタムアイコン)をつけるAppleScriptです。

前回掲載したときには、フォルダにカスタムアイコンがついたりつかなかったりで、不思議に思っておりました。

どうしてもこの処理は使ってみたかったので、いろいろ調査して問題を解決しました。

えーー、最初は「パスの書き方の問題か?」と考えて試していたのですが、Shaneから「ちょっと、そこ何言ってるのかわかんない」とツッコミが入り。再検証したところ、フォルダへのPOSIX pathの記述の問題(末尾にスラッシュが入る or 入らない問題)ではないことが判明。

再々調査してみたところ、フォルダにカスタムアイコンがつかない場合がある原因は、

「いちどカスタムアイコンを付けたフォルダに別のカスタムアイコンをつける場合には、いったん前のカスタムアイコンを削除する必要がある」

ことのようです。さらに、Cocoaの機能のみならずAppleScriptならではの「Finderへのリフレッシュ指令」を出すなど細やかな処理を追加。

custf1.png
custf2.png

さて、どうなりますやら、、、

AppleScript名:指定フォルダに指定アイコン画像をつける v3
– Created 2015-10-21 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

set anIconPath to POSIX path of (choose file of type {“com.apple.icns”, “public.tiff”} with prompt “Choose Icon File”)
set aFolder to POSIX path of (choose folder with prompt “Choose Folder”)
setCustomIcon(anIconPath, aFolder) of me

on setCustomIcon(aPath, aFolder)
  set aFolderPath to current application’s NSString’s stringWithString:aFolder
  
  
set aURL to current application’s |NSURL|’s fileURLWithPath:aPath
  
set aImage to current application’s NSImage’s alloc()’s initWithContentsOfURL:aURL
  
  
set aSW to current application’s NSWorkspace’s sharedWorkspace()
  
aSW’s setIcon:(missing value) forFile:aFolder options:0 –Erase
  
tell application “Finder”
    update ((POSIX file aFolder) as alias) –Refresh State
  end tell
  
  
aSW’s setIcon:aImage forFile:aFolderPath options:0 –Write
  
tell application “Finder”
    update ((POSIX file aFolder) as alias) –Refresh State
  end tell
end setCustomIcon

★Click Here to Open This Script 

AppleScript名:指定フォルダからカスタムアイコンを削除する v3
– Created 2015-10-21by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

set aFolder to POSIX path of (choose folder with prompt “Choose Target Folder”) –カスタムアイコン削除対象のフォルダ

on removeCustomIcon(aFolder)
  set aSW to current application’s NSWorkspace’s sharedWorkspace()
  
aSW’s setIcon:(missing value) forFile:aFolder options:0 –Erase
  
tell application “Finder”
    update ((POSIX file aFolder) as alias) –Refresh State
  end tell
end removeCustomIcon

★Click Here to Open This Script 

2015/10/19 指定ファイルに指定アイコン画像をつける

Cocoaの機能を用いて、指定ファイルに指定アイコン(カスタムアイコン)をつけるAppleScriptです。

アイコンの変更などという、わりと誰にでもわかりやす〜い効果が得られるものです。Pure AppleScriptだと逆立ちしてもできない(Classic Mac OSの時代にはできた気がする)処理も、AppleScriptObjCだと簡単に実現できます。

常駐型のAppletでフォルダを監視して処理させるような場合に、監視フォルダ内に書類が入ってきて処理を行うとフォルダのアイコンが変化してユーザーに「処理中」であることを視覚的にフィードバックする、とかいうのがわりといい使い道だと思います。

# 処理中のファイル数をアプレットにバッジで表示するのもけっこういいです

指定ファイルに対していわゆる「カスタムアイコン」をつけます。おまけでカスタムアイコンを削除するものも用意しておきました。

指定するアイコン画像については、ICNSファイル、TIFF画像のほか、PNGなども問題なく設定できるようですが、表示のリフレッシュタイミングがいまひとつ「God Only Knows」だったりするので、そのあたりどーにかならないものかと。

AppleScript名:指定ファイルに指定アイコン画像をつける
– Created 2015-10-19 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

set aPath to POSIX path of (choose file of type {“com.apple.icns”, “public.tiff”} with prompt “Choose Icon File”) –アイコンファイル
set aFile to POSIX path of (choose file with prompt “Choose Target File”) –設定対象のファイル

set aURL to current application’s |NSURL|’s fileURLWithPath:aPath
set aImage to current application’s NSImage’s alloc()’s initWithContentsOfURL:aURL

set aSW to current application’s NSWorkspace’s sharedWorkspace()
aSW’s setIcon:aImage forFile:aFile options:0

★Click Here to Open This Script 

AppleScript名:指定ファイルからカスタムアイコンを削除する
– Created 2015-10-19 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

set aFile to POSIX path of (choose file with prompt “Choose Target File”) –設定対象のファイル
set aSW to current application’s NSWorkspace’s sharedWorkspace()
aSW’s setIcon:(missing value) forFile:aFile options:0

★Click Here to Open This Script 

2015/08/19 ASOCで選択した画像をリサイズ v3

Cocoaの機能を使って指定画像を指定サイズにリサイズ(縮小Only)するAppleScriptです。

CIFilterを使って、縮小前にぼかしフィルタを、縮小後にシャープネスフィルタをかけています。

いろいろテストしていたのですが、

  「フィルタ処理するたびに画像が右上にズレるのはなぜ??」

とちょっと悩んでいました・・・どうやら、当初指定していたぼかしフィルタ(Gaussian Blur)の仕様ではないかと考え、別のぼかしフィルタ(CIBoxBlur)に変更したところ、右上への移動問題が発生しなくなりました。

処理結果に癖があるのとフィルタすると処理時間もそれなりにかかるので、Photoshopを使わない処理のほうがよい・・・ともいいにくいものがあります(「餅は餅屋」という表現がぴったり、、、)。ただし、並列処理で大量の画像を処理するような場合にはこっちを使うことになるでしょう(たぶん)。

resized10.png
▲Resized by this AppleScript

resized21.png
▲Resized by other AppleScript using Photoshop

後日談:
指定のフォルダに入っている画像を順次リサイズするように記述してみたところ、1ファイル処理したときに数秒(1〜3秒?)待たされたのがウソのように高速に(^ー^;; 1.3〜6.4MBのPNGファイルを200個処理してみたところ、所要時間55.35秒。画像1枚あたり0.28秒(MacBook Pro Retina 2012)。なかなか高速です。

AppleScript名:ASOCで選択した画像をリサイズ v3
– Created 2015-08-19 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
use framework “QuartzCore”

set targW to 450 –Target Width (Pixel)

set aPath to POSIX path of (choose file of type {“public.image”})
set aURL to current application’s |NSURL|’s fileURLWithPath:aPath

–指定したURLから画像を読み込み
set aImage to current application’s NSImage’s alloc()’s initWithContentsOfURL:aURL

–出力ファイル名を組み立てる
set aStr to current application’s NSString’s stringWithString:aPath
set bStr to (aStr’s stringByDeletingPathExtension()) as text
set outPath to bStr & “_resized” & “.png” –pngで出力

–ぼかしフィルタ
set aDict to current application’s NSDictionary’s dictionaryWithObjects:{current application’s NSNumber’s numberWithFloat:(2.0 as real)} forKeys:{“inputRadius”}
set bImage to execFilterToNSImage(aImage, “CIBoxBlur”, aDict)

–リサイズ
set cImage to resizeNSImage(targW, bImage)

–シャープフィルタ
set bDict to current application’s NSDictionary’s dictionaryWithObjects:{current application’s NSNumber’s numberWithFloat:(1.0 as real)} forKeys:{“inputSharpness”}
set dImage to execFilterToNSImage(cImage, “CISharpenLuminance”, bDict)

–ファイル保存
set aRes to saveImageRepAtPathAsPNG(dImage, outPath)

–指定画像を指定の横幅に縦横比を維持したままリサイズ
on resizeNSImage(targW, aImage)
  
  
–とりあえずImageからサイズの情報を取得
  
set sizeInfo to |size|() of aImage
  
  
set wNum to (width of sizeInfo) as integer
  
set hNum to (height of sizeInfo) as integer
  
  
  
–ターゲット横サイズをもとに、縦横のターゲットサイズを計算
  
if wNum > targW then
    –横幅がターゲットサイズよりも大きかった場合
    
set newRatioW to targW / wNum
    
set newRatioH to (hNum * newRatioW)
    
    
set newW to (wNum * newRatioW) as integer
    
set newH to (hNum * newRatioW) as integer
  else
    –横幅がターゲットサイズよりも小さかった場合はオリジナルサイズでそのまま
    
set newW to wNum
    
set newH to hNum
  end if
  
  
  
set tmpSize to current application’s NSZeroSize
  
set tmpSize’s width to newW as real
  
set tmpSize’s height to newH as real
  
  
set resImg to current application’s NSImage’s alloc()’s initWithSize:tmpSize
  
  
resImg’s lockFocus()
  
  
set aTransform to current application’s NSAffineTransform’s transform()
  
aTransform’s scaleBy:(newRatioW as real)
  
aTransform’s concat()
  
aImage’s drawAtPoint:(current application’s NSZeroPoint) fromRect:(current application’s NSZeroRect) operation:(current application’s NSCompositeCopy) fraction:1.0
  
  
resImg’s unlockFocus()
  
  
return resImg
  
end resizeNSImage

–画像を指定パスにPNG形式で保存
on saveImageRepAtPathAsPNG(anImage, outPath)
  
  
–画像のRaw画像を作成
  
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

–NSImageにCIFilterを実行して返す
on execFilterToNSImage(aNSImage, aFilterName, aParamDic)
  
  
–NSImageからCIImageを生成
  
set aTiff to aNSImage’s TIFFRepresentation()
  
set aBitmap to current application’s NSBitmapImageRep’s imageRepWithData:aTiff
  
set aCIImage to current application’s CIImage’s alloc()’s initWithBitmapImageRep:aBitmap
  
  
– CIFilter をフィルタの名前で生成してフィルタ実行
  
set aFilter to current application’s CIFilter’s filterWithName:aFilterName
  
aFilter’s setDefaults() –各フィルタのパラメータはデフォルト
  
aFilter’s setValuesForKeysWithDictionary:aParamDic
  
aFilter’s setValue:aCIImage forKey:“inputImage”
  
set aOutImage to aFilter’s valueForKey:“outputImage”
  
  
  
–フィルター結果のbitmapImageRepをNSImageに変換して返す
  
set aRep to current application’s NSBitmapImageRep’s alloc()’s initWithCIImage:aOutImage
  
set outImage to current application’s NSImage’s alloc()’s initWithSize:(aRep’s |size|())
  
outImage’s addRepresentation:aRep
  
  
return outImage –NSImage
  
end execFilterToNSImage

★Click Here to Open This Script 

2015/08/19 ASOCで選択した画像をリサイズ v2

Cocoaの機能を使って指定画像を指定サイズにリサイズ(縮小Only)するAppleScriptです。

汎用的に利用できるように、リサイズルーチンとファイル保存ルーチンを分離しました。NSImageによる値渡し(call by value)で処理を行っています。

resized1.png
▲Resized by this AppleScript

resized2.png
▲Resized by other AppleScript using Photoshop

resized7.png
▲Resized by other AppleScript using Cocoa CIFilter

AppleScript名:ASOCで選択した画像をリサイズ v2
– Created 2015-08-19 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

set targW to 450 –Target Width (Pixel)

set aPath to POSIX path of (choose file of type {“public.image”})
set aURL to current application’s |NSURL|’s fileURLWithPath:aPath

–指定したURLから画像を読み込み
set aImage to current application’s NSImage’s alloc()’s initWithContentsOfURL:aURL

–出力ファイル名を組み立てる
set aStr to current application’s NSString’s stringWithString:aPath
set bStr to (aStr’s stringByDeletingPathExtension()) as text
set outPath to bStr & “_resized” & “.png” –pngで出力

–リサイズ
set bImage to resizeNSImage(targW, aImage)

–ファイル保存
set aRes to saveImageRepAtPathAsPNG(bImage, outPath)

–指定画像を指定の横幅に縦横比を維持したままリサイズ
on resizeNSImage(targW, aImage)
  
  
–とりあえずImageからサイズの情報を取得
  
set sizeInfo to |size|() of aImage
  
  
set wNum to (width of sizeInfo) as integer
  
set hNum to (height of sizeInfo) as integer
  
  
  
–ターゲット横サイズをもとに、縦横のターゲットサイズを計算
  
if wNum > targW then
    –横幅がターゲットサイズよりも大きかった場合
    
set newRatioW to targW / wNum
    
set newRatioH to (hNum * newRatioW)
    
    
set newW to (wNum * newRatioW) as integer
    
set newH to (hNum * newRatioW) as integer
  else
    –横幅がターゲットサイズよりも小さかった場合はオリジナルサイズでそのまま
    
set newW to wNum
    
set newH to hNum
  end if
  
  
  
set tmpSize to current application’s NSZeroSize
  
set tmpSize’s width to newW as real
  
set tmpSize’s height to newH as real
  
  
set resImg to current application’s NSImage’s alloc()’s initWithSize:tmpSize
  
  
resImg’s lockFocus()
  
  
set aTransform to current application’s NSAffineTransform’s transform()
  
aTransform’s scaleBy:(newRatioW as real)
  
aTransform’s concat()
  
aImage’s drawAtPoint:(current application’s NSZeroPoint) fromRect:(current application’s NSZeroRect) operation:(current application’s NSCompositeCopy) fraction:1.0
  
  
resImg’s unlockFocus()
  
  
return resImg
  
end resizeNSImage

–画像を指定パスにPNG形式で保存
on saveImageRepAtPathAsPNG(anImage, outPath)
  
  
–画像のRaw画像を作成
  
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

★Click Here to Open This Script 

2015/08/19 ASOCで選択した画像をリサイズ

Cocoaの機能を使って指定画像を指定サイズにリサイズ(縮小Only)するAppleScriptです。

実験レベルの実装なんで、あんまり自由度は持たせていません。強制的にPNGで保存します。

resize0.png
▲Resized By This AppleScript

resize1.png
▲Resized By other AppleScript using Photoshop

仕上がりのクオリティーについては、Photoshopでさまざまなフィルタ処理を行いつつリサイズするScriptにくらべれば落ちますが、Cocoaのフィルタ処理を追加してみるとよいかもしれません。

resizedwithciimage2.png
▲その後、CoreImageでフィルタしつつリサイズするようにしたScriptの処理結果。パラメータの設定やフィルタの種類を選ぶ余地がありそうな、、、

AppleScript名:ASOCで選択した画像をリサイズ
– Created 2015-08-19 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

set targW to 450 –Target Width (Pixel)
set aPath to POSIX path of (choose file of type {“public.image”})
set aRes to resizeImage(targW, aPath)

–指定画像を指定の横幅に縦横比を維持したままリサイズ
on resizeImage(targW, origimgPath)
  
  
–出力ファイル名を組み立てる
  
set aStr to current application’s NSString’s stringWithString:origimgPath
  
set bStr to (aStr’s stringByDeletingPathExtension()) as text
  
set cStr to (aStr’s pathExtension()) as text
  
set dStr to bStr & “_resized” & “.png” –pngで出力
  
  
–オリジナル画像のPOSIX pathをCocoaのNSURLに変換
  
set aURL to current application’s |NSURL|’s fileURLWithPath:origimgPath
  
  
–指定したURLから画像を読み込み
  
set aImage to current application’s NSImage’s alloc()’s initWithContentsOfURL:aURL
  
  
–とりあえずImageからサイズの情報を取得
  
set sizeInfo to |size|() of aImage
  
  
set wNum to (width of sizeInfo) as integer
  
set hNum to (height of sizeInfo) as integer
  
  
  
–ターゲット横サイズをもとに、縦横のターゲットサイズを計算
  
if wNum > targW then
    –横幅がターゲットサイズよりも大きかった場合
    
set newRatioW to targW / wNum
    
set newRatioH to (hNum * newRatioW)
    
    
set newW to (wNum * newRatioW) as integer
    
set newH to (hNum * newRatioW) as integer
  else
    –横幅がターゲットサイズよりも小さかった場合はオリジナルサイズでそのまま
    
set newW to wNum
    
set newH to hNum
  end if
  
  
  
set tmpSize to current application’s NSZeroSize
  
set tmpSize’s width to newW as real
  
set tmpSize’s height to newH as real
  
  
set resImg to current application’s NSImage’s alloc()’s initWithSize:tmpSize
  
  
resImg’s lockFocus()
  
  
set aTransform to current application’s NSAffineTransform’s transform()
  
aTransform’s scaleBy:(newRatioW as real)
  
aTransform’s concat()
  
aImage’s drawAtPoint:(current application’s NSZeroPoint) fromRect:(current application’s NSZeroRect) operation:(current application’s NSCompositeCopy) fraction:1.0
  
  
resImg’s unlockFocus()
  
  
set aRes to saveImageRepAtPathAsPNG(resImg, dStr)
  
return aRes
  
end resizeImage

–画像を指定パスにPNG形式で保存
on saveImageRepAtPathAsPNG(anImage, outPath)
  
  
–画像のRaw画像を作成
  
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

★Click Here to Open This Script 

2015/08/18 ASOCで与えられた画像ファイルがNSImageでハンドリング可能かを取得

Cocoaの機能を用いて、NSImageで取り扱いが可能な画像かどうかをチェックするAppleScript(chkNSImageAcceptableFormat)です。

以前に、sipsによる画像変換ルーチンをまとめたときに、処理可能なファイルタイプのチェックをあらかじめ拡張子の2D Listを作成しておき、

{{”jpeg”, “jpg”}, {”tiff”, “tif”}, {”png”}, {”gif”, “giff”}, {”jp2″}, {”pict”}, {”bmp”}, {”qtif”}, {”psd”}, {”sgi”}, {”tga”}, {”pdf”}}

これをループで回して画像タイプのチェックおよびファイル形式指定の修正(”jpg”と指定されても”jpeg”に修正)を行うなど、Pure AppleScriptらしいやりかたで処理していました。

これに対して、本ScriptではNSWorkspaceの機能を用いてファイルタイプ(UTI)を取得(拡張子による揺らぎを吸収)、NSImageが受付可能かどうかは imageTypes() でUTIの一覧を取得して、両者を存在確認することでNSImageで処理可能かどうかをチェックしている点が非常に参考になります。

ただし、sipsコマンドについてもNSImageについてもcom.apple.pict(PICTファイル)についてはCarbon(QuickDraw)が必要で32bitアプリ内でしか処理できないため、sipsそのものおよびScript Editor上で記述できるASOC(64bit環境が前提)でNSImageを利用した場合では処理できません。なんでPICTが処理できると返ってくるのか、逆に不思議です。

→ PICTからJPEGへの変換はこちら

AppleScript名:ASOCで与えられた画像ファイルがNSImageでハンドリング可能かを取得
– Created 2015-08-18 by Shane Stanley
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set oldPath to POSIX path of (choose file of type {“public.image”})
set aRes to convertPictureFileAt(oldPath, “JPEG”)

on convertPictureFileAt(aPath, targetFormatExt)
  set aRes to chkNSImageAcceptableFormat(aPath, targetFormatExt)
  
set bRes to chkIsThereNeedToConvert(aPath, targetFormatExt)
  
return {aRes, bRes}
  
  
–convert images
  
end convertPictureFileAt

–与えられた画像ファイルがNSImageでハンドリング可能かを取得
on chkNSImageAcceptableFormat(aPath as text, targetFormatExt as text)
  
  
– check if UTI of file is one NSImage can read
  
set theWorkspace to current application’s NSWorkspace’s sharedWorkspace()
  
set theType to theWorkspace’s typeOfFile:aPath |error|:(missing value) – returns UTI of file
  
–>  (NSString) “public.jpeg”
  
  
set supportedTypes to current application’s NSImage’s imageTypes() – returns supported UTIs
  
–>  (NSArray) {”com.adobe.pdf”, “com.apple.pict”, “com.adobe.encapsulated-postscript”, “public.jpeg”, “public.png”, “com.compuserve.gif”, “public.jpeg-2000″, “com.canon.tif-raw-image”, “com.adobe.raw-image”, “com.dxo.raw-image”, “com.canon.cr2-raw-image”, “com.leafamerica.raw-image”, “com.hasselblad.fff-raw-image”, “com.hasselblad.3fr-raw-image”, “com.nikon.raw-image”, “com.nikon.nrw-raw-image”, “com.pentax.raw-image”, “com.samsung.raw-image”, “com.sony.raw-image”, “com.sony.sr2-raw-image”, “com.sony.arw-raw-image”, “com.epson.raw-image”, “com.kodak.raw-image”, “public.tiff”, “com.apple.icns”, “com.canon.crw-raw-image”, “com.fuji.raw-image”, “com.panasonic.raw-image”, “com.panasonic.rw2-raw-image”, “com.leica.raw-image”, “com.leica.rwl-raw-image”, “com.konicaminolta.raw-image”, “com.olympus.sr-raw-image”, “com.olympus.or-raw-image”, “com.olympus.raw-image”, “com.adobe.photoshop-image”, “com.microsoft.ico”, “com.microsoft.bmp”, “com.microsoft.cur”, “com.truevision.tga-image”, “com.sgi.sgi-image”, “com.apple.macpaint-image”, “com.ilm.openexr-image”, “public.radiance”, “public.mpo-image”, “public.pbm”, “public.pvr”, “com.apple.rjpeg”, “com.apple.quicktime-image”, “com.kodak.flashpix-image”}
  
  
if (supportedTypes’s containsObject:theType) as boolean is false then
    return “File format is unsupported”
    
– check required type doesn’t already match
  else
    return true
  end if
  
end chkNSImageAcceptableFormat

–変換元の画像パスと変換対象の拡張子を与え、変換不要(同一ファイル”JPG”–> “JPEG”など)かをチェックする
on chkIsThereNeedToConvert(aPath as text, targetFormatExt as text)
  set theWorkspace to current application’s NSWorkspace’s sharedWorkspace()
  
set theType to theWorkspace’s typeOfFile:aPath |error|:(missing value) – returns UTI of file
  
if (theWorkspace’s filenameExtension:targetFormatExt isValidForType:theType) as boolean then
    return false –”No conversion needed”
  else
    return true
  end if
end chkIsThereNeedToConvert

★Click Here to Open This Script 

2015/08/04 ASOCで画像+文字作成テスト_v2

Cocoaの機能を用いて指定サイズの単色塗り画像を作成し、指定の文字列を描画してPNG形式の画像ファイルに書き出すAppleScriptの別バージョンです。

test3.png
▲こんな画像(test.png)がデスクトップに書き出されます

多くの場合、バージョンアップすると機能を増やしたり強化したりしていますが、このv2は初版と機能面で差はありません。出力される画像の色やサイズを変更していることには、とくに意味はありません。

本件についてShane Stanleyと週をまたいでメールのやりとりをしていて、ようやく「なるほど」という落着点を見出せたので掲載にいたっています。

今をさかのぼること10年以上昔、Classic Mac OSの時代に、AppleScriptのサブルーチン(ハンドラ)呼び出しなどで参照渡し(call by reference)によるデータのやりとりを行っていました。当時はまだCPUも遅く、AppleScriptの処理系もいまほど高速ではなかったので、高速化手法のひとつとして参照渡しは割と使われていたテクニックでした。

AppleScript名:参照渡しのテスト
set aList to {1, 2, 3}
modList(aList)
log aList
–> {1, 2, 3, 4}

–Call By Reference
on modList(someList)
  set end of someList to 4
end modList

★Click Here to Open This Script 

ただ、プログラムがわかりにくくなる上にバグが入り込む隙間が大きいので、自分は当時から各種サブルーチンを「値渡し」(call by value)で記述するようにスタイルを固定して今日にいたっています。おかげで、巨大なプログラムを作っても割とトラブル知らずでやってこれたように思います(偏見)。

AppleScript名:値渡しのテスト
set aList to {1, 2, 3}
set aList to modList(aList)
log aList
–> {1, 2, 3, 4}

–Call By Value
on modList(someList)
  set newList to {}
  
copy someList to newList –deep copy
  
set end of newList to 4
  
return newList
end modList

★Click Here to Open This Script 

今回、Shaneが「こういう書き方はどう?」と提案してきた書き方は、この「参照渡し」によるものでしたが、てっきり

 「Cocoaのオブジェクト生成はAppleScriptの範疇とは別で管理されている(ものもある)のか?」

と勘違いしてしまったものでした(MacScripterでたまに見かける記述で、首をひねっていた)。ここ、自分は間違って理解していたので、あえて自分の勘違いも含めて書いておきます。

Shaneによる変更点は、_蔀呂良分の塗りのグラフィックを生成 のあとの、 ▲哀薀侫ックに文字を塗りで描画する の部分で,離哀薀侫ック(aImage1)をハンドラに渡したあと、実行結果を変数aImage1に受け取っている部分です(参照渡し)。

Shaneがここで、判読しにくくなる危険をおかしてでも参照渡しでデータをやりとりした理由は、

「本来は同じ値の変数で処理の段階が異なるものが複数存在していた場合、間違って最新のもの以外を利用してしまう危険が発生する。なるべく同じデータであれば1つの変数に格納しておくべき」

というものでした。メモリー使用量の削減には効果は大してなく、処理速度の問題でもない、と。

内容と使うべき理由について、よく理解できたので掲載しておきます(でも、自分は使用済みゴミ変数を撒き散らしつつ値渡しで書くでしょう、、、)。

海外のMLやBBS(とくに、MacScripter.net)でこのような書き方が見られるケースがありますので、参考にしてください。

AppleScript名:ASOCで画像+文字作成テスト_v2
– Created 2015-07-31 by Takaaki Naganoya
– Modified 2015-08-01 by Shane Stanley
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 aImage1 to makeImageWithFilledColor(aWidth, aHeight, outPath, fillColor) of me

–画像に文字を塗る(参照渡し(call by reference)で、結果はaImage1に入る)
drawStringsOnImage(aImage1, aText, “HiraKakuStd-W8″, 36.0, drawColor, xPos, yPos) of me

–ファイル保存
set aRes to saveImageRepAtPathAsPNG(aImage1, outPath) of me

–画像のうえに指定の文字を描画して画像を返す
on drawStringsOnImage(anImage, aText, aFontName, aPoint, drawColor)
  
  
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
  
set yPos to ((height of imageSize) - (height of textSize)) / 2
  
–文字描画開始
  
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)
  
  
–Imageの作成  
  
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 makeImageWithFilledColor

–画像を指定パスにPNG形式で保存
on saveImageRepAtPathAsPNG(anImage, outPath)
  
  
–画像のRaw画像を作成
  
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

★Click Here to Open This Script 

2015/07/31 ASOCで画像作成テスト

Cocoaの機能を用いて指定サイズの単色塗り画像(PNG形式)のファイルを書き出すAppleScriptです。

test.png
▲こんな画像がデスクトップに書き出されます

AppleScript名:画像作成テスト
– Created 2015-07-29 by Takaaki Naganoya
– 2015 Piyomaru Software
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 greenColor –塗り色

set aRes to makeImageWithFilledWithColor(aWidth, aHeight, outPath, fillColor) of me
–> true

–指定サイズの画像を作成し、指定色で塗ってファイル書き出し
on makeImageWithFilledWithColor(aWidth, aHeight, outPath, fillColor)
  
  
–Imageの作成  
  
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()
  
–描画ここまで
  
  
–生成した画像のRaw画像を作成
  
set imageRep to anImage’s TIFFRepresentation()
  
set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep
  
set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value))
  
  
  
–書き出しファイルパス情報を作成
  
set pathString to current application’s NSString’s stringWithString:outPath
  
set newPath to pathString’s stringByExpandingTildeInPath()
  
  
–書き出し
  
set aRes to (myNewImageData’s writeToFile:newPath atomically:true) as boolean
  
  
return aRes –成功ならtrue、失敗ならfalseが返る
  
end makeImageWithFilledWithColor

★Click Here to Open This Script 

2014/12/02 画像中の色数をカウント

画像中の色数をカウントするAppleScriptの試作品です。

ASOCの機能を使って、色数のカウントを行いますが・・・1024 x 768ピクセル程度の「かわいらしいサイズ」の画像であっても、すべてのピクセルを処理しようとすると、78万アイテム程度のデータを処理する必要があるため、10万アイテムをメドに処理するべき/するべきではないという判断を行うならば、「そのままでは処理すべきではない」ということに。

本Scriptは、画像の一部分だけを取り出して色数のカウントを行います。

色数のカウントについては、画像の間引きや中間調部分の除去などの前処理を行うべきであり、実ファイルを直接調べるような、乱暴な処理で行うべきものではないと考えます。とはいえ、こうした処理に手が届きそうになってきたことは体感できるのではないかと。

普通はPhotoshopなどで処理すべきでしょう。ただ、色数カウントという処理は割と骨が折れそうで、、、

AppleScript名:画像中の色数をカウント
– Created 2014-12-01 by Takaaki Naganoya
– 2014 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “ASObjCExtras”
use framework “AppKit”

script spd
  property aColList : {}
end script

set aColList of spd to {}

–画像を選択して読み込む
set a to choose file of type {“public.image”}

set aURL to current application’s SMSFord’s URLFrom:a
set aImage to current application’s NSImage’s alloc()’s initWithContentsOfURL:aURL

–画像のサイズ(幅、高さ)をピクセル数で取得する
set aSize to aImage’s |size|()
set aWidth to aSize’s width()
set aHeight to aSize’s height()

–読み込んだ画像のRaw画像を作成
set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:(aImage’s TIFFRepresentation())

–画像の一部のピクセルの色を取り出して色数をカウント
repeat with xNum from 0 to ((aWidth as integer) - 1)
  –repeat with yNum from 0 to ((aHeight as integer) - 1)
  
repeat with yNum from 0 to 10
    
    
set origColor to (aRawimg’s colorAtX:xNum y:yNum)
    
set srgbColSpace to current application’s NSColorSpace’s deviceRGBColorSpace
    
    
set aColor to (origColor’s colorUsingColorSpace:srgbColSpace)
    
    
set aRed to (aColor’s redComponent()) * 255
    
set aGreen to (aColor’s greenComponent()) * 255
    
set aBlue to (aColor’s blueComponent()) * 255
    
set aAlpha to (aColor’s alphaComponent()) * 255
    
    
set oneCol to {aRed as integer, aGreen as integer, aBlue as integer, aAlpha as integer}
    
    
set the end of aColList of spd to oneCol
    
  end repeat
end repeat

–ユニーク化
set aArray to current application’s NSArray’s arrayWithArray:(aColList of spd)
set bArray to aArray’s valueForKeyPath:“@distinctUnionOfObjects.self”

set bList to bArray’s ASify() as list
length of bList

★Click Here to Open This Script 

2014/12/02 画像の特定のピクセルの色を取得

指定画像を読み込んで、特定のピクセルの色を読み取るAppleScriptです。

画像を読み取るといった処理は、Xcode上でAppleScriptObjCのアプリケーションを作成している時にはよく書きますが、Script Editor上で書くAppleScriptObjCだと新鮮な感じがあります。

とくにWindow上に表示したりはしないのですが、実際に読み込んで色のピックアップができているような気がします。ただ、見えないので本当に合っているのかはもうちょっと試行錯誤を、、、

AppleScriptだけで(Photoshopなどを使わないで)画像処理を行うためのテストの一環で行ってみました。キャプチャ画像のリサイズぐらいは、Cocoaの機能だけで行っておきたいところです。

AppleScript名:画像の特定のピクセルの色を取得
– Created 2014-12-01 by Takaaki Naganoya
– 2014 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "ASObjCExtras"
use framework "AppKit"

–画像を選択して読み込む
set a to choose file of type {"public.image"}

set aURL to current application’s SMSFord’s URLFrom:a
set aImage to current application’s NSImage’s alloc()’s initWithContentsOfURL:aURL

–画像のサイズ(幅、高さ)をピクセル数で取得する
set aSize to aImage’s |size|()
set aWidth to aSize’s width()
set aHeight to aSize’s height()

–読み込んだ画像のRaw画像を作成
set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:(aImage’s TIFFRepresentation())

–画像中の{0, 0}のピクセルの色をRGBAそれぞれ取り出す
set origColor to (aRawimg’s colorAtX:0 y:0)
set srgbColSpace to current application’s NSColorSpace’s deviceRGBColorSpace

set aColor to (origColor’s colorUsingColorSpace:srgbColSpace)

set aRed to (aColor’s redComponent()) * 255
set aGreen to (aColor’s greenComponent()) * 255
set aBlue to (aColor’s blueComponent()) * 255
set aAlpha to (aColor’s alphaComponent()) * 255

set oneCol to {aRed as integer, aGreen as integer, aBlue as integer, aAlpha as integer}
–> {255, 255, 255, 218} – sample

★Click Here to Open This Script