图像旋转算法原理
![](https://img-blog.csdnimg.cn/c578223fdf6c4c82bb4d70a2a867c914.png#pic_center)
![](https://img-blog.csdnimg.cn/5e6617e755954eb999eea1d9984d7ac6.png#pic_center)
![](https://img-blog.csdnimg.cn/f78cbbd079a84920bd7d2ebc0bc1d9b5.png#pic_center)
![](https://img-blog.csdnimg.cn/fbc05df81fb3434b9a318031dc529999.png#pic_center)
![](https://img-blog.csdnimg.cn/8965ed3a0d19408a95e2600f328f0c2d.png#pic_center)
![](https://img-blog.csdnimg.cn/8a33afd8bbf44dcb9b3139c53c336022.png#pic_center)
![](https://img-blog.csdnimg.cn/f961d61bc89046d4bf7c4bf4ae779593.png#pic_center)
![](https://img-blog.csdnimg.cn/5292349369984aca9d025ca9dfb15d4e.png#pic_center)
旋转后图像尺寸计算
def rotate_wh(angle, width, height):
new_height = int(width * fabs(sin(radians(angle))) + height * fabs(cos(radians(angle))))
new_width = int(height * fabs(sin(radians(angle))) + width * fabs(cos(radians(angle))))
return new_width, new_height
图像旋转
![](https://img-blog.csdnimg.cn/950d3e5de7194b939ee1e5602480a576.png#pic_center)
![](https://img-blog.csdnimg.cn/ffabe67076ef4243a0f8011f8dc9911c.png#pic_center)
![](https://img-blog.csdnimg.cn/c1124f8cc9ad4bf6b514f446cd453540.png#pic_center)
![](https://img-blog.csdnimg.cn/90f5dc534e4b452c98173637302b2666.png#pic_center)
根据原图像旋转后左上角的坐标计算旋转后图像的左上角坐标
如下图所示根据A点的坐标计算B点的坐标,A和B都是相对对画布的图像坐标。
def calculate_left_top_point(x, y, angle, w, h, new_w, new_h):
if angle < 0:
angle = angle + 360
else:
angle = angle
if 0 <= angle < 90:
x_left_top = x - h * sin(radians(angle))
y_left_top = y
elif 90 <= angle < 180:
x_left_top = x - new_w
y_left_top = y - h * sin(radians(angle - 90))
elif 180 <= angle < 270:
x_left_top = x - w * cos(radians(angle - 180))
y_left_top = y - new_h
else:
x_left_top = x
y_left_top = y - w * cos(radians(angle - 270))
return x_left_top, y_left_top