Обрезка изображения с областью фокусировки (лицо) с помощью ImageMagick - PullRequest
2 голосов
/ 27 января 2011

Я изо всех сил пытаюсь найти правильный подход к изменению размера и кадрированию и изображению, с зоной фокусировки. В моем случае зона фокусировки - это лицо, обнаруженное на изображении, и мне нужно убедиться, что эта область видна в обрезанной версии.

У меня есть зона фокусировки, заданная, например,. face_height, face_width, face_center_x и face_center_y. Эти значения являются процентами размеров исходного изображения.

То, что я хочу сделать, это получить пример. 60x60 миниатюра. Обычный подход заключается в изменении размера, чтобы высота или ширина изображения была равна 60px, а затем обрезали 60x60 от центра, как показано ниже:

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

Какой подход можно использовать, чтобы вместо этого сфокусировать мой урожай на заданном участке?

Я думаю о решении, которое включает несколько путей:

  1. Если область лица больше, чем требуемый эскиз, измените размер изображения настолько, чтобы сделать все лицо видимым в 60x60 пикселей, а затем обрежьте
  2. Если область лица меньше, чем требуемый эскиз, обрезайте «расширяйте» область моего лица, пока мой требуемый большой палец не сможет поместиться внутри области. Тогда урожай. Думаю, мне нужно убедиться, что это не выходит за рамки исходного изображения.

Есть ли более разумный подход? Можете ли вы попробовать сделать пример кода?

Спасибо!

1 Ответ

3 голосов
/ 11 февраля 2011

Сначала я делаю арифметику в скрипте или программе, затем передаю точные координаты в ImageMagick.

Арифметические шаги:

  • Будет проще работать с точными значениями пикселей, чем с процентами, поэтому конвертируйте face_height, face_width, face_center_x и face_center_yв пиксельные значения.
  • Вам понадобится прямоугольная миниатюра, поэтому выберите самую длинную сторону и работайте с ней:

    longest_side = max(face_height, face_width)

  • Теперь вы можете рассчитать верхнюю левую точку для вашего урожая:

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

  • Если любой изчетыре угла обрезки выходят за пределы размера изображения, отрегулируйте его следующим образом:

    • crop_x и crop_y должны быть оба => 0
    • crop_x + longest_side должны быть меньше изображенияширина
    • crop_y + longest_side должна быть меньше высоты изображения

Рассчитав их, вызов ImageMagick становится довольно простым:

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