Archive for the 'Image Events' Category

2014/04/30 破損画像チェック 10.9

破損画像チェック用AppleScriptをOS X 10.9向けに修正したものです。

ただ、Image Eventsの挙動がかなり(10.9からなのか、以前からなのか)変わっているようで、以前は検出できていた方法では、破損を検出できなくなっているようです。

たまたま破損した画像ファイル群(「破損画像コレクション」)を手元に収集しており、それぞれ、

(A)can not open

そもそも画像のオープン自体ができない

(B)alerted

(Photoshopで)画像オープン時に警告が表示されるが、オープンできる

(C)can not export

画像オープンできるが、QuickTime Playerにインポートしたあとでムービー保存しようとするとエラーになる

と破損レベルを定義して区分けしてきました。

以前は、(A)〜(C)までのデータをすべて検出できていたのですが、OS X 10.9のImage Eventsで同じデータに対してチェックを行ったところ、(A)のみ検出できる状態でした。何か、もう少し「まっとうな」方法で破損検出を行う必要がありそうです。

ただ、JPEG画像についてはファイル末尾のJPEGマーカーの存在確認だけでもけっこうなレベルで破損確認が行えると思います。

スクリプト名:破損画像チェック 10.9
set aFile to choose file
set aRes to breakImageCheck(aFile) of me
–> true/false (画像が破損しているとfalseが返る)

–破損画像チェック
–(通常時:true、破損時:false が返ってくる)
–対象形式:PICT/Photoshop/BMP/QuickTime Image/GIF/JPEG/MacPaint/JPEG2/SGI/PSD/TGA/Text/PDF/PNG/TIFF
on breakImageCheck(theFile)
  try
    tell application “Image Events”
      set this_image to open theFile
      
set {theWidth, theHeight} to dimensions of this_image
      
properties of this_image
      
close this_image
    end tell
    
    
return true –normal image
  on error
    return false –broken image
  end try
end breakImageCheck

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

2014/04/30 指定のクリエータコードに該当するICC Profileをリストアップ v3

Image Events経由で指定のクリエータコードに該当するICC ProfileをリストアップするAppleScriptです。

ICC Profileの名称を「ぴよぴよ」と返す場合と「ぴよぴよ.icc」と返す場合があって(作成時のメーカー側のゆらぎ)、そのあたりの整合性がないあたりを埋めるために強制的に名称の末尾に「.icc」を付けて返す機能や、名称から「.icc」を外して返す機能などを備えています。

ICC Profileの存在確認は、

 (1)ファイルとして指定のフォルダに存在するかという確認
 (2)OS側が認識しているかどうか(Image Eventsが認識しているか)という確認
 (3)アプリケーション側が認識しているかという確認

という3レイヤーで行う必要があり、それぞれについて取得できる名称が異なったりする(「.icc」が付いていたりいなかったり)ため、拡張子を付けたり外したりして結果を返す機能を付けたのがv2。

逆に、(2)で取得した名称を一切いじくらない機能を付けたのがこのv3です。

スクリプト名:指定のクリエータコードに該当するICC Profileをリストアップ v3
–出力例:クリエータがAppleのICC Profileを出力。重複を許容、ファイルパスを出力しない、末尾に強制的に「.icc」を付加
set aList to getICCProfileDataByCreatorCode(“APPL”, true, false, “”) of me
–> {”Calib 20100428″, “calib 20110623″, “calib20091122″, “Calibed_Retina_1″, “Cinema HD”, “Cinema HD Display”, “Cinema HD Display_L”, “Cinema HD 補正済み(R)”, “Color LCD 10.4.7″, “Color LCD 2009_09″, “colorLCD”, “Display”, “Display”, “Display”, “Display”, “Display”, “Display”, “DTW17ASXS_cailblated”, “HD 709-A”, “MacBook3″, “S2231W 補正済み”, “SD 170M-A”, “W2442 20090102″, “Web セーフカラー”, “カメラ RGB プロファイル”, “カラー LCD”, “グレイ調”, “セピア調”, “ディスプレイ”, “ブルー調”, “一般 CMYK プロファイル”, “一般 Lab プロファイル”, “一般 RGB プロファイル”, “一般 XYZ プロファイル”, “一般グレイガンマ 2.2 プロファイル”, “一般グレイプロファイル”, “白黒”, “明度減少”, “明度増大”}

