Page 1 of 1
Batch Resize Canvas Size to Longest Side
Posted: 2018-10-30T09:53:59-07:00
by FUrn
I have a number of rectangular images (with different orientation) that I'd like to convert into square ones. I don't have specific dimensions for the square images, but they should be the length of the longest side of the original image, e.g:
188x166 -> 188x188
1200x1600 -> 1600x1600
I'd imagine I need to adjust the canvas to this new size (using white background), and ensure the original image is centered in the new canvas. Is this possible on ImageMagick?
I've come across the following code, but obviously need to find a way to replace the '640x640' with whatever the longest dimension of the image in question is:
Code: Select all
mogrify -extent 640x640 -gravity Center -fill white *.jpg
Thank you
Re: Batch Resize Canvas Size to Longest Side
Posted: 2018-10-30T12:08:35-07:00
by fmw42
What is your version of ImageMagick and platform? IM 6 and IM 7 have different syntax. But you will likely need to use convert/magick depending upon version rather than mogrify. You may need to write a script to loop over each image in your directory and that is OS dependent. For IM 7 you might be able to do multiple images in a single magick command, if you have enough memory and do not mind output name changes.
__________
See the top-most post in this forum "IMPORTANT: Please Read This FIRST Before Posting" at
http://www.imagemagick.org/discourse-se ... f=1&t=9620
If using Imagemagick 7, then see
http://imagemagick.org/script/porting.php#cli
For novices, see
http://www.imagemagick.org/discourse-se ... f=1&t=9620
http://www.imagemagick.org/script/comma ... essing.php
http://www.imagemagick.org/Usage/reference.html
http://www.imagemagick.org/Usage/
https://github.com/ImageMagick/usage-markdown
https://imagemagick.org/script/porting.php#cli
Re: Batch Resize Canvas Size to Longest Side
Posted: 2018-10-30T12:10:39-07:00
by snibgo
With v7, you can do individual files like this...
Code: Select all
magick in.png -gravity Center -background Blue -extent %[fx:max(w,h)]x%[fx:max(w,h)] out.png
... then put that in a shell loop.
Re: Batch Resize Canvas Size to Longest Side
Posted: 2018-10-30T18:34:19-07:00
by GeeMack
FUrn wrote: ↑2018-10-30T09:53:59-07:00I'd imagine I need to adjust the canvas to this new size (using white background), and ensure the original image is centered in the new canvas. Is this possible on ImageMagick?
This command will take any input image and pad it with white as necessary to create a square output image. If the input is wider than high, it will pad the top and bottom while centering the input in the square. If it's higher than wide, it will pad the left and right so the input is centered in the square output. If the input is already square it will leave the dimensions unchanged.
Code: Select all
convert input.png -virtual-pixel white ^
-set option:distort:viewport "%[fx:max(w,h)]x%[fx:max(w,h)]" ^
-distort affine "0,0 %[fx:w<h?(h-w)/2:0],%[fx:w>h?(w-h)/2:0]" result.png
That uses IM6 and is in Windows syntax. For IM7 use "magick" instead of "convert". To put it in a Windows BAT script, double the percent signs "%%". To run it as a *nix shell command, replace those end-of-line carets "^" with backslashes "\".
Note that if you're using IM version 7, the example command
snibgo provided above is a much more straightforward approach.
Either way, to perform this sort of operation on multiple files it's probably best to use a "for" loop as
snibgo suggested. The syntax depends on the platform you're running on.
Re: Batch Resize Canvas Size to Longest Side
Posted: 2018-10-31T04:44:10-07:00
by FUrn
snibgo wrote: ↑2018-10-30T12:10:39-07:00
With v7, you can do individual files like this...
Code: Select all
magick in.png -gravity Center -background Blue -extent %[fx:max(w,h)]x%[fx:max(w,h)] out.png
... then put that in a shell loop.
Thanks snibgo - this is helpful. There was a little syntax error when I ran the code, but adding quotation marks helped:
Code: Select all
magick in.jpg -gravity Center -background White -extent "%[fx:max(w,h)]x%[fx:max(w,h)]" out.jpg
I'm very much a beginner with IM and non-GUI editors though, so I hope it isn't too much to ask how to put that in a shell loop?
Re: Batch Resize Canvas Size to Longest Side
Posted: 2018-10-31T05:50:06-07:00
by snibgo
How can we, if you don't tell us what shell you are using?
For Windows, use the "for" command.
For bash, use the "for" command (but bash "for" is different to Windows "for").
Re: Batch Resize Canvas Size to Longest Side
Posted: 2018-10-31T06:12:19-07:00
by FUrn
Got it:
Code: Select all
for filename in *.jpg; do
magick "$filename" -gravity Center -background White -extent "%[fx:max(w,h)]x%[fx:max(w,h)]" "converted-$filename"
done
Thanks for all your help in getting me here...it works perfectly now!