Archive for the 'iPhoto' Category

2013/12/08 iPhotoで選択した写真から緯度経度情報を取得してMaps.appで緯度経度とズームレベルを指定して地図表示

iPhoto 9.5上で選択した写真から緯度経度情報を取得して、その情報をマップ(Maps.app)で位置表示、同時にズームレベルを指定するAppleScriptです。

GPSつきのカメラ、たとえばiPhoneで撮影した写真であれば(GPSの使用を許可していれば)自動で緯度経度情報が写真に添付され、写真がiCloud経由でMacのiPhotoにも自動配信されます。この、緯度経度情報つきの写真をiPhoto上で選択している状態を実行の前提条件として想定しています。

iphoto1.png
▲行きつけの練馬区春日町のバッティングセンター

その緯度経度の情報のついた写真をOS X 10.9上のiPhoto 9.5上で選択しておき、本AppleScriptを実行すると、マップ(Maps.app)上で場所を表示します。

住所情報を「東京都練馬区春日町」などと指定した場合には、最もズーム倍率(ズームレベル)が高い状態で地図が表示されてしまい、ズーム倍率の指定が無視されます。

そのために、緯度経度の情報を直接数値で指定して実験してみました。結果は予想どおり、緯度経度を数値で指定した場合にはズーム倍率の指定(z=)が有効になりました。

ズーム倍率(ズームレベル)は0から20ぐらいが有効で、うち0から2は指定した場所が画面の中心に来ないわ、世界地図全体が表示されるわ、関係ない場所が画面に出てくるわでほとんど意味がありません。

20以上は、たしかにズーム倍率が変わったようには見えるもののほとんど誤差程度にしか変化はなく、20が最大値だと判断してよさそうです。

zoom03.png
▲Zoom Level=3

zoom04.png
▲Zoom Level=4

zoom05.png
▲Zoom Level=5

zoom06.png
▲Zoom Level=6

zoom07.png
▲Zoom Level=7

zoom08.png
▲Zoom Level=8

zoom09.png
▲Zoom Level=9

zoom10.png
▲Zoom Level=10

zoom11.png
▲Zoom Level=11

zoom12.png
▲Zoom Level=12

zoom13.png
▲Zoom Level=13

zoom14.png
▲Zoom Level=14

zoom15.png
▲Zoom Level=15

zoom16.png
▲Zoom Level=16

zoom17.png
▲Zoom Level=17

zoom18.png
▲Zoom Level=18

zoom19.png
▲Zoom Level=19

zoom20.png
▲Zoom Level=20

zoom21.png
▲Zoom Level=21

zoom22.png
▲Zoom Level=22

zoom23.png
▲Zoom Level=23

zoom24.png
▲Zoom Level=24

スクリプト名:iPhotoで選択した写真から緯度経度情報を取得してMaps.appで緯度経度とズームレベルを指定して地図表示

set {aLat, aLon} to getLatitudeAndLongitudeFromAPhoto() of me
if {aLat, aLon} = {} then return

set aURL to “http://maps.apple.com/?ll=”
set zoomNum to 20
set bURL to (aLat as string) & “,” & (aLon as string)
set cURL to aURL & bURL & “&z=” & (zoomNum as string)

open location cURL

–iPhoto上で選択した写真から緯度経度情報を取得する
on getLatitudeAndLongitudeFromAPhoto()
  
  
tell application “iPhoto”
    set aSel to selection
    
if length of aSel = 0 then return {} –選択中の写真がない場合にはヌルのリストを返す
    
    
set aaSel to first item of aSel
    
set aProp to properties of aaSel
    
set aLatLocal to latitude of aProp –緯度
    
set aLonLocal to longitude of aProp —経度
  end tell
  
  
return {aLatLocal, aLonLocal}
  
end getLatitudeAndLongitudeFromAPhoto

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2012/05/04 iPhotoで選択中の写真から曜日別の件数を個別にカウント

iPhotoで選択中の写真からファイル作成日付を取得し、それぞれの写真の撮影曜日を取得して日曜日〜土曜日の各曜日の撮影枚数を集計するAppleScriptです。

