[AppleSript] 画像ファイルをまとめて編集する(フォーマット変換,リサイズ,回転)

ai
こんばんは「ai」です。

コピペしてすぐに使えます。

ちょっとした画像の編集なら、特別なソフトを使用しなくても可能です。

オリジナル画像は加工されずに残り、編集された画像を保存先に指定したディレクトリに保存します。

職場や学校など自由にアプリをインストールできない環境でも手軽に加工できます。

画像ファイルをまとめて編集

global tmpFolder
global outFolder

-- リスト形式のダイアログを表示して処理を選択する
set wList to {"フォーマット変換", "リサイズ", "回転"}
choose from list wList default items "フォーマット変換" as text
set wSelect to result as text
if wSelect = false then
	return
end if
if wSelect = "フォーマット変換" then
	my FileFormat()
else if wSelect = "リサイズ" then
	my ReSize()
else if wSelect = "回転" then
	my FileRotation()
else
	return
end if

-- ファイルフォーマット変換
on FileFormat()
	my FolderOpen()
	-- リスト形式のダイアログを表示して処理を選択する
	set myList to {"jpeg", "tiff", "png", "gif", "jp2", "bmp", "psd", "tga"}
	choose from list myList default items "jpeg" as text
	set mySelect to result as text
	if mySelect = false then
		return
	end if
	if mySelect = "jpeg" then
		set FileEx to ".jpg"
	else if mySelect = "tiff" then
		set FileEx to ".tif"
	else if mySelect = "gif" then
		set FileEx to ".gif"
	else if mySelect = "jp2" then
		set FileEx to ".jp2"
	else if mySelect = "pict" then
		set FileEx to ".pict"
	else if mySelect = "bmp" then
		set FileEx to ".bmp"
	else if mySelect = "qtif" then
		set FileEx to ".qtif"
	else if mySelect = "psd" then
		set FileEx to ".psd"
	else if mySelect = "sgi" then
		set FileEx to ".sgi"
	else if mySelect = "tga" then
		set FileEx to ".tga"
	else
		return
	end if
	try
		-- フォルダ内のファイルリストを作成
		set fList to do shell script "find " & quoted form of tmpFolder & " -maxdepth 1 -mindepth 1 |grep -v '\\/\\.'"
	end try
	set FileList to CreateList(fList) of me
	-- theListのitemの数だけ繰り返す
	repeat with i in FileList
		try
			-- i には(item n of FileList)が格納される
			set FileExtension to GetFileExtension(i) of me
			set FileName to do shell script "echo " & i & "|sed 's/" & FileExtension & "$//'| awk -F/ '{print $NF}'"
			do shell script "sips -s format " & mySelect & " " & quoted form of i & " --out '" & outFolder & "/" & FileName & FileEx & "'"
		end try
	end repeat
end FileFormat

-- リサイズ
on ReSize()
	my FolderOpen()
	-- 複数ボタンのメッセージダイアログを表示
	display dialog "pixel数を入力とリサイズの基準を選択" default answer "" buttons {"キャンセル", "長辺", "短辺"} default button 3
	set tmpReturned to result
	set SelectBtn to button returned of tmpReturned
	set Px to text returned of tmpReturned
	if SelectBtn = "キャンセル" then
		return
	end if
	try
		-- フォルダ内のファイルリストを作成
		set fList to do shell script "find " & quoted form of tmpFolder & " -maxdepth 1 -mindepth 1 |grep -v '\\/\\.'"
	end try
	set FileList to CreateList(fList) of me
	-- theListのitemの数だけ繰り返す
	-- i には(item n of FileList)が格納される
	repeat with i in FileList
		set ImageResult to retDirectionOfImage(i) of me
		if SelectBtn = "長辺" then
			if ImageResult = false then
				set Command to "resampleHeight"
			else
				set Command to "resampleWidth"
			end if
		else if SelectBtn = "短辺" then
			if ImageResult = false then
				set Command to "resampleWidth"
			else
				set Command to "resampleHeight"
			end if
		end if
		try
			set FileName to do shell script "echo " & i & "| awk -F/ '{print $NF}'"
			do shell script "sips --" & Command & " " & Px & " " & quoted form of i & " --out '" & outFolder & "/" & FileName & "'"
		end try
	end repeat
