Поворот изображения относительно неправильной (верхней правой) точки - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь разместить повернутое изображение на чистом холсте.

Это команда, которую я использую:

convert "(" -size 1000x1000 xc:transparent ")" "(" "img.jpg" -virtual-pixel white -rotate -10.75 ")" -geometry +136+148 -composite "overlay.png" -geometry +0+0 -composite out.png

Я ожидаю, что изображение появится в +136+148, повернутом вокруг его центра. Однако вместо этого он поворачивается вокруг своего верхнего правого угла.

Я подтвердил это в Photoshop:

Это результирующее изображение (с использованием немного другого размера, но с теми же параметрами, что и в моем примере команды, приведенной здесь):

img one

4 строки - это направляющие, которые отмечают координаты, определяющие, где находится изображение. Как видите, изображение повернуто на -10.75 градусов. А центр вращения - это верхний правый угол.

Здесь я выбираю поле с правильными координатами в Photoshop:

img two

И вот я поворачиваю его после установки точки вращения в верхнем правом углу:

img three

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

Я пытался разобраться с этим много часов. Я попытался переключиться на + distort и -distort, а что нет, но там я просто получаю либо обрезанное изображение, либо другую неправильно расположенную ограничивающую рамку.

Я не знаю, как решить эту проблему. Что я делаю неправильно? Как я могу сказать -rotate повернуть мое изображение вокруг его центра, а не вокруг верхнего правого угла (почему в любом случае вверху справа?).

Спасибо за помощь!

Ответы [ 4 ]

0 голосов
/ 14 ноября 2018

Вот альтернатива отличному решению GeeMack ImageMagick. Это вычисляет центр исходного input.jpg и центр прозрачной области в Overlay.png. Затем он использует + distort SRT для перевода и поворота изображения, прежде чем окончательно скомбинировать с -layers merge.

convert Overlay.png \
\( +clone -alpha extract -trim -set option:center "%[fx:page.x+w/2],%[fx:page.y+h/2]" +delete \) \
\( Image.jpg -virtual-pixel none +distort SRT "%[fx:w/2],%[fx:h/2] 1 -10.7 %[center]" \) \
+swap -layers merge +repage result2.png


enter image description here

Вторая строка очень похожа на строку GeeMack, но она вычисляет центр ограничительной рамки прозрачной области и сохраняет ее в аргументе «center», а затем удаляет обрезанное изображение.

Третья строка вычисляет центр изображения Input.jpg (до вращения). Затем он использует + distort SRT для перевода из центра ввода (масштаб = 1) и поворота на -10,7 и для перевода в центр ограничительной рамки прозрачной области.

См. https://imagemagick.org/Usage/distorts/#srt

0 голосов
/ 14 ноября 2018

Гравитация по умолчанию для смещения - это северо-западный угол или верхний левый угол. Геометрическое смещение, которое вы используете, перемещает верхний левый угол повернутого изображения с отступом после добавления фона, а не верхний левый угол того, где вводится Поворот. Поэтому я думаю, что это может быть причиной того, что вы не получаете ожидаемый результат. ImageMagick -rotate вращается вокруг своего центра, но заполняет фон, чтобы получить законченное прямоугольное изображение, которое является ограничивающим прямоугольником вокруг повернутого изображения.

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

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

Вот как это сделать в синтаксисе bash unix.

over1="122,186"
over2="466,118"
over3="510,345"
over4="166,411"
WxH=`convert -ping "Image.jpg" -format "%wx%h" info:`
ww=`echo "$WxH" | cut -dx -f1`
hh=`echo "$WxH" | cut -dx -f2`
ww=$((ww-1))
hh=$((hh-1))
in1="0,0"
in2="$ww,0"
in3="$ww,$hh"
in4="0,$hh"
convert overlay.png \
\( Image.jpg -virtual-pixel none +distort Perspective \
"$in1 $over1  $in2 $over2  $in3 $over3  $in4 $over4" \) \
-layers merge +repage \
out.png


enter image description here

См. https://imagemagick.org/Usage/distorts/#perspective

0 голосов
/ 14 ноября 2018

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

convert overlay.png -background none \
   \( +clone -alpha extract -trim \
      -set option:offset +%[fx:page.x]+%[fx:page.y] +delete \) \
   \( image.jpg -rotate -10.7 -set page %[offset] \) \
   -set page %[fx:u.w]x%[fx:u.h] +swap -layers merge result.png


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

Это читает в оверлее, а внутри скобок делает его клон, извлекает альфа-канал и обрезает результат, чтобы найти смещение выреза. Сохраняет смещение в переменной с именем «смещение».

Затем в другом наборе скобок он читает нижнее изображение, поворачивает его на известные -10,7 градуса и использует эту переменную «смещение», чтобы установить смещение подкачки для повернутого «image.jpg».

Затем за пределами скобок он использует ширину и высоту наложения, чтобы установить размеры подкачки для нижнего изображения.

Он заканчивается, меняя порядок изображений, чтобы поместить наложение поверх, затем объединяя два слоя, чтобы создать вывод.

0 голосов
/ 14 ноября 2018

enter image description here

Попробуйте использовать геометрию смещения, которая выравнивается с внешними краями вашей целевой области.Это будет больше по красным линиям, которые я добавил здесь, а не по голубым линиям в вашем примере изображения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...