iPhoto上で写真を(複数、かつ大量に)選択状態にしておき、本AppleScriptを実行すると撮影曜日ごとの枚数を集計します。

やはりというか、当然というべきなのか、土曜日と日曜日の撮影が多いという結果に。

スクリプト名:iPhotoで選択中の写真から曜日別の件数を個別にカウント
script spdUp
  property selList : missing value
  
property dList : {}
end script

–set t1 to current date

–データの初期化
set dList of spdUp to {}
set selList of spdUp to {}

–iPhotoからデータを取得する
tell application "iPhoto"
  set selList of spdUp to selection
  
  
if (selList of spdUp) = {} then
    display dialog "何も選択されていません。" buttons {"OK"} default button 1
    
return
  end if
  
  
repeat with i in (selList of spdUp)
    set the end of (dList of spdUp) to (date of i)
  end repeat
end tell

set {n1, n2, n3, n4, n5, n6, n7} to {0, 0, 0, 0, 0, 0, 0}

repeat with i in (dList of spdUp)
  set j to contents of i
  
set aWDnum to weekday of j as number
  
if aWDnum = 1 then
    set n1 to n1 + 1
  else if aWDnum = 2 then
    set n2 to n2 + 1
  else if aWDnum = 3 then
    set n3 to n3 + 1
  else if aWDnum = 4 then
    set n4 to n4 + 1
  else if aWDnum = 5 then
    set n5 to n5 + 1
  else if aWDnum = 6 then
    set n6 to n6 + 1
  else if aWDnum = 7 then
    set n7 to n7 + 1
  end if
end repeat

return {n1, n2, n3, n4, n5, n6, n7}

