开发者

Cropping an image with a focus area (face) using ImageMagick

开发者 https://www.devze.com 2023-02-06 19:41 出处:网络
I\'m struggling to find the right approach to resize and crop and image, with a focus area. In my case the focus area is a face detected in the image, and I need to make sure that this area is visible

I'm struggling to find the right approach to resize and crop and image, with a focus area. In my case the focus area is a face detected in the image, and I need to make sure that this area is visible in the cropped version.

I have focus area given by eg. face_height, face_width, face_center_x and face_center_y. These values are percentages of dimensions of the original image.

What I want to do, is getting a eg. 60x60 thumbnail. The normal approach would be开发者_StackOverflow社区 to resize so either height or width of the image is equal 60px and then crop a 60x60 from center, like this:

mogrify -resize 60x -gravity 'Center' -crop 60x60 image.jpg

What approach can be taken focus my crop around a given area instead?

I'm thinking of a solution that includes several paths:

  1. If the face area is bigger than the wanted thumbnail, resize the image just enough to make the whole face visible in 60x60 pixels, then crop
  2. If the face area is smaller than the wanted thumbnail, then crop "expand" my face area until my wanted thumb can fit inside the area. Then crop. I guess I need to make sure that this doesn't exceed the bounds of the original image.

Is there a smarter approach? Can you try make some example code?

Thanks!


I'd first do the arithmetic in script or program, then feed exact coordinates to ImageMagick.

The arithmetic steps:

  • It'll be easier to operate with exact pixel values than percentages, so convert face_height, face_width, face_center_x and face_center_y to pixel values.
  • You'll want rectangular thumbnail, so pick the longest side and operate with that:

    longest_side = max(face_height, face_width)

  • Now you can calculate top left point for your crop:

    crop_x = face_center_x - longest_side / 2
    crop_y = face_center_y - longest_side / 2

  • If any of the four crop corners fall outside your picture dimensions, adjust for that:

    • crop_x and crop_y should both be >= 0
    • crop_x + longest_side should be less than image width
    • crop_y + longest_side should be less than image height

Having calculated these, ImageMagick call gets quite straightforward:

mogrify -crop {longest_side}x{longest_side}+{crop_x}+{crop_y} -resize 60x60 image.jpg   
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号