We may have totally different opinions about what “correct” is with respect cropping of pictures.
The reason for this, is to retain as much as possible of pictures, while getting them cropped - or padded into “letter-box” format.
The way I chosen to do it, is to keep as much as possible of the original images, without scaling, I leave that as the next step. (The cropping and padding command of Image events, appears to be the same, but you can’t specify a padding colour for the cropping. )
Those scripts alters the original image, please play with copies of your images.
Idealistic cropping algorithm, as it tries to keep as much as possible of the original image, while respecting the aspect ratio.
-- Copyright © 2015 McUsr, you are free to use, and share per email, but not to publish on a webpage or in a book.
-- You are free to derive the computations, but you are not free to publish them as your own work.
-- No guarrantees about anything what so ever. http://macscripter.net/viewtopic.php?pid=179196#p179196
set W_prop to 9
set H_prop to 16
-- Test of Cropping to proportions
-- The idea is that the cropped image, should keep as much as the original.
-- It should be inscribed, rather than padded when circumstances are so.
-- ( the aspect ratio, should be kept.)
set this_file to (choose file) as text
try
tell application "Image Events"
-- start the Image Events application
launch
-- open the image file
set this_image to open this_file
-- get dimensions of the image
copy dimensions of this_image to {W, H}
-- calculate crop dimensions
if (W_prop ≥ H_prop) and (W ≥ H) then
-- tested with the proportion 16x9, and sizes 500x300,500x270,500x800
set new_H to ((W * H_prop) / W_prop)
--
if H ≥ new_H then
-- we should crop H
set crop_dimensions to {W, new_H} -- A 500x300 -> 500x281,25
else
-- the height is too small, so we'll crop the width - and height
set new_W to (H * W_prop) / H_prop
set crop_dimensions to {new_W, H} -- B 500x270 -> 480x270
end if
else if (W_prop ≥ H_prop) and (H > W) then
-- We should keep the width we have!
set new_H to ((W * H_prop) / W_prop)
set crop_dimensions to {W, new_H} -- C 500x800 -> 500x281,25
-- --------------------------------------------------
else if (H_prop ≥ W_prop) and (H ≥ W) then
-- tested with the proportion 9x16, and sizes 300x500,270x500,800x500
set new_W to ((H * W_prop) / H_prop)
if W ≥ new_W then
-- width is larger than biggest length
-- we crop it!
set crop_dimensions to {new_W, H} -- D 300x500 -> 281,25x300
else
-- we keep the width, and crop the height.
set new_H to (W * H_prop) / W_prop
set crop_dimensions to {W, new_H} -- E 270x500 -> 270X480
end if
else -- (H_prop ≥ W_prop) and (W > H)
-- We'll keep the height we have.
set the new_W to (H * W_prop) / H_prop
set crop_dimensions to {new_W, H} -- F 800x500 -> 281,25x500
end if
-- perform action
crop this_image to dimensions crop_dimensions
-- 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
Idealistic padding algorithm, in that it tries to pad as little as possible of the image.
-- Copyright © 2015 McUsr, you are free to use, and share per email, but not to publish on a webpage or in a book.
-- You are free to derive the computations, but you are not free to publish them as your own work.
-- No guarrantees about anything what so ever. http://macscripter.net/viewtopic.php?pid=179196#p179196
set W_prop to 16
set H_prop to 9
-- Test av padding to proportions, - implemented!
set this_file to (choose file) as text
try
tell application "Image Events"
-- start the Image Events application
launch
-- open the image file
set this_image to open this_file
-- get dimensions of the image
copy dimensions of this_image to {W, H}
-- calculate pad dimensions
if (W * H_prop) ≥ (H * W_prop) then
set the new_H to (W * H_prop) / W_prop
set pad_dimensions to {W, new_H}
else
set the new_W to (H * W_prop) / H_prop
set pad_dimensions to {new_W, H}
end if
-- perform action
pad this_image to dimensions pad_dimensions
-- 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
Enjoy!
Edited! I realized I had just copy pasted the test values from h_prop > w_prop, it is now fixed.
And added declarations of origin, and then some.