Hi,
I’m really new to Applescript and at the moment only want to use it to do one really simple thing. I have a large number of image files (jpgs) in a folder. I would like to use Applescript to generate a list of the image filenames and relevant dimensions, to look something like this:
image1,200x400
image2,350x276
image3,200x345
Can anyone help me please? I’ve had a go myself, but can’t seem to get very far!
Thanks…
MARTIN
Of course! This is MacScripter
Here is the short script (droplet) I just wrote while having dinner. I hope it gets you started.
property mytitle : "Sizomago"
-- I am called when the user starts the script with a doubleclick
on run
tell me
activate
display dialog "Please drop image files onto my icon in order to crate a list of their dimensions." buttons {"OK"} default button 1 with icon note with title mytitle
end tell
end run
-- I am called when the user drops finder items onto the script's icon
on open finderitems
try
set finderfiles to {}
-- scanning the dropped finder items for files
repeat with finderitem in finderitems
set finderiteminfo to (info for finderitem)
if not (folder of finderiteminfo) then
set finderfiles to finderfiles & finderitem
end if
end repeat
-- no files...
if finderfiles is {} then
set errmsg to "You did not drop any files onto the script."
my dsperrmsg(errmsg, "--")
return
end if
-- creating the list of image dimensions using the built-in sips tool
set imgsizereport to ""
repeat with finderfile in finderfiles
set filename to name of (info for finderfile)
set qtdfilepath to quoted form of (POSIX path of (finderfile as text))
try
set command to "sips -g pixelHeight -g pixelWidth " & qtdfilepath
set output to paragraphs of (do shell script command)
set pixelheight to item 2 of (words of item 2 of output)
set pixelwidth to item 2 of (words of item 3 of output)
set imgsizeentry to filename & "," & pixelheight & "x" & pixelwidth & return
set imgsizereport to imgsizereport & imgsizeentry
end try
end repeat
-- everything just went wrong
if imgsizereport is "" then
set errmsg to "Could not detect any image sizes."
my dsperrmsg(errmsg, "--")
return
else
-- no more calls, we have a winner!
tell application "TextEdit"
activate
make new document
set text of document 1 to imgsizereport
end tell
end if
on error errmsg number errnum
-- ignoring 'User canceled'-error
if errnum is not equal to -128 then
my dsperrmsg(errmsg, errnum)
end if
end try
end open
-- Well, I am displaying error messages (hopefully only few...)
on dsperrmsg(errmsg, errnum)
tell me
activate
display dialog "Sorry, an error occured:" & return & return & errmsg & return & "(" & errnum & ")" buttons {"OK"} default button 1 with icon stop with title mytitle
end tell
end dsperrmsg
Thanks so much - just seen your reply. However, I don’t understand the dropping images onto the icon bit. Is there anyway that I can just point this script at a particular folder with around 5,000 images, and let it generate the list of filenames and x/y dimensions?
I’m HUGELY grateful for your help…!
MARTIN
I have modified the run handler, now you are asked to choose a folder when you start the script with a doubleclick:
property mytitle : "Sizomago"
-- I am called when the user starts the script with a doubleclick
on run
set imgfolder to (choose folder with prompt "Please choose a folder containing image files:" without multiple selections allowed, invisibles and showing package contents)
tell application "Finder"
set finderitems to (every file in imgfolder) as alias list
end tell
open finderitems
end run
-- I am called when the user drops finder items onto the script's icon
on open finderitems
try
set finderfiles to {}
-- scanning the dropped finder items for files
repeat with finderitem in finderitems
set finderiteminfo to (info for finderitem)
if not (folder of finderiteminfo) then
set finderfiles to finderfiles & finderitem
end if
end repeat
-- no files...
if finderfiles is {} then
set errmsg to "You did not drop any files onto the script."
my dsperrmsg(errmsg, "--")
return
end if
-- creating the list of image dimensions using the built-in sips tool
set imgsizereport to ""
repeat with finderfile in finderfiles
set filename to name of (info for finderfile)
set qtdfilepath to quoted form of (POSIX path of (finderfile as text))
try
set command to "sips -g pixelHeight -g pixelWidth " & qtdfilepath
set output to paragraphs of (do shell script command)
set pixelheight to item 2 of (words of item 2 of output)
set pixelwidth to item 2 of (words of item 3 of output)
set imgsizeentry to filename & "," & pixelheight & "x" & pixelwidth & return
set imgsizereport to imgsizereport & imgsizeentry
end try
end repeat
-- everything just went wrong
if imgsizereport is "" then
set errmsg to "Could not detect any image sizes."
my dsperrmsg(errmsg, "--")
return
else
-- no more calls, we have a winner!
tell application "TextEdit"
activate
make new document
set text of document 1 to imgsizereport
end tell
end if
on error errmsg number errnum
-- ignoring 'User canceled'-error
if errnum is not equal to -128 then
my dsperrmsg(errmsg, errnum)
end if
end try
end open
-- Well, I am displaying error messages (hopefully only few...)
on dsperrmsg(errmsg, errnum)
tell me
activate
display dialog "Sorry, an error occured:" & return & return & errmsg & return & "(" & errnum & ")" buttons {"OK"} default button 1 with icon stop with title mytitle
end tell
end dsperrmsg
If you need the script to just process one specific folder, which always stays at the same location, you can also modify the run handler as follows:
-- I am called when the user starts the script with a doubleclick
on run
-- hard coded path...
set imgfolderpath to "Macintosh HD:Users:martin:Desktop:"
tell application "Finder"
set finderitems to (every file in (imgfolderpath as alias)) as alias list
end tell
open finderitems
end run
This is just amazing!!! Thank you so much. I’ve wanted to be able to do something like this for years. You have been so incredibly helpful. I will be using this all the time now - it’s going to save me a lot of time.
Can’t thank you enough…