Используя ImageMagick и некоторые сценарии оболочки bash, вот как его вычислить.
Используются базовые уравнения вращения точек.(См. https://en.wikipedia.org/wiki/Rotation_of_axes). Однако, поскольку вращение происходит вокруг центра, необходимо вычесть координаты центра входных данных из координат точек, выполнить вращение и затем добавить центр выходного изображения обратно.
Обратите внимание, что вращение ImageMagick происходит по часовой стрелке, в то время как обычные уравнения преобразования координат задаются для против часовой стрелки, поэтому я должен отрицать угол поворота.
Также обратите внимание, что Y положительно направлен вниз в координатах изображения и нормальное вращение координат имеетY вверх. Таким образом, в уравнениях между изображением и нормальной декартовой системой координат произошел обмен знаками.
Вот тестовое изображение, которое я создаю:
convert -size 300x300 xc:skyblue -size 100x100 xc:pink -geometry +50+50 -composite test.png
Очевидно (из команды ImageMagick) 4 угла:
pt1=50,50
pt2=149,50
pt3=149,149
pt4=59,149
Большие значения (149) на 1 меньшерозовые размеры плюс начальные координаты (100-1 + 50 = 149), поскольку индексирование начинается с 0 в ImageMagick. Смещения относительно 0.
Далее я поворачиваю изображение:
convert test.png -background black -rotate 20 test2.png
Итак, чтобы вычислить 4 точки на выходе, мне сначала нужно знатьнасколько большой будет выход для данного угла поворота.
angle=20
ww=300
hh=300
ang=-$angle
wwr=$(convert xc: -format "%[fx:($ww*cos(pi*abs($ang)/180)+$hh*sin(pi*abs($ang)/180))]" info:)
hhr=$(convert xc: -format "%[fx:($ww*sin(pi*abs($ang)/180)+$hh*cos(pi*abs($ang)/180))]" info:)
echo "$wwr x $hhr"
384.514 x 384.514
Rounding to whole numbers, it would be
wwr=385
hhr=385
Note for computing the new dimensions, I use the abs of the sin and cos and all positive signs
Далее я переформатирую 4 точки в массивы X и Y для последующей обработки.
pt1=50,50
pt2=149,50
pt3=149,149
pt4=59,149
list="$pt1 $pt2 $pt3 $pt4"
echo "$list"
i=0
for pt in $list; do
xArr[$i]=$(echo "$pt" | cut -d, -f1)
yArr[$i]=$(echo "$pt" | cut -d, -f2)
i=$((i+1))
done
echo "${xArr[*]}"
50 149 149 59
echo "${yArr[*]}"
50 50 149 149
Теперь я вычисляюповернутые 4 угловые координаты:
angle=20
xlast=299
ylast=299
wwr=385
hhr=385
for ((i=0; i<4; i++)); do
xr=$(convert xc: -format "%[fx:((${xArr[$i]}-300/2)*cos(pi*$ang/180)+(${yArr[$i]}-300/2)*sin(pi*$ang/180)) + $wwr/2]" info:)
yr=$(convert xc: -format "%[fx:((${yArr[$i]}-300/2)*cos(pi*$ang/180)-(${xArr[$i]}-300/2)*sin(pi*$ang/180)) + $hhr/2]" info:)
echo "$xr,$yr"
done
132.733,64.3287
225.762,98.1887
191.902,191.218
107.33,160.436
Вы можете измерить их на выходном изображении, чтобы убедиться, что они правильные.Вы можете округлить до целых чисел по желанию.
Если вы хотите прямоугольную ограничивающую рамку, то просто вычислите значения minx, miny, maxx, maxy.