–creatorで抽出したICC Profileのリストを取得する(名称、パス)
–  aCode: ICC ProfileのCreator Code(=”XXXX”)
–  dupFlag: trueだとICC Profileの名称重複を許容、falseだと許容しない
–   filePathOut: trueだとファイルパスを出力する
–  extOut:名称に拡張子(.icc)を出力するかどうか。falseだと出力しない。trueだと強制付加して返す、ヌルだとそのまま操作しない
on getICCProfileDataByCreatorCode(aCode, dupFlag, filePathOut, extOut)
  
  
–Image Eventsが起動中にICC Profileを追加すると、その後にProfileの存在確認を
  
–行うと認識されないケースがあったので、念のために起動中だったImage Eventsを落とす
  
tell application “Image Events”
    if it is running then
      quit
      
launch
      
delay 0.5 –待たないとダメ!!(MacProでは未検証)
    end if
  end tell
  
  
  
tell application “Image Events”
    try
      set aList to properties of every profile whose creator is aCode
    on error
      return {}
    end try
    
    
set dupList to {} –重複回避用リスト(名称ベース)
    
    
set outList to {} –出力用リスト
    
    
repeat with i in aList
      
      
set aName to (name of i)
      
      
if extOut = false then
        –拡張子を削って返す
        
if aName ends with “.icc” then
          set aName to text 1 thru -5 of aName
        end if
      else if extOut = true then
        –拡張子を強制的に追加して返す
        
if aName does not end with “.icc” then
          set aName to aName & “.icc”
        end if
      else
        –それ以外だと何もしない
      end if
      
      
set aLoc to (location of i)
      
      
try
        set aLoc to aLoc as alias
        
set aLoc to (aLoc as string)
      on error
        set aLoc to “”
      end try
      
      
      
if aLoc is not equal to “” then
        if dupFlag = false then
          –重複を許容しない
          
if aName is not in dupList then
            if filePathOut = true then
              set the end of outList to {aName, aLoc}
            else
              set the end of outList to aName
            end if
          end if
        else
          –重複を許容する
          
if filePathOut = true then
            set the end of outList to {aName, aLoc}
          else
            set the end of outList to aName
          end if
        end if
        
        
set the end of dupList to aName
        
      end if
    end repeat
    
  end tell
  
  
return outList
  
end getICCProfileDataByCreatorCode

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

2014/04/16 指定のクリエータコードに該当するICC Profileをリストアップ v2

Image Events経由で指定のクリエータコードに該当するICC ProfileをリストアップするAppleScriptです。

以前に作ったものは一応名前の検出だけできればよかったので、ラフに書いた記憶がありますが……実際に実戦投入してみたところ、検出されないProfileがあるとかいろいろ問題が出てきたので、書き直してみました(以前のものはなかったことにしたいぐらいダメダメでした)。

また、ICC Profileの名称を「ぴよぴよ」と返す場合と「ぴよぴよ.icc」と返す場合があって(作成時のメーカー側のゆらぎ)、そのあたりの整合性がないあたりを埋めるために強制的に名称の末尾に「.icc」を付けて返す機能や、名称から「.icc」を外して返す機能などを備えています。

OSにICC Profileを強制的にインストールしたりと、ICC Profileの状態を変更した後には、Image Eventsを一度終了させないと最新の状態を検知してくれないことが判明して、「起動中ならいったん終了して再立ち上げ」といった処理を書いていますが……正直、開発環境よりも高速でCPUのキャッシングのメカニズムが異なるMacProでちゃんと動くのかは不明です。

おそらく、MacProでも動くとは思うのですが……こうして載せておいてAppleStoreの店頭のデモ機で試してみるしかないですね。

スクリプト名:指定のクリエータコードに該当するICC Profileをリストアップ v2
–出力例:クリエータがAppleのICC Profileを出力。重複を許容、ファイルパスを出力しない、末尾に強制的に「.icc」を付加
set aList to getICCProfileDataByCreatorCode(“APPL”, true, false, true) of me
–> {”Calib 20100428.icc”, “calib 20110623.icc”, “calib20091122.icc”, “Calibed_Retina_1.icc”, “Cinema HD.icc”, “Cinema HD Display.icc”, “Cinema HD Display_L.icc”, “Cinema HD 補正済み(R).icc”, “Color LCD 10.4.7.icc”, “Color LCD 2009_09.icc”, “colorLCD.icc”, “Display.icc”, “Display.icc”, “Display.icc”, “Display.icc”, “Display.icc”, “Display.icc”, “DTW17ASXS_cailblated.icc”, “HD 709-A.icc”, “MacBook3.icc”, “S2231W 補正済み.icc”, “SD 170M-A.icc”, “W2442 20090102.icc”, “Web セーフカラー.icc”, “カメラ RGB プロファイル.icc”, “カラー LCD.icc”, “グレイ調.icc”, “セピア調.icc”, “ディスプレイ.icc”, “ブルー調.icc”, “一般 CMYK プロファイル.icc”, “一般 Lab プロファイル.icc”, “一般 RGB プロファイル.icc”, “一般 XYZ プロファイル.icc”, “一般グレイガンマ 2.2 プロファイル.icc”, “一般グレイプロファイル.icc”, “白黒.icc”, “明度減少.icc”, “明度増大.icc”}

