Recortar una imagen con un área de enfoque (cara) usando ImageMagick
-
25-10-2019 - |
Pregunta
Estoy luchando por encontrar el enfoque correcto para cambiar el tamaño, el cultivo y la imagen, con un área de enfoque. En mi caso, el área de enfoque es una cara detectada en la imagen, y necesito asegurarme de que esta área sea visible en la versión recortada.
Tengo un área de enfoque dada por Eg. Face_Height, face_width, face_center_x y face_center_y. Estos valores son porcentajes de dimensiones de la imagen original.
Lo que quiero hacer es conseguir un EG. Miniatura 60x60. El enfoque normal sería cambiar el tamaño para que la altura o el ancho de la imagen sea igual 60px y luego recorte un 60x60 desde el centro, así:
mogrify -resize 60x -gravity 'Center' -crop 60x60 image.jpg
¿Qué enfoque se puede enfocar en mi cultivo en un área determinada en su lugar?
Estoy pensando en una solución que incluye varios caminos:
- Si el área de la cara es más grande que la miniatura deseada, cambie el tamaño de la imagen lo suficiente para que toda la cara sea visible en 60x60 píxeles, luego recorte
- Si el área de la cara es más pequeña que la miniatura deseada, entonces recorte "expandir" el área de mi cara hasta que mi pulgar deseado pueda caber dentro del área. Luego recorte. Supongo que necesito asegurarme de que esto no exceda los límites de la imagen original.
¿Hay un enfoque más inteligente? ¿Puedes intentar hacer algún código de ejemplo?
¡Gracias!
Solución
Primero haría la aritmética en script o programa, luego alimentaría coordenadas exactas a ImageMagick.
Los pasos aritméticos:
- Será más fácil operar con valores exactos de píxeles que porcentajes, por lo que convierta
face_height
,face_width
,face_center_x
yface_center_y
a valores de píxeles. Querrá una miniatura rectangular, así que elija el lado más largo y opere con eso:
longest_side = max(face_height, face_width)
Ahora puede calcular el punto superior izquierdo para su cosecha:
Crop_x = face_center_x - Longest_side / 2
Crop_y = face_center_y - Longest_side / 2Si alguna de las cuatro esquinas de cultivos cae fuera de las dimensiones de su imagen, ajuste para eso:
crop_x
ycrop_y
deberían ser> = 0crop_x + longest_side
debería ser menor que el ancho de la imagencrop_y + longest_side
debería ser menor que la altura de la imagen
Habiendo calculado estos, ImageMagick Call se vuelve bastante sencillo:
mogrify -crop {longest_side}x{longest_side}+{crop_x}+{crop_y} -resize 60x60 image.jpg