Pergunta

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 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!

Foi útil?

Solução

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   
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top