end ReSize

on FileRotation()
	my FolderOpen()
	-- 複数ボタンのメッセージダイアログを表示
	display dialog "回転角度を入力(時計回り)" default answer ""
	set tmpReturned to result
	set Angle to text returned of tmpReturned
	try
		-- フォルダ内のファイルリストを作成
		set fList to do shell script "find " & quoted form of tmpFolder & " -maxdepth 1 -mindepth 1 |grep -v '\\/\\.'"
	end try
	set FileList to CreateList(fList) of me
	-- theListのitemの数だけ繰り返す
	repeat with i in FileList
		try
			-- i には(item n of FileList)が格納される
			set FileName to do shell script "echo " & i & "| awk -F/ '{print $NF}'"
			do shell script "sips -r " & Angle & " " & quoted form of i & " --out '" & outFolder & "/" & FileName & "'"
		end try
	end repeat
end FileRotation

-- 元フォルダ/保存先フォルダ指定
on FolderOpen()
	-- ファイル選択ダイアログを開く
	tell application "Finder"
		set tmpFolder to choose folder with prompt "元画像のフォルダを選択"
		set outFolder to choose folder with prompt "保存先フォルダを選択"
		-- パスのコロンをスラッシュに変換	
		set tmpFolder to tmpFolder as text
		set tmpFolder to ((alias tmpFolder)'s POSIX path)
		set outFolder to outFolder as text
		set outFolder to ((alias outFolder)'s POSIX path)
	end tell
	activate me
	set tmpFolder to do shell script "echo " & quoted form of tmpFolder & "|sed 's:\\/$::'"
	set outFolder to do shell script "echo " & quoted form of outFolder & "|sed 's:\\/$::'"
end FolderOpen

-- テキストから任意の文字を区切りとしてリストを作成
on CreateList(tmpList)
	if tmpList ≠ "" then
		set curDelim to AppleScript's text item delimiters
		-- 以下の文末にあるreturnを変更すると他の文字を区切り文字に変更可能
		set AppleScript's text item delimiters to return
		set FileList to text items of tmpList
		set AppleScript's text item delimiters to curDelim
		return FileList
	end if
end CreateList

-- ファイルの拡張子を切り出す
on GetFileExtension(FilePath)
	set FileName to do shell script "echo " & quoted form of FilePath & "|awk -F'/' '{print($NF)}'"
	try
		set dSearch to do shell script "echo " & quoted form of FileName & "|grep '\\.'"
		set FileExtension to "." & (do shell script "echo " & quoted form of FileName & "|awk -F'.' '{print($NF)}'")
	on error
		set FileExtension to ""
	end try
	return FileExtension
end GetFileExtension

-- 画像の縦横判定
on retDirectionOfImage(aFile)
	set aFile to POSIX path of 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

説明

基本的には、sipsコマンドのオプションを選択肢にして指定して貰うようにしているだけです。

元画像が保存されているディレクトリと保存先のディレクトリを選択していきます。

リサイズに関してはsipsだと縦横混在の画像群に使うとアスペクト比が崩れた画像ができてしまうので、短辺か長辺かどちらを基準としてpixel数を変更するかを選べるようにしました。

お気づきの方もいるかも知れませんが、他のページで紹介しているソースのパーツをブロックのように組み合わせて作成しています。

その為、変数名が被ってしまうというトラブルが起きたので直そうかと思ったのですが、グローバル変数にして誤魔化しました。

編集された画像さえ得られれば良いんです。

この記事を書いた人

ai

散歩とひなたぼっこが好きです。
自然の美しさや季節の移り変わりを感じながら、のんびりとした時間を過ごすのが日々の楽しみになっています。

AppleSript