–creatorで抽出したICC Profileのリストを取得する(名称、パス)
–  aCode: ICC ProfileのCreator Code(=”XXXX”)
–  dupFlag: trueだとICC Profileの名称重複を許容、falseだと許容しない
–   filePathOut: trueだとファイルパスを出力する
–  extOut:名称に拡張子(.icc)を出力するかどうか。falseだと出力しない。trueだと強制付加して返す
on getICCProfileDataByCreatorCode(aCode, dupFlag, filePathOut, extOut)
  
  
–Image Eventsが起動中にICC Profileを追加すると、その後にProfileの存在確認を
  
–行うと認識されないケースがあったので、念のために起動中だったImage Eventsを落とす
  
tell application “Image Events”
    if it is running then
      quit
      
launch
      
delay 0.5 –待たないとダメ!!(MacProでは未検証)
    end if
  end tell
  
  
  
tell application “Image Events”
    try
      set aList to properties of every profile whose creator is aCode
    on error
      return {}
    end try
    
    
set dupList to {} –重複回避用リスト(名称ベース)
    
    
set outList to {} –出力用リスト
    
    
repeat with i in aList
      
      
set aName to (name of i)
      
      
if extOut = false then
        –拡張子を削って返す
        
if aName ends with “.icc” then
          set aName to text 1 thru -5 of aName
        end if
      else
        –拡張子を強制的に追加して返す
        
if aName does not end with “.icc” then
          set aName to aName & “.icc”
        end if
      end if
      
      
set aLoc to (location of i)
      
      
try
        set aLoc to aLoc as alias
        
set aLoc to (aLoc as string)
      on error
        set aLoc to “”
      end try
      
      
      
if aLoc is not equal to “” then
        if dupFlag = false then
          –重複を許容しない
          
if aName is not in dupList then
            if filePathOut = true then
              set the end of outList to {aName, aLoc}
            else
              set the end of outList to aName
            end if
          end if
        else
          –重複を許容する
          
if filePathOut = true then
            set the end of outList to {aName, aLoc}
          else
            set the end of outList to aName
          end if
        end if
        
        
set the end of dupList to aName
        
      end if
    end repeat
    
  end tell
  
  
return outList
  
end getICCProfileDataByCreatorCode

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

2014/03/30 画像の縦長横長を見てフォルダ仕分け v2

指定フォルダ内の画像の縦横のドット数を見て、縦長の画像か横長の画像かを検出して、フォルダ分けするAppleScriptです。

元ネタはAppleのサンプルScript(変数名の命名ルールがAppleっぽい)だったのですが、書いたのが随分昔で最近も使っていなかったため、その後のOSのバージョンアップで動かなくなっていたのを検出できていませんでした。

問題のあった部分を書き直しておきました。

スクリプト名:画像の縦長横長を見てフォルダ仕分け v2
set a to choose folder with prompt "画像フォルダを選択"
tell application "Finder"
  set allF to every file in a
end tell

set b to choose folder with prompt "出力先フォルダ(縦)を選択"
set c to choose folder with prompt "出力先フォルダ(横)を選択"

tell application "Image Events" to launch
repeat with i in allF
  set j to i as alias
  
set bb to retDirectionOfImage(j) of me
  
if bb = false then
    tell application "Finder"
      move i to b
    end tell
  else
    tell application "Finder"
      move i to c
    end tell
    
  end if
end repeat

on retDirectionOfImage(aFile)
  tell application "Image Events"
    activate
    
set this_image to open aFile
    
set {aWidth, aHeight} to dimensions of this_image
    
close this_image –修正した
  end tell
  
if aHeight > aWidth then
    return false –縦
  else
    return true –横
  end if
end retDirectionOfImage

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

2014/01/14 指定のクリエータコードに該当するICC Profileをリストアップ

指定のクリエーターコードに該当するICC ProfileをリストアップするAppleScriptです。

{{名称1、ファイルパス1(HFS pathの文字列)}, {名称2、ファイルパス2(HFS pathの文字列)}…..}

という入れ子の(2Dの)リストで結果を返します。

名称が重複するICC Profileを除外するか許容するかをdupFlagで指定します。dupFlagがfalseだと重複を許容せず、trueだと許容します。

