Обрезать и изменить размер изображения вокруг пользовательской точки фокусировки - PullRequest
0 голосов
/ 02 апреля 2020

История

Обзор того, чего я хочу достичь sh: у меня есть фотографии, которые нужно обрезать и изменить их размер, один раз для просмотра уменьшенных изображений (около 295x195) и один раз для заголовка "" -изображение "в стиле" (около 1400x560). Оригинальные фотографии различаются по размеру, самые большие - около 2440x1600. Это не будет проблемой для решения.

Однако изображение не должно быть обрезано с гравитацией "север" или "центр", а должно иметь определенную центральную позицию, откуда изображение должно быть обрезано. Для этого изображение имеет значения x и y, которые представляют центральную точку в процентах; x=50,y=50 будет означать, что точка фокусировки изображения на самом деле находится посередине.

Я искал здесь и на форумах imagemagick, но не смог найти ничего подходящего, кроме «обрезания определенной части изображения». а затем изменить его размер ". Я не уверен, что это можно сделать с помощью одной команды imagemagick или мне нужно вычислить все самостоятельно и создать пустое полотно, поместить на него изображение, переместить и изменить его размер, а затем сбрить все остальное, чтобы добиться этого.

Что я хочу достичь

Мне нужна одна команда imagemagick, чтобы

  • взять одно изображение в качестве входных данных
  • изменить размер и обрезать его до заданного размера (например, 295x195) с учетом имеющейся у меня точки фокусировки (в процентах или пикселях)
  • выведите изображение с заданным размером с точкой фокусировки посередине

Я буду использовать одну команду для каждого изображения и для каждого необходимого размера.

Вот краткая визуализация, которую я сделал в наброске с демонстрационной картинкой в ​​надежде сделать ее более понятной, что я пытаюсь сделать:

Problem representation

Изображение слева - это базовое изображение, на котором я поместил точку фокусировки в 282 282. Справа - желаемый урожай, который я хочу в размерах 295x195px (без линий, они просто для демонстрации проблемы). Как вы можете видеть, обрезка имеет центральную точку, где точка фокусировки на исходном изображении имеет вид.

Что я пробовал

Моя первая попытка была поиграться со значениями смещения для -crop чтобы установить точку фокусировки изображения:

convert photo.jpg -resize 1440x560^ -crop "1440x560+25%+25%" result.jpg

Но я быстро понял, что это не так, поскольку это приводит к тому, что изображения слишком малы (когда координаты находятся, например, в левом нижнем углу изображение) и вообще обрезает части изображения, которые были бы видны с точкой фокусировки, что имеет смысл после прочтения об этом в документах.

Затем я увидел вариант -region и попытался воспроизвести с размером изображения 2400x1600 и различными порезами на моем изображении:

convert photo.jpg -region 610x400 -resize 1440x560^ -crop 1440x560+0+0 result.jpg

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

Любые подсказки в правильном направлении (с примерами кода или без них) были бы полезны, поэтому я знаю, где копать глубже.

Среда

  • macOS Catalina для Разработка
  • Приложение, содержащее код, будет работать на Debian Buster
  • Локальная версия imagemagick - 7.0.8-66
  • Версия сервера imagemagick - 6.9.10-23 (я могу обновить это с ручной сборкой, хотя, было бы хорошо иметь решение, которое работает только в IM7)

1 Ответ

2 голосов
/ 03 апреля 2020

Оператор "-distort SRT" в ImageMagick может масштабировать изображение, изменять размер холста и перемещать точку из одного набора координат в другой все за один ход.

Эта команда будет считывать ваше входное изображение и установите выходной видовой экран 295x195. Затем он использует -distort SRT для масштабирования входного изображения до 50%, перемещения этой начальной центральной точки + 282 + 282 к новой выходной центральной точке + 147,5 + 97,5 и изменения размера области просмотра на 295x195.

convert input.png -set option:distort:viewport 295x195 \
   -distort SRT "282,282 0.5 0 147.5,97.5" result.png

Аргументы искажения начинаются с точки, в которой вы хотите быть центром операции, "+ 282 + 282". Тогда шкала «0,5» уменьшает размер до 50%. Аргумент «0» указывает на сколько градусов поворота, но вы не поворачиваете изображение, поэтому «0». И последний аргумент - это точка приземления, «+ 147,5 + 97,5», для которой была отправная точка, поэтому она становится новым центром вашего выходного холста 295x195.

Конечно, вам придется вставлять вручную и скорректируйте свои аргументы, если вы используете входные данные различного размера.

EDITED TO ADD ...

ImageMagick может вычислить сумму для масштабирования изображения, используя выражение FX. Вот та же команда, в которой выражение FX делит смещение X или центр выходного видового экрана на смещение X, используемое из входного изображения.

convert input.png -set option:distort:viewport 295x195 \
   -distort SRT "282,282 %[fx:147.5/282] 0 147.5,97.5" result.png

, которое помещает исходную точку координат 282 X в 147,5, и масштабирует изображение до этого соотношения.

...