I am currently using an automator flow that copies finder items, changes them to jpeg, reveals them, and then runs an applescript that presents a dialog for batch resizing by image width. Every now and then, the script misses a couple of files or I prematurely move them from the folder before they have finished. I added a couple of pieces to the automation to
- Set value of variable: output
- Ask for confirmation: output
This doesn't really output anything useful, but it does notify me when the script has finished running. Is there some way to output whether or not there were any issues with the script or is this way too crazy of a question to be asking on stackexchange? In advance… No, I'm not very familiar with AppleScript.
Here's the script – I appreciate any & all advice/help 🙂
tell application "System Events"
activate
set theWidth to display dialog "Enter the width" default answer "2000"
set theWidth to the text returned of theWidth as real
end tell
global theWidth
tell application "Finder"
set some_items to selection as list
repeat with aItem in some_items
set contents of aItem to aItem as alias
end repeat
end tell
repeat with i in some_items
try
rescale_and_save(i)
end try
end repeat
to rescale_and_save(this_item)
tell application "Image Events"
launch
set the target_width to theWidth
-- open the image file
set this_image to open this_item
set typ to this_image's file type
copy dimensions of this_image to {current_width, current_height}
if current_width is greater than target_width then
if current_width is greater than current_height then
scale this_image to size target_width
else
-- figure out new height
-- y2 = (y1 * x2) / x1
set the new_height to (current_height * target_width) / current_width
scale this_image to size new_height
end if
end if
tell application "Finder"
set file_name to name of this_item
set file_location to (container of this_item as string)
set new_item to (file_location & file_name)
save this_image in new_item as typ
end tell
end tell
end rescale_and_save
Best Answer
Give this a try:
Notes:
For looping through the files, it is simpler to make
some_items
a list of aliasesWhen scaling with
size
rather thanfactor
,new_height
should be integerSave within
if…then
block, otherwise every selected file will be re-saved, even when not scaledUse Image Events to save the files
If your folder is a subfolder of Pictures, you can enable 'Dimensions' in list view, which displays something like '2097 Ă— 3014', letting you see which images will be scaled. It doesn't update rapidly so it won't typically display the changed dimension, instead, it displays '--', which at least has the virtue of identifying which files have been changed.
Progress bar
Track scaled images and raise a notification when done, as well as create a text file log on desktop
Optional: Have a dry run script — tests each image's dimensions and reports back (e.g. count of images to be scaled, filenames of images to be scaled). You could even have it change the selection to only those files in the Finder when complete. Then when you run the final script, it will be clear which files will change.
FWIW, I tried using
factor
to scale but I found that after working for a while, it became erratic, and would often lock up the script (and overheat my mac, and require me to manually quit sips). I grew bored of that and usedsize
(but with forcingnew_height
to be an integer). After that change, it became more reliable. You may find the tracking unnecessary.