2

I have images of unknown size and ratios. I wish to take a centred 16:9 crop.

If all the images were known 4:3, then it's easy: 9/16 ÷ 3/4 = 0.75 so I simply set the height to 75% of the original like this:

convert photo.jpg -gravity center -crop '100%x75%' +repage photo16x9.jpg

However, if the photo is already 16:9 (or even wider), I don't want to crop it, and if it is 'taller' than 16:9 I want to crop it only by the amount necessary to achieve a 16:9 crop.

This would be also easier if I wanted to scale to a known width or height (example question for that). But I'm looking to leave as much of the original image data in place as poss.

Therefore I'm looking for a way to crop the height to a factor of the image's width, with a cut-off.

I hoped this might work

convert photo.jpg -gravity center \
  -crop '100%x[fx:9/16*w]' +repage photo16x9.jpg

but alas it seems the [fx:...] is not allowed in a -crop argument.

Hacking a bit I found somewhere that I could not for the life of me understand(!) also failed, but I'll list it here to show research effort!

convert photo.jpg -set option:distort:viewport \
  '[fx: w]x[fx: w*9/16 ]+0+0' -filter point \
  -distort SRT 0 +repage photo16x9.jpg

(I realise that neither attempts above cover the case when the image is already wider than 16:9, but if the [fx:...] thing worked I could achieve that by using the ternary operator, so I kept the examples simple.)

1 Answer 1

2

Maybe you can just calculate the aspect ratio and use that to make a decision. Create two test images, one 15x9 and one 17x9:

convert -size 15x9 xc:black 15x9.png
convert -size 17x9 xc:black 17x9.png

Now ask ImageMagick to tell you if the aspect ratio is wider than 16:9 or less than or equal to 16:9:

convert 15x9.png -format "%[fx:(w/h)>16/9]" info:
0

convert 17x9.png -format "%[fx:(w/h)>16/9]" info:
1

Not the answer you're looking for? Browse other questions tagged or ask your own question.