2014年、Mac OS Xも10.9になって、まだCreator Code(英数字4文字の、メーカーごとにユニークな値。英字小文字はAppleしか使えない)なんて仕様がOSの中に残っているとは驚きです(フォントまわりにはまだ残っていそうな、、、)。

スクリプト名:指定のクリエータコードに該当するICC Profileをリストアップ
set aList to getICCProfileDataByCreatorCode(“ADBE”, false) of me
–> {{”Adobe RGB (1998)”, “Macintosh HD:System:Library:ColorSync:Profiles:AdobeRGB1998.icc”}, {”AnimePalette”, “Macintosh HD:Library:Application Support:Adobe:Color:Profiles:AnimePalette.icc”}…….

–creatorで抽出したICC Profileのリストを取得する(名称、パス)
–  aCode: ICC ProfileのCreator Code(=”XXXX”)
–  dupFlag: trueだとICC Profileの名称重複を許容、falseだと許容しない
on getICCProfileDataByCreatorCode(aCode, dupFlag)
  tell application “Image Events”
    set aList to every profile whose creator is aCode
    
    
set bList to {}
    
set cList to {}
    
    
repeat with i in aList
      set j to contents of i
      
      
tell j
        
        
–get ICC name
        
try
          set a to name
        on error
          set a to “”
        end try
        
        
–get ICC file path
        
if a is not in cList then –名称が重複するICC Profileを排除する
          if dupFlag = false then
            set the end of cList to a
          end if
          
          
try
            set b to location as alias
            
set b to b as string
            
set the end of bList to {a, b}
          on error
            
          end try
          
        end if
        
      end tell
      
    end repeat
    
    
return bList
    
  end tell
end getICCProfileDataByCreatorCode

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

2013/01/20 システムにインストールされているICC Profileのうち、指定キーワードに該当する名前を持つものでバージョン番号が最新のものを返す v2

システムにインストールされているICC Profileのうち、指定キーワードに該当する名前を持つもので、バージョン番号が最新のものをピックアップするAppleScriptです。

…………最初のものから、50行ぐらい短くなっています。

ICC Profileは/Library/ColorSync/Profilesとか、~/Library/ColorSync/Profilesなど複数箇所にインストール可能で、Mac OS Xが標準で用意しているものと、Adobeの各アプリがてんでバラバラにインストールしてお互いに互換性のないものなどが無造作に入っています。

Mac OS X 10.6でColorSync Scriptingが廃止になったときに、ICC Profileの管理機能はImage Eventsに移管されました(少し前からそうだったか、、、)。このImage Eventsに対してICC Profileの所在を問い合わせると、複数のインストール先にインストールされた同一名称のプロファイルが取得できたりするので、ユニーク化処理を行って重複分の消し込みを行っています。

スクリプト名:システムにインストールされているICC Profileのうち、指定キーワードに該当する名前を持つものでバージョン番号が最新のものを返す v2
–システムにインストールされているICC Profileのうち、指定キーワードに該当する名前を持つものでバージョン番号が最新のものを返す

set nList to getAProfile_(“Piyomaru Piyopiyo”)
set b to retLatestVersionICCprofileNameFromList_delExt_(nList)
–> “Piyomaru Piyopiyo V5.0.icc”

–キーワードを含む名称を持つICC Profileを取得する
on getAProfile_(aKeyword)
  
  
set unique_profile_names to {}
  
  
tell application “Image Events”
    
    
set all_profile_names to name of every profile whose name contains aKeyword
    
    
repeat with i from 1 to (count all_profile_names)
      set cur_profile_name to item i of all_profile_names
      
      
if cur_profile_name is not in unique_profile_names then
        set end of unique_profile_names to cur_profile_name
      end if
      
    end repeat
    
  end tell
  
  
return unique_profile_names
  
end getAProfile_

–与えられたICC Profileの名称リストからもっともバージョンの新しい(大きい)数字を持つものを返す
on retLatestVersionICCprofileNameFromList_delExt_(a)
  
  
–取り出した数値部分だけをキーにして降順ソート(大きな数→小さな数)
  
considering numeric strings
    set resList to shellSortDecending(a)
  end considering
  
  
return item 1 of resList
  
end retLatestVersionICCprofileNameFromList_delExt_

–シェルソートでリストを昇順ソート(入れ子ではないリスト)
on shellSortAscending(a)
  set n to length of a
  
set cols to {1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1}
  
repeat with h in cols
    if (h (n - 1)) then
      repeat with i from h to (n - 1)
        set v to item (i + 1) of a
        
set j to i
        
repeat while (j h) and ((contents of item (j - h + 1) of a) > v)
          set (item (j + 1) of a) to (item (j - h + 1) of a)
          
set j to j - h
        end repeat
        
set item (j + 1) of a to v
      end repeat
    end if
  end repeat
  
return a
end shellSortAscending

–シェルソートでリストを降順ソート(入れ子ではないリスト)
on shellSortDecending(a)
  set n to length of a
  
set cols to {1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1}
  
repeat with h in cols
    if (h (n - 1)) then
      repeat with i from h to (n - 1)
        set v to item (i + 1) of a
        
set j to i
        
repeat while (j h) and ((contents of item (j - h + 1) of a) < v)
          set (item (j + 1) of a) to (item (j - h + 1) of a)
          
set j to j - h
        end repeat
        
set item (j + 1) of a to v
      end repeat
    end if
  end repeat
  
return a
end shellSortDecending

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

2010/10/02 アプリのアイコンをJPEG画像化してデスクトップに書き出すv23

Finder上で選択中のアプリケーション(アプリケーションファイル)のアイコンファイルをデスクトップにJPEGで書き出すAppleScriptです。

書き出せるのは、バンドル形式のアプリケーションのアイコンに限ります。本ScriptはScript Menuに登録して呼び出すことを前提に試作したものです。

このAppleScriptを作った当時は古いアプリケーション形式の、1ファイルから構成されるCarbonベースのPowerPC用アプリケーションもたくさん存在していたためにてこずらされましたが、最近はバンドル形式のものばかりになって、解析しやすくなりました。

ただ……アイコンファイルが変な場所に置かれているアプリケーションもたまにあるので、100%の保証はないのですが…………

スクリプト名:アプリのアイコンをJPEG画像化してデスクトップに書き出すv23
on run
  tell application “Finder”
    set a to selection
    
    
if a = {} then
      set aFile to choose file
      
set a to {aFile}
    end if
    
    
repeat with i in a
      set j to contents of i
      
set aClass to class of j
      
      
if aClass = application file then
        writeOutICNS(j as alias) of me
      else
        –do nothing
      end if
    end repeat
    
display dialog “デスクトップへのアイコンの書き出しを終了しました。” buttons {“OK”} default button 1 with icon note
  end tell
end run

–Script Menuから実行するのでドロップレット用のハンドラは不要だが……
on open (filelist)
  repeat with i in filelist
    set j to contents of i
    
writeOutICNS(j) of me
  end repeat
end open

–指定ファイルのアイコンをCFBundleIdentifierの名称でtmpにPNGで書き出す
on writeOutICNS(aFile)
  
  
–set aFile to choose file
  
  
set aPOSIXpath to POSIX path of aFile
  
set appBinPOSIXpath to aPOSIXpath & “Contents/MacOS/”
  
  
–Info.plistの内容を確認して実行ファイルの名称を取得する
  
set plistpath to aPOSIXpath & “Contents/Info.plist”
  
tell application “System Events”
    try
      set infoplistFile to contents of property list file plistpath
      
set anIconFileName to value of property list item “CFBundleIconFile” of infoplistFile
      
set anAppID to value of property list item “CFBundleIdentifier” of infoplistFile
    on error
      –バンドル形式ではなかったもよう
      
display dialog “ERROR”
      
return
    end try
  end tell
  
  
if anAppID = “” or anAppID = missing value then return
  
set anAppID to correctWrongChars(anAppID) of me
  
  
–アイコン名には拡張子を省略してもよいので、ない場合には補う
  
if anIconFileName does not end with “.icns” then
    set anIconFileName to anIconFileName & “.icns”
  end if
  
  
set ifonFileFullPath to aPOSIXpath & “Contents/Resources/” & anIconFileName
  
  
–Resourcesフォルダの直下にicnsファイルが存在しないパターンに備える
  
–各種言語のlprojフォルダの中にicnsファイルが存在しないかをチェック
  
–存在する場合には取得、なければエラー
  
  
try
    set aPathAlias to POSIX file ifonFileFullPath
    
set aPathAlias to aPathAlias as alias
  on error
    set aPathAlias to “”
  end try
  
  
  
try
    tell application “Finder”
      if not (exists file aPathAlias) then
        
        
–Resourcesフォルダの直下にアイコンのファイルが存在していない場合の処理
        
set aPOSIXalias to aFile as string
        
set aPOSIXalias to aPOSIXalias as Unicode text
        
set aOrigPath to aPOSIXalias & “Contents:Resources:”
        
        
–各種言語のlprojフォルダ名称一覧リスト
        
set lprojList to {“Japanese.lproj”, “English.lproj”, “da.lproj”, “Dutch.lproj”, “fi.lproj”, “French.lproj”, “German.lproj”, “Italian.lproj”, “ko.lproj”, “no.lproj”, “pt.lproj”, “Spanish.lproj”, “sv.lproj”, “zh_CN.lproj”, “zh_TW.lproj”}
        
        
set hitF to false
        
        
repeat with i in lprojList
          set j to contents of i
          
set tmpIconFullPath to aOrigPath & j & “:” & anIconFileName
          
tell application “Finder”
            if exists (file tmpIconFullPath) then
              set hitF to true
              
exit repeat
            end if
          end tell
        end repeat
        
        
if hitF = false then
          display dialog “Error in detecting Icon file in application bundle :” & return & aPOSIXpath buttons {“OK”} default button 1
          
return
        end if
        
set this_file to (tmpIconFullPath)
        
      else
        set this_file to (ifonFileFullPath)
      end if
    end tell
    
  end try
  
  
set sText to “cp “ & quoted form of this_file & ” ~/Desktop/tmp.icns”
  
do shell script sText
  
set desktopIcon to (path to desktop as string) & “tmp.icns”
  
  
try
    tell application “Image Events”
      launch
      
set the parent_folder to the path to desktop
      
set this_image to open (alias desktopIcon)
      
set new_name to anAppID & “.jpg”
      
set the new_image to save this_image as JPEG in file new_name of the parent_folder with icon
      
close this_image
    end tell
  on error error_message
    display dialog error_message
  end try
  
end writeOutICNS

on add_extension(this_file, new_extension)
  set this_info to the info for this_file
  
set this_name to the name of this_info
  
set this_extension to the name extension of this_info
  
if this_extension is missing value then
    set the default_name to this_name
  else
    set the default_name to text 1 thru -((length of this_extension) + 2) of this_name
  end if
  
return (the default_name & “.” & the new_extension)
end add_extension

–ファイル名に使用できない文字を置換
on correctWrongChars(aText)
  set a to repChar(aText, “/”, “_”) of me
  
set a to repChar(a, “:”, “_”) of me
  
set a to repChar(a, “\”, “_”) of me
  
return a
end correctWrongChars

–文字置換
on repChar(origText, targChar, repChar)
  set origText to origText as string
  
set targChar to targChar as string
  
set repChar to repChar as string
  
  
set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to targChar
  
set tmpList to text items of origText
  
set AppleScript’s text item delimiters to repChar
  
set retText to tmpList as string
  
set AppleScript’s text item delimiters to curDelim
  
return retText
end repChar

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

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

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

2010/04/27 ImageEventsで横幅400ピクセルに

ImageEventsに命令して、指定画像ファイルの横幅を指定のピクセル数(本サンプルでは400)、縦横比を維持したまま高さを成り行きでリサイズするAppleScriptです。

スクリプト名:ImageEventsで横幅400ピクセルに
set this_file to choose file
try
  tell application "Image Events"
    launch
    
– open the image file
    
set this_image to open this_file
    
– perform action
    
scale this_image to size 400
    
– save the changes
    
save this_image with icon
    
– purge the open image data
    
close this_image
  end tell
on error error_message
  display dialog error_message
end try

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

2010/04/27 ImageEventsでTIFF保存

ImageEventsに命令して、指定画像ファイルをTIFF形式で保存するAppleScriptです。

最近では画像ファイルの一括形式変換+ファイル保存といえば、Automatorなどを使ったほうが手っ取り早い感じですが、細かい作業が必要になってくると(条件分岐とか、ファイル名の操作とか)AppleScriptを書いたほうが便利です。

そうした場合に、こうした基礎的なScriptを手元にストックしてあると便利です。

スクリプト名:ImageEventsでTIFF保存
set this_file to choose file
set the target_path to (choose file name default name "newimage.tif") as string
try
  tell application "Image Events"
    launch
    
– open the image file
    
set this_image to open this_file
    
– save in new file
    
save this_image as TIFF in file target_path with icon
    
– purge the open image data
    
close this_image
  end tell
on error error_message
  display dialog error_message
end try

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

2010/04/27 ImageEventsで切り抜き

ImageEventsに命令して、指定画像ファイルから指定ピクセル分を切り抜くAppleScriptです。

r0010131_before.JPG
▲処理前(全体を縮小して掲載)

r0010131_after.JPG
▲処理後(原寸)

スクリプト名:ImageEventsで切り抜き
set this_file to choose file
try
  tell application “Image Events”
    launch
    
– open the image file
    
set this_image to open this_file
    
– perform action
    
crop this_image to dimensions {400, 400}
    
– save the changes
    
save this_image with icon
    
– purge the open image data
    
close this_image
  end tell
on error error_message
  display dialog error_message
end try

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

2010/04/27 ImageEventsで75%にリサイズ

ImageEventsに命令して、指定画像ファイルを任意の倍率に縮小(このサンプルでは75%)するAppleScriptです。

スクリプト名:ImageEventsで75%にリサイズ
set this_file to choose file
try
  tell application "Image Events"
    launch
    
– open the image file
    
set this_image to open this_file
    
– perform action
    
scale this_image by factor 0.75
    
– save the changes
    
save this_image with icon
    
– purge the open image data
    
close this_image
  end tell
on error error_message
  display dialog error_message
end try

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

2010/04/27 ImageEventsで画像反転(左右反転)

ImageEventsに命令して、指定画像ファイルを左右反転させるAppleScriptです。

スクリプト名:ImageEventsで画像反転
set this_file to choose file
try
  tell application "Image Events"
    launch
    
– open the image file
    
set this_image to open this_file
    
– perform action
    
flip this_image with horizontal
    
– save the changes
    
save this_image with icon
    
– purge the open image data
    
close this_image
  end tell
on error error_message
  display dialog error_message
end try

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

2010/04/27 ImageEventsで画像の縦横サイズを取得する

ImageEventsに命令して、指定画像ファイルの縦横のサイズを取得するAppleScriptです。

スクリプト名:ImageEventsで画像の縦横サイズを取得する
set a to choose file
set b to retImageSize(a) of me –(幅、高さでペアリスト)

–画像の幅と高さをリストで返す
on retImageSize(anAlias)
  tell application "Image Events"
    launch
    
set thisImage to open anAlias
    
set b to dimensions of thisImage
    
close thisImage
  end tell
  
return b
end retImageSize

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

2010/04/27 ImageEventsで画像回転(反時計回りに90度)

ImageEventsに命令して、指定画像ファイルを反時計回りに90度回転させるAppleScriptです。

スクリプト名:ImageEventsで画像回転(反時計回りに90度)
set this_file to choose file
try
  tell application “Image Events”
    launch
    
– open the image file
    
set this_image to open this_file
    
– perform action
    
rotate this_image to angle 270
    
– save the changes
    
save this_image with icon
    
– purge the open image data
    
close this_image
  end tell
on error error_message
  display dialog error_message
end try

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

2010/04/26 ImageEventsで画像回転(時計回りに90度)

ImageEventsに命令して、指定画像ファイルを時計回りに90度回転させるAppleScriptです。

OSに標準で入っていたように思うのですが、最近のMac OS X 10.6では見かけなかったので掲載。

スクリプト名:ImageEventsで画像回転(時計回りに90度)
set this_file to choose file
try
  tell application "Image Events"
    launch
    
– open the image file
    
set this_image to open this_file
    
– perform action
    
rotate this_image to angle 90
    
– save the changes
    
save this_image with icon
    
– purge the open image data
    
close this_image
  end tell
on error error_message
  display dialog error_message
end try

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

2009/03/31 破損画像チェック

画像の破損チェックを行うサブルーチンです。以前に、JPEG画像についてはJEPGマーカーの有無により破損確認を行うサブルーチンを掲載していましたが、JEPGマーカーの確認だけでは不十分で、オープンできるのに不完全な画像(QuickTimeでインポートしても、ムービー書き出し時にエラーになる)といったものにも遭遇していました。

brokenimg.jpg

▲オープンできるが、ムービー書き出し時にエラーになる画像の実例

AppleScript Users MLの過去ログを整理していたら、まったく関係ないところで出てきた記述がそのまま画像ファイルの破損チェックに使えることを再発見。

ただ、Image Eventsでオープンしてサイズを取得するだけで、対象が破損している場合にはエラーになります。しかも、手持ちのさまざまな壊れ方をしている「破損画像コレクション」でチェックを行ったところ、オープンできないものは当然として、中途半端にオープンできるようなものまで検出可能でした。

本サブルーチンでは、PICT、Photoshop、BMP、QuickTime Image、GIF、JPEG、MacPaint、JPEG2、SGI、TGA、PDF、PNG、TIFF……などの、よく見る形式やほとんど見たことのない形式の画像の破損検出に対応しています。実際、JPEGとPhotoshop形式については確認を行いました。

Image Eventsではなく、コマンドラインのsipsコマンドで情報取得時にエラーを起こせないか試してみたのですが、sipsでは問題なく画像サイズを取得できてしまっていました。

スクリプト名:破損画像チェック
set theFile to choose file
set aRes to breakImageCheck(theFile) of me
> true / false

破損画像チェック
(通常時:true、破損時:false が返ってくる)
対象形式:PICT/Photoshop/BMP/QuickTime Image/GIF/JPEG/MacPaint/JPEG2/SGI/PSD/TGA/Text/PDF/PNG/TIFF
on breakImageCheck(theFile)
  try
    tell application Image Events
      set {theWidth, theHeight} to dimensions of image theFile
    end tell
    
return true normal image
  on error
    return false broken image
  end try
end breakImageCheck

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

2009/03/17 アドレスブックで表示中のPersonに画像をTIFF変換して読み込み

選択した画像をTIFFに変換してファイルに書き込んだのちに変数に読み込み、アドレスブックで表示中のPersonの画像として設定するAppleScriptです。

スクリプト名:アドレスブックで表示中のPersonに画像をTIFF変換して読み込み
set aFile to choose file

set aType to retImageType(aFile) of me
if aType = "TIFF" then
  set sRes to aFile
else if aType is in {"JPEG", " PSD", "PNG", "PDF", "GIF"} then
  set sRes to convertToTIFF(aFile) of me
end if

エラー時の対応
if sRes = false then
  display dialog "Error in saving image"
  
return
end if

set aaa to path of sRes
set idata to read file aaa as TIFF picture

tell application "Address Book"
  set aPerson to selection
  
set aSel to first item of aPerson
  
if (exists image of aSel) then
    beep
  else
    set image of aSel to idata
  end if
  
save addressbook
end tell

指定画像を128×128のTIFFに変換する
on convertToTIFF(aFile)
  ファイルの親フォルダへのパス
  
tell application "Finder"
    set aFol to (folder of aFile) as alias
  end tell
  
set aFol to aFol as Unicode text
  
  
ファイル名から拡張子を外した文字列
  
tell application "Finder"
    set aName to name of aFile
  end tell
  
set aName to retFileNameWithoutExt(aName) of me
  
  
set aFullPath to aFol & aName & ".tiff"
  
  
tell application "Image Events"
    launch
    
activate
    
set this_image to open aFile
    
set {widthNum, heightNum} to dimensions of this_image
    
scale this_image to size 128
    
try
      set sRes to (save this_image as TIFF in file aFullPath)
    on error
      set sRes to false
    end try
  end tell
  
  
return sRes
end convertToTIFF

ファイル名から拡張子を外す
on retFileNameWithoutExt(fileNameStr)
  set fLen to length of fileNameStr
  
set revText to (reverse of (characters of fileNameStr)) as string 逆順テキストを作成
  
set anOffset to offset of "." in revText
  
set fRes to text 1 thru (fLen - anOffset) of fileNameStr
  
return fRes
end retFileNameWithoutExt

on retImageType(aFile)
  tell application "Image Events"
    launch
    
activate
    
set this_image to open aFile
    
set fRes to file type of this_image
    
close aFile
  end tell
  
return fRes as string
end retImageType

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

2008/12/27 モニターの数を数えるv1

USのAppleScript StudioのMLで、「接続されているモニタ(ディスプレイ)の数を調べる方法について教えてほしい」という投稿があったので、5パターンぐらい提案したのですが、その中に入っていない例がよその人から提示され、AppleScript Studio環境で使うのでなければ割といい方法だったので、サブルーチンにまとめておきました。
(more…)

2008/05/04 画像の縦長横長を見てフォルダ仕分け

1つのフォルダに入っている画像を、画像サイズを取得して縦長か横長かを判定して、それぞれのフォルダに仕分けします。

スクリプト名:画像の縦長横長を見てフォルダ仕分け
set a to choose folder with prompt画像フォルダを選択
tell applicationFinder
  set allF to every file in a
end tell

set b to choose folder with prompt出力先フォルダ(縦)を選択
set c to choose folder with prompt出力先フォルダ(横)を選択

tell applicationImage Eventsto launch
repeat with i in allF
  set j to i as alias
  
set bb to retDirectionOfImage(j) of me
  
if bb = false then
    tell applicationFinder
      move i to b
    end tell
  else
    tell applicationFinder
      move i to c
    end tell
    
  end if
end repeat

on retDirectionOfImage(aFile)
  tell applicationImage Events
    activate
    
set this_image to open aFile
    
set {aWidth, aHeight} to dimensions of this_image
    
close aFile
  end tell
  
if aHeight > aWidth then
    return false
  else
    return true
  end if
end retDirectionOfImage

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