2006-04-15

실습 - 이미지 크기 변경

AppleScript 사전을 제공하는 프로그램 중에 Image Events라는 것이 있습니다. MacOS X에 기본으로 제공되는 것으로, 이미지의 크기, 방향 등을 조절할 수 있고 일부분을 오려낼 수도 있습니다. '미리보기(Preview)'에서 제공하는 이미지 편집 기능과 거의 유사하다고 볼 수 있으며, 이런 기능을 AppleScript로 제어할 수 있습니다.

여러 장의 사진의 크기를 한꺼번에 조절하는 스크립트를 만들어보겠습니다. Photoshop의 Action으로도 가능할 것 같고, 이런 기능을 제공하는 이미지 처리 전용 프로그램들이 많이 나와있습니다만, AppleScript를 공부하는 차원에서 한 번 만들어보았습니다.

원래 의도는 droplet으로 만들고, 크기와 기준 방향을 파일 이름을 바꿈으로써 결정할 수 있게 하려고 했습니다. 데스크탑에 위치시키고 이미지들을 drag & drop함으로써 일괄적으로 변경할 수 있으며, 환경설정 파일을 따로 만들지 않고 프로그램 이름을 'w400', 'h300', 'r50' 등으로 바꾸는 것으로 환경설정을 대신하려고 했습니다. 그런데 어떤 이유에서인지 제 실행환경에서는 정상적으로 작동하질 않더군요. 이 문서 마지막에 droplet으로 만드는 방법을 다시 설명하겠습니다. 어쨌든 droplet이 아닌 응용프로그램으로 만드는 스크립트를 소개합니다. 만약 'theImage가 설정되지 않았다'는 내용의 오류가 발생한다면 스크립트 편집기로 열어서, 하단의 3개의 버튼 중 '이벤트 로그'를 눌러준 후에 실행해보십시오.

set the theFiles to choose file with multiple selections allowed 
-- 여러 개의 파일을 선택할 수 있는 옵션을 주었습니다.
set theMethod to "w"
-- 기준 방향입니다. 가로 기준이면 w, 세로 기준이면 h, 비율이라면 r입니다.
set theValue to 400
-- 변경할 수치입니다. w와 h의 경우 단위는 픽셀이며, r의 경우에는 %입니다.
set theDestination to ((path to desktop folder as string) & "iPotato")
-- 변경된 이미지 파일이 저장될 장소입니다. 아직까지는 실제 존재하는 경로가 아닙니다.

tell application "Finder"
-- Finder를 이용해서 저장 경로를 확인합니다.
if theDestination exists then
-- 상기 경로가 존재한다면 그냥 넘어갑니다.
else
-- 존재하지 않는다면, 이를테면 이 스크립트를 처음으로 실행한다면
make new folder with properties {name:"iPotato", path:path to desktop folder}
-- 폴더를 만듭니다. 파인더에 대해서 설명하는 문서를 따로 만들 생각입니다.
end if
end tell

repeat with theFile in theFiles
-- 위에서 선택한 파일들은 list로 넘어옵니다. theFile에 하나씩 할당하면서 반복처리합니다.
tell application "Image Events"
set theImage to open theFile
-- 파일을 image 형태로 바꿉니다.
set theFileType to the file type of theImage
-- 이미지 파일이라면 jpeg, png, gif 등의 파일 타입을 갖고 있습니다.
if theFileType is not "" then
-- 파일 타입이 없다면 이미지 파일이 아닌 것으로 간주합니다.
set theWidth to the item 1 of (the dimensions of theImage as list) as integer
-- 가로 크기를 구하고
set theHeight to the item 2 of (the dimensions of theImage as list) as integer
-- 세로 크기를 구합니다.
if theMethod is "w" then
set newImage to scale theImage to size theValue
-- 가로를 기준으로 변경합니다.
else if theMethod is "h" then
set newImage to scale theImage to size (((theWidth * theValue) / theHeight) as integer)
-- 세로를 기준으로 변경합니다.
else if theMethod is "r" then
set newImage to scale theImage by factor (theValue / 100)
-- 비율로 변경합니다.
end if
save newImage in theDestination -- 저장합니다.
end if
end tell
end repeat


droplet으로 만드는 스크립트는 다음과 같습니다.
on open theFiles
set myName to name of (info for (path to me))
-- 프로그램의 이름을 불러옵니다. 'w400.app', 'r70.app' 등의 형태로 불러오게 됩니다.
set theMethod to first character of myName
-- 첫번째 글자가 변경 기준입니다.
set theValue to (((characters 2 thru (((count of characters of myName) as integer) - 4)) of myName) as string) as integer
-- 두번째 글자부터 마지막 4글자(.app)를 제외한 나머지를 불러옵니다. 그냥 불러오면 {"4", "0", "0"}과 같이 list로 넘어오기 때문에 글자로 합쳐주기 위해 as string을 붙입니다. 그러면 "400"이 되고, 다시 숫자로 바꾸기 위해 as integer를 붙여주면 400이 됩니다.
set theDestination to ((path to desktop folder as string) & "iPotato")
-- 이후에는 위의 응용프로그램용 스크립트와 똑같습니다.

tell application "Finder"
if theDestination exists then
else
make new folder with properties {name:"iPotato", path:path to desktop folder}
end if
end tell

repeat with theFile in theFiles
tell application "Image Events"
set theImage to open theFile
set theFileType to the file type of theImage
if theFileType is not "" then
set theWidth to the item 1 of (the dimensions of theImage as list)
set theHeight to the item 2 of (the dimensions of theImage as list)
if theMethod is "w" then
set newImage to scale theImage to size theValue
else if theMethod is "h" then
set newImage to scale theImage to size (((theWidth * theValue) / theHeight) as integer)
else if theMethod is "r" then
set newImage to scale theImage by factor (theValue / 100)
end if
save newImage in theDestination
end if
end tell
end repeat
end open
on open으로 시작하고, 자기 이름을 불러들여 변경 기준과 수치를 읽어들이는 부분이 있습니다.
droplet으로 잘 작동하는 비결을 알고계신 분은 답글이나 메일로 알려주시기 바랍니다.

0 Comments:

댓글 쓰기

<< Home