–> {309, 10, 9, 10, 17, 51, 375}
–{Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2012/05/03 iPhotoで選択中の写真から各月の件数を個別にカウント

iPhotoで選択中の写真から、1か月単位で撮影枚数を個別にカウントするAppleScriptです。

iPhotoの「人々」を用いて任意の人物の写真をすべて選択しておき、

iphoto2.png

その状態で本AppleScriptを実行すると、各写真の日付情報を取得。日付情報をソートして開始月、終了月の情報を求め、各月にどの程度の写真撮影が行われたかを順次カウントして集計します。

iPhotoにいちいちアクセスするとスピードの低下が心配されるところですが、選択中の写真の日付情報を取得したらあとはiPhotoにアクセスせずに処理を行うため、781枚の写真を選択した状態で、93秒(MacBook Pro 2010 Core i7 2.66GHz、Mac OS X 10.6.8、8GB)で処理を終了しました。処理のほとんどは、iPhotoで選択中の写真の情報を取得する部分で、ソートや集計はほぼ一瞬です。

「○月には遊びに行ってなかったので1枚も撮っていなかったが、さすがに正月は撮影枚数が多いな」

などという、プログラムで分析するまでもない、予想どおりの傾向が分かります。

年ごとの集計、曜日ごとの集計などいろいろ集計のバリエーションを増やしてみると楽しいことでしょう。たぶん、「土日に撮影している枚数が多い」という結果が出るんでしょうけれども。期間で集計するほかに、撮影時の緯度・経度で集計するなど、さまざまな応用が考えられます。

スクリプト名:iPhotoで選択中の写真から各月の件数を個別にカウント
script spdUp
  property selList : missing value
  
property dList : {}
  
property eList : {}
  
property fList : {}
end script

–set t1 to current date

–データの初期化
set dList of spdUp to {}
set eList of spdUp to {}
set selList of spdUp to {}

–iPhotoからデータを取得する
tell application “iPhoto”
  set selList of spdUp to selection
  
  
if (selList of spdUp) = {} then
    display dialog “何も選択されていません。” buttons {“OK”} default button 1
    
return
  end if
  
  
repeat with i in (selList of spdUp)
    set the end of (dList of spdUp) to date of i
  end repeat
end tell

–ソート
set (dList of spdUp) to shellSort5(dList of spdUp) of me

–選択中の写真の最初の日付、最近の日付を求める
set minDate to contents of first item of (dList of spdUp)
set maxDate to contents of last item of (dList of spdUp)

–開始日、終了日の間の{年,月}のリストを取得する
set mmList to retYearMonthWithinPeriod(minDate, maxDate) of me

set aLen to length of (dList of spdUp)
set hitList to {}

set aCount to 0

set aPointer to 1
set hitF to false

repeat with i in mmList
  set {aYear, aMonth} to i
  
set sDate to (aYear as string) & “/” & (aMonth as string) & “/1″
  
set eDate to (aYear as string) & “/” & (aMonth as string) & “/” & getMlen(aYear, aMonth) of me as string
  
set sDateObj to date sDate
  
set eDateObj to date eDate
  
  
  
repeat
    set j to contents of item aPointer of (dList of spdUp)
    
if (sDateObj j) and (j eDateObj) then
      
      
if hitF = false then
        set hitF to true
        
set aCount to 1
        
        
set aPointer to aPointer + 1
        
      else
        set aCount to aCount + 1
        
set aPointer to aPointer + 1
      end if
      
    else
      
      
if hitF = true then
        set the end of hitList to {aYear, aMonth, aCount}
        
set aCount to 0
        
set hitF to false
        
exit repeat
      else
        set the end of hitList to {aYear, aMonth, 0}
        
exit repeat
      end if
      
    end if
    
    
if aPointer > aLen then
      exit repeat
    end if
    
  end repeat
  
  
if aPointer > aLen then
    exit repeat
  end if
  
end repeat

if hitF = true then
  set the end of hitList to {aYear, aMonth, aCount}
end if

–set t2 to current date
–set t3 to t2 -t1
–> 93 sec

hitList
–> {{2009, 4, 2}, {2009, 5, 0}, {2009, 6, 0}, {2009, 7, 25}, {2009, 8, 0}, {2009, 9, 0}, {2009, 10, 1}, {2009, 11, 2}, {2009, 12, 7}, {2010, 1, 38}, {2010, 2, 41}, {2010, 3, 4}, {2010, 4, 36}, {2010, 5, 5}, {2010, 6, 3}, {2010, 7, 36}, {2010, 8, 26}, {2010, 9, 49}, {2010, 10, 8}, {2010, 11, 61}, {2010, 12, 23}, {2011, 1, 32}, {2011, 2, 40}, {2011, 3, 0}, {2011, 4, 26}, {2011, 5, 44}, {2011, 6, 10}, {2011, 7, 32}, {2011, 8, 41}, {2011, 9, 0}, {2011, 10, 0}, {2011, 11, 39}, {2011, 12, 51}, {2012, 1, 25}, {2012, 2, 0}, {2012, 3, 51}, {2012, 4, 23}}

on retYearMonthWithinPeriod(sDate, eDate)
  
  
set sYear to year of sDate
  
set sMonth to month of sDate as number
  
  
set eYear to year of eDate
  
set eMonth to month of eDate as number
  
  
set mList to {}
  
  
if sYear is equal to eYear then
    
    
repeat with i from sMonth to eMonth
      set the end of mList to {sYear, i}
    end repeat
    
  else if sYear + 1 = eYear then
    
    
repeat with i from sMonth to 12
      set the end of mList to {sYear, i}
    end repeat
    
    
repeat with i from 1 to sMonth
      set the end of mList to {eYear, i}
    end repeat
    
  else
    
    
repeat with i from sMonth to 12
      set the end of mList to {sYear, i}
    end repeat
    
    
repeat with i from (sYear + 1) to (eYear - 1)
      repeat with ii from 1 to 12
        set the end of mList to {i, ii}
      end repeat
    end repeat
    
    
repeat with i from 1 to sMonth
      set the end of mList to {eYear, i}
    end repeat
    
  end if
  
  
return mList
end retYearMonthWithinPeriod

–最大値を取得する
on maximumFromList(nList)
  script o
    property nl : nList
  end script
  
  
set max to item 1 of o’s nl
  
repeat with i from 2 to (count nList)
    set n to item i of o’s nl
    
if n > max then set max to n
  end repeat
  
return max
  
end maximumFromList

–最小値を取得する
on minimumFromList(nList)
  script o
    property nl : nList
  end script
  
  
set min to item 1 of o’s nl
  
repeat with i from 2 to (count nList)
    set n to item i of o’s nl
    
if n < min then set min to n
  end repeat
  
return min
  
end minimumFromList

–指定月の長さを得る(日数)
on getMlen(aYear, aMonth)
  
  
set aDat to (aYear as text) & “/” & (aMonth as text) & “/1″
  
if aMonth is not equal to 12 then
    set eDat to ((aYear as text) & “/” & (aMonth + 1) as text) & “/1″
  else
    set eDat to ((aYear + 1) as text) & “/” & (1 as text) & “/1″
  end if
  
  
–set sDat to date aDat
  
set eDat to date eDat
  
set eDat to eDat - 1
  
  
set mLen to day of eDat
  
return mLen
  
end getMlen

–プレーンなAppleScriptベースでは最速ソート
on shellSort5(aSortList) – スクリプトオブジェクトを使用
  script oBj
    property list : aSortList
  end script
  
set len to count oBj’s list’s items
  
set gap to 1
  
repeat while (gap len)
    set gap to ((gap * 3) + 1)
  end repeat
  
repeat while (gap > 0)
    set gap to (gap div 3)
    
if (gap < len) then
      repeat with i from gap to (len - 1)
        set temp to oBj’s list’s item (i + 1)
        
set j to i
        
repeat while ((j gap) and (oBj’s list’s item (j - gap + 1) > temp))
          set oBj’s list’s item (j + 1) to oBj’s list’s item (j - gap + 1)
          
set j to j - gap
        end repeat
        
set oBj’s list’s item (j + 1) to temp
      end repeat
    end if
  end repeat
  
return oBj’s list
end shellSort5

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2012/04/21 iPhoto, iTunes, Safariアップデートについて

iPhoto 9.2.3、iTunes 10.6.1、Safari 5.1.5の各アップデートが提供されていますが、これらのアプリケーションのAppleScript用語辞書に変更はありません。

2012/03/07 InDesign CS3で指定のオプジェクトを、JPEG書き出ししてiPhoneへ

InDesign CS3上で指定したオブジェクトをJPEG書き出ししてiPhoneに転送するAppleScriptです。

ことのはじまりは、目下開発中のiPhoneアプリ(私はプロジェクト管理やら仕様書書きやらを)で、Welcome画面の表示を行うのに「文字詰めや行送りをいろいろ指定できないと!」という話になったこと。

……そもそも、iPhoneの文字表示部品に、そんな気の利いたものはありません。そこで、InDesignやらIllustrator上で気の済むまで行間や文字間にこだわっていただいて、それをそのまま「画像」として書き出して表示しようではないか、と。

ただし、その指定内容をすぐにiPhoneの実機で見たいという話に。

その場で10分もかけずにInDesign書類上の指定レイヤー(「コンテンツ」)上に存在する指定名称(スクリプトラベル「screen」)のグループをJPEG書き出しして、書き出したJPEG書類をiPhotoにインポートして、iTunesに命令して接続しているすべてのiOSデバイスにシンクロを行うようAppleScriptで指令を出すようにしてみました。

できた瞬間はかなりガッツポーズでしたが、冷静に考えるとInDesignから書き出されるJPEG画像のクオリティが「残念なレベル」です。また、シンクロが終わるまでにちょっと時間がかかるので、実用性がいまひとつ。

結局、Good Reader for iPhoneをインストールして、iTunes経由でGood Readerに対してInDesignから書き出したPDFを渡す、という方法に落ち着きました。本Scriptは何らかの「可能性」を感じさせてくれはしたのですが、結局おクラ入りに。

スクリプト名:InDesign CS3で指定のオプジェクトを、JPEG書き出ししてiPhoneへ
–v1 InDesign CS3から直接JPEG書き出し。画像クオリティが低くて難あり

set dtPath to (path to desktop) as string
set fName to do shell script “date +%Y%m%d%H%M%S”

set fullPath to dtPath & fName & “.jpg”
set fullPathPOSIX to POSIX path of fullPath

tell application “Adobe InDesign CS3″
  tell document 1
    tell layer “コンテンツ”
      set aList to every group whose label is equal to “screen”
    end tell
    
    
set expItem to contents of first item of aList
    
export expItem format JPG to fullPath without with grids
    
  end tell
end tell

–iPhotoに書き出したJPEGファイルをインポートする
tell application “iPhoto”
  import from fullPathPOSIX
end tell

–アップデート可能なiOSデバイスをアップデートする
tell application “iTunes”
  repeat with i in sources
    if (kind of i is iPod) then update i
  end repeat
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/10/13 Safari 5.1.1、iPhoto 9.2が登場。AppleScript用語辞書に変更なし

Safari 5.1.1とiPhoto 9.2アップデートが登場しました。また、Mac OS X 10.7.2のアップデートも登場しています。iOS5のアップデートも出てはいるものの、まだアップデートサーバーとつながらずアップデートできず……。

Safari 5.1.1とiPhoto 9.2については前バージョンであるSafari 5.1とiPhoto 9.1.5からAppleScript用語辞書の内容に変更がないことを確認しました。

2010/11/14 iLife 11のAppleScript用語辞書の変更点

iLife 11が発売されてしばらくたちますが、この手のアプリケーションはリリース直後に飛びつかないのがセオリー。どうせ、Apple側ではユーザーがため込んだ「本気」の写真ライブラリなどでテストしているはずがないので、ライブラリの移行ミスが発生するのがいつものこと(とくにiPhoto)……アップデータが出て問題が解消されるのを待っていました。

iLifeアプリケーションスイートでは、iMovie以外はすべてAppleScriptに対応しています。ただし、対応度はアプリケーションによってまちまちです。

■GarageBand 6.0
AppleScript用語辞書変更なし。対応度は低く、GarageBandをAppleScriptからコントロールしてもできることがほとんどない(Podcastの作成関連でいろいろできると自動処理させる意義が出てくるのですが)。

■iDVD 7.1
機能据置きのはずのiDVDですが、バージョン番号が微妙に(7.0.3→7.1)あがっており、AppleScript用語辞書の内容も変更になっています。ほとんどが誤差程度のものですが、1つだけ「movie」オブジェクトのプロパティに「marimbaSlideshowFilePath」というものが増えています。

marimbaSlideshowFilePath Unicode text — the marimbaSlideshowFilePath of this movie

とあるので、パスをUnicode Textで指定するもののようですが、テストは行っていません。iDVDには使えそうな用語が多数用意されているのですが、具体的にそれらを使って自動処理させるような「用途」が逆に見あたりません。目視で確認しないとまずそうな機能ばかりなので、自動で本当に処理してよいのか、少々疑問です。

■iPhoto 9.1
iLife 11の中では随一のAppleScript対応度のiPhoto。アップデートして、ライブラリが移行できないというバグが解消され、カレンダーの注文ができるようになったiPhoto 9.1を調べてみました。

iPhotoもAppleScript用語辞書の内容変更はとくにありませんでした。用語辞書の記述ミスが直ったり、誤差程度の記述が変更された程度です。

総評としては……Apertureで導入されたAppleScript用語辞書内のサンプルAppleScriptが、このiLife 11でも導入されるのではないかと期待していたのですが、それは実現していませんでした。少々期待はずれです。

AppleScriptの用例が最初から辞書の中に入っていることの意義は大きいと思うものですが、Appleのエンジニア(とくに、AppleScriptエンジニアリングチーム)が書くAppleScriptは原理主義的すぎて自然言語っぽい記述になる傾向があり(itとかthatとか使いまくるし、theを入れて読みやすくしたがるものの、そんなもん入れられても困ります)……冗長すぎて、ユーザーの理解をさまたげる傾向があります。

Appleの連中も、もっと「プログラムっぽい」簡潔な記法で書くようにしてほしいものです。

2010/07/10 iPhotoで選択中のファイルをリネームする

iPhotoで選択中のファイルをリネームするAppleScriptです。

iPhotoで選択中の写真/ムービーのファイル名については、そのままname属性を書き換えれば変わるというわけには行きません。

iPhotoのAppleScript用語辞書を見ると「r/o」(リードオンリー、書き込み不可)にはなっていないのですが、実際に操作してみるとファイル名の変更は通りません。

そこで、選択中の写真/ムービーのオリジナルのファイルのパスを取得しておき、これをデスクトップフォルダ上にコピーして、リネーム(作成日時の文字列にリネーム)。オリジナルの写真/ムービーを削除した後に、リネームしたファイルをインポートすればよいのではないかと考えました。

インポートについては、いままでそんな操作をAppleScriptから行う必要に迫られたことがなかったので、海外のMLの過去ログやWebサイトを巡回して調査を行う必要がありました。調査に時間はかかりましたが、インポートはできました。

予想外にてこずらされたのが、iPhotoライブラリ上からの画像/ムービーの削除で……スマートアルバム上から削除しようとすると、これが行えないことが判明。このあたりは、「GUI側から行えない操作はAppleScript側からも行えない」という大原則(これを理解できていない人が多い)が適用されており、実際にGUI側から操作して動作内容を把握。

削除を行う際には削除可能なアルバム表示に切り換えてから行うようにしてみました。

ちょっとは楽しめましたが、処理が煩雑な割には最終的な処理結果は大したものではなく、そもそもこんなに手間がかかる処理を実際に書くこと自体に問題があるものと思われます。わざわざ難しいテーマを自分で設定して挫折するのではなく、難易度を下げて「もっと簡単なプログラム」で済むように前提条件を変更するほうが生産的です。

本テーマも、Twitter上でみかけて取り組んでみたのですが、iPhotoからオリジナルのファイルを取り出してリネームし、QuickTime Player X側でYoutubeにアップロードした方が簡単だったのではないかと思われました。

スクリプト名:iPhotoで選択中のファイルをリネームする
tell application "iPhoto"
  set a to selection –iPhoto上で選択中の写真/ムービーのうち最初のものを処理対象に
  
if a = {} then return –何も選択されていなかったら処理終了
  
set aa to first item of a
  
  
set aInfo to properties of aa
  
set makeDate to date of aInfo –作成日
  
set iPPath to original path of aa –オリジナルファイルのパス
end tell

–iPhotoで選択しておいた写真/ムービーをデスクトップ上にコピーして日付でリネーム
–確実に動作することを重視したので、速度の最適化は行っていない段階
set aPhoto to (POSIX file iPPath) as alias –ASで処理しやすいよう、POSIX pathからaliasに変換(iPhotoがPOSIX pathを返して来るのがおかしい)
set dtPath to path to desktop from user domain

tell application "Finder"
  with timeout of 3600 seconds –バカでかいファイルを遅いマシンでコピーしている場合への対策
    set dPath to (duplicate aPhoto to folder dtPath with replacing) –コピー
  end timeout
  
  
set dPath to dPath as alias –処理しやすいようaliasにcast
  
set aExt to (name extension of dPath) –拡張子をオリジナルのファイル名から取り出し
  
  
set name of dPath to makeYYYYMMDDhhmmssStr(makeDate) of me & "." & aExt –リネーム
end tell

tell application "iPhoto"
  set origAlbum to current album –現在表示中のアルバムを取得
  
set aType to type of origAlbum –表示中のアルバムのタイプを取得
  
  
–スマートアルバム上では写真/ムービーの削除が行えないので、確実に削除できるアルバムに変更しておく
  
–このへん、まだ試行錯誤の最中
  
if aType = smart album then
    select album "写真" –写真/ムービーが削除可能なアルバムを選択しておく
    
select aa –再度、写真/ムービーを選択状態に
  end if
  
  
remove aa –最初に選択していた写真/ムービーを削除
  
  
with timeout of 3600 seconds –遅いマシンへの対策
    import from {dPath} to album "最後の読み込み"
  end timeout
  
  
set current album to origAlbum
end tell

–DateオブジェクトからYYYY-MM-DD-hh-mm-ssの形式の文字列を返す
on makeYYYYMMDDhhmmssStr(aDate)
  
  
–Dateオブジェクトから各要素を取り出す
  
set yStr to (year of aDate) as string
  
set mStr to (month of aDate as number) as string
  
set dStr to (day of aDate) as string
  
set hhStr to ((time of (aDate)) div 3600) as string
  
set mmStr to ((time of (aDate)) mod 3600 div 60) as string
  
set ssStr to ((time of (aDate)) mod 3600 mod 60) as string
  
  
–桁数を合わせる
  
set y2Str to retZeroPaddingText(yStr, 4) of me
  
set m2Str to retZeroPaddingText(mStr, 2) of me
  
set d2Str to retZeroPaddingText(dStr, 2) of me
  
set hh2Str to retZeroPaddingText(hhStr, 2) of me
  
set mm2Str to retZeroPaddingText(mmStr, 2) of me
  
set ss2Str to retZeroPaddingText(ssStr, 2) of me
  
  
return (y2Str & "-" & m2Str & "-" & d2Str & "-" & hh2Str & "-" & mm2Str & "-" & ss2Str)
  
end makeYYYYMMDDhhmmssStr

–数値にゼロパディングしたテキストを返す
on retZeroPaddingText(aNum, aLen)
  set tText to ("0000000000" & aNum as text)
  
set tCount to length of tText
  
set resText to text (tCount - aLen + 1) thru tCount of tText
  
return resText
end retZeroPaddingText

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/07/09 iPhotoに指定画像をインポートする

iPhoto 09で、指定画像をインポートするAppleScriptです。

画像をリストに入れて指定します。それなりの数を指定した場合には、比例して取り込み時間がかかるので、大量の取り込みを行う場合にはタイムアウト時間の指定を(with timeout of XXXX seconds)行う必要があることでしょう。

インポート先を行うアルバム名が「最後の読み込み」という、日本語ローカライズされた名前を指定する必要があり、このあたり……アプリケーションごとにローカライズされた名称を求められたり、英語環境の名称を求められたりと方針がバラバラなので、どーにかしてほしいものです。

スクリプト名:iPhotoに指定画像をインポートする
set aFile to choose file
set aLIst to aFile as list

tell application “iPhoto”
  import from aLIst to album “最後の読み込み” –英語環境だと”New images”
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/06/06 iPhotoで横幅が400ピクセルより小さい写真をすべて削除する

iPhotoで「横幅(width)が400ピクセルより小さい写真」をすべて削除するAppleScriptです。

よく、初心者が陥りがちなハマりポイントなのですが、削除系や移動系のコマンドでリストに入れたオブジェクトを一括で指定できるケースが多いのに、1つ1つループで処理している場合があります。

Finderのmoveコマンドやdeleteコマンド、Mail.appのメッセージの移動など、リストに入れた複数のオブジェクトに対して一括命令できるようになっていることが多いので、試してみることをおすすめします。

スクリプト名:iPhotoで横幅が400ピクセルより小さい写真をすべて削除する
with timeout of 36000 seconds
  tell application "iPhoto"
    remove (every photo whose width < 400)
  end tell
end timeout

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/05/03 iPhotoで選択中の写真のコメントに「花」+日付を入れる

iPhoto上で選択中の写真のコメントに、「花」+日付(YYMMDD)を入れるAppleScriptです。

実家に帰った際に、iPhoto上に父親がため込んでいる花の写真をまとめてCD-Rに焼いて海外のご友人に送りたい、という相談を受け……新規アルバムを作成してドラッグ&ドロップすることを勧めたのですが、これがなかなか(父親には)難しい操作で、頻繁にミスをしてしまいます。

しばし考えた末に、「iPhoto上で花の写真を複数選択しておいて、Script Menuからコメントにマークを入れるAppleScriptを用意すればいいだろう」ということになり、5分ぐらいで作ってしまいました。

iphoto10.jpeg

「花」+日付のコメントが入っている写真をまとめる「スマートアルバム」を作成しておけば、Scriptを実行した対象の写真がこのスマートアルバムに入るので、あとはiPhotoの「共有」メニューから「ディスクを作成」すればスマートアルバムに入った花の写真をCD-Rに手軽に焼けるという寸法です。

iphoto11.jpg

当初はコメントに「花」とだけ入れていたのですが、「次回、新たなCDを作成する場合には困るだろう」という話になって、「花」+日付を入れることで、あとでまた新しいCDを作るような場合にも対処してみました。

スクリプト名:iPhotoで選択中の画像のコメントに「花」+YYMMDDを入れる
set dText to do shell script “date +%Y%m%d”

tell application “iPhoto”
  set a to selection
  
set aClass to class of first item of a
  
if aClass is not equal to photo then return
  
  
repeat with i in a
    set comment of i to “花” & dText
  end repeat
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/04/30 iPhotoで選択中の写真を別名で横幅640ドットに縮小して保存

iPhoto上で選択中の写真(JPEGファイル)を横幅640ドットにリサイズして別の場所に保存するAppleScriptdです。

新しいデジカメ(Ricoh CX3)を買って、前のモデルより画素数が増えたら……なかなか大変なことに(汗) そこで、早速作ってみました。こういう、「必要に迫られて作るAppleScript」が一番役に立ちます。

iphoto1.jpeg

スクリプト名:iPhotoで選択中の写真を別名で横幅640ドットに縮小して保存
tell application “iPhoto”
  set a to selection
  
  
set anItem to item 1 of a
  
set aClass to class of anItem
  
if aClass is equal to album then return
  
  
set b to properties of anItem
  
set imgPath to image path of anItem
end tell

set newFile to choose file name
set newFilePosix to POSIX path of newFile

try
  tell application “Image Events”
    launch
    
set this_image to open ((POSIX file imgPath) as alias)
    
scale this_image to size 640
    
save this_image in newFilePosix as JPEG with icon
    
close this_image
  end tell
on error error_message
  display dialog error_message
end try

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/10/08 iPhotoで選択中の写真の撮影日付を変更する

iPhoto上で選択中の写真の撮影日時を任意の日付に変更するAppleScriptです。

iphoto1.jpg

選択中の写真に対して日付を変更するだけのものですが、割と実用的です。他人からもらったデジカメの写真の日付が狂っていて、もらったはいいが並びがたいへん気になるとか、そういう方はこのAppleScriptに手を加えて、正しい日付に直してみるとスッキリするのではないでしょうか。

スクリプト名:iPhotoで選択中の写真の撮影日付を変更する
set aDate to “2008/1/5″
set aDate to date aDate

tell application “iPhoto”
  set aList to selection
  
repeat with i in aList
    set aa to contents of i
    
set date of aa to aDate
  end repeat
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/01/03 iPhotoで、複数名称による写真指定を行う例(できない)

iPhotoで複数の名称(リスト)に該当する写真を取得しようとして、できなかったという例です。
(more…)

2009/01/03 iPhotoで写真のファイル名に合致する写真を取得する

iPhotoで、指定の文字列を含む名称(ファイル名)の写真を取得します。
(more…)

2009/01/03 iPhotoで特定のアルバムに入っている写真の枚数をカウントする

iPhotoで特定のアルバムに入っている写真の枚数をカウントします。
(more…)

2009/01/03 iPhotoでアルバムの名称一覧を取得する

iPhotoに登録されている「アルバム」の名称一覧を取得します。
(more…)

2008/03/29 iPhotoで選択中の写真をデスクトップピクチャに設定

この機能自体はiPhotoの標準コマンドでも用意されているため、AppleScriptから実行する必然性はあまりないのですが、iPhoto上で選択中の写真を対象に何らかの処理を行うための基礎的な実例と思っていただければけっこうです。

スクリプト名:選択中の写真をデスクトップピクチャに設定する
tell applicationiPhoto
  set a to selection
  
  
set anItem to item 1 of a
  
set aClass to class of anItem
  
if aClass is equal to album then return
  
  
set b to properties of anItem
  –
> {dimensions:{1280.0, 960.0}, image filename:”RIMG0095.JPG”, image path:”/Users/maro/Pictures/iPhoto Library/Modified/2007/ロール 33/RIMG0095.JPG”, date:date “2007年 4月 29日 日曜日 2:53:42 PM”, title:”RIMG0095.JPG”, class:photo, height:960.0, thumbnail path:”/Users/maro/Pictures/iPhoto Library/Data/2007/ロール 33/RIMG0095.jpg”, name:”RIMG0095.JPG”, thumbnail filename:”RIMG0095.jpg”, comment:”", width:1280.0, id:4.29496789E+9}
  
set imgPath to image path of anItem
end tell

set imgPathAlias to POSIX file imgPath

tell applicationFinder
  set desktop picture to imgPathAlias
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に