我有以下图片:
我想以这两个点在同一条线上的方式旋转图像。
眼睛的最低点应该在同一“水平”。
我如何确定旋转图像的程度?
我已按照建议尝试了atan2功能,但这不会产生所需的角度。我用旋转功能和Photoshop测试了它。
我得到了以下结果:
pt1 = {X = 421 Y = 350}
pt2 = {X = 241 Y = 325}
angle = -3.0035866299322738 (calculated with the atan2 function as proposed in one answer)
以角度-3旋转后,绿线应该是完全笔直的,但事实并非如此,所以我不知道这里的罪魁祸首在哪里。
也许我的轮换代码不正确。
这是我的轮换代码:
Public Function RotateImage(ByVal uBmp As Bitmap, ByVal uAngle As Double) As Bitmap
' //create a New empty bitmap to hold rotated image
Dim nBmp As Bitmap = New Bitmap(uBmp.Width, uBmp.Height)
nBmp.SetResolution(uBmp.HorizontalResolution, uBmp.VerticalResolution)
'//make a graphics object from the empty bitmap
Using g As Graphics = Graphics.FromImage(nBmp)
' //Put the rotation point in the center of the image
' rotate aroung the center of the image
g.TranslateTransform(uBmp.Width \ 2, uBmp.Height \ 2)
'rotate
g.RotateTransform(uAngle)
g.TranslateTransform(-uBmp.Width \ 2, -uBmp.Height \ 2)
' //draw passed in image onto graphics object
g.DrawImage(uBmp, New PointF(0, 0))
End Using
Return nBmp
End Function
这是一个简单的检查:
使用在线工具绘制角度,我得到了以下图像:
我确定了2分: pt1位于(0,0) pt2位于(120,33)
在线工具的角度为15°。
但是atan2函数返回的角度= 0.26836621090590684。
我怎么能让我的15°回来?
答案 0 :(得分:1)
如果您有这两个坐标的坐标,并且这些坐标的纵横比是一对一的,并且如果定义坐标系使得向右移动增加第一个(x)坐标并向上移动增加第二个(y)坐标,如果第一个点(x1,y1)是这两个点中最左边的点,大多数计算机语言都可以通过
计算出你想要的角度angle = atan2(y2 - y1, x2 - x1)
顺时针旋转图像,将两个点相互水平放置。如果返回的角度为负,则将其更改为正并逆时针旋转。
请注意,有几种语言可以交换x和y坐标,大多数语言都会以弧度为单位返回角度。 (如果你需要度数,则将得到的弧度角乘以180然后除以pi。)如果我所述的任何假设都是假的,则需要相应地调整该公式。如果你有更多细节任何这些假设,让我知道,我可以为你调整公式。
(在提问者尝试之后添加。)
正如我在原始答案中所强调的那样,我的公式取决于多个假设是正确的。现在你已经展示了你的尝试的细节,我发现有两个假设是假的。
最重要的是,一个假设是'#34;向上移动会增加第二个(y)坐标,"这是欧氏几何的标准。许多图形环境都有越来越多的第二个(y)坐标移动向下,您的示例显示了您的情况。有了这个假设,将我的公式改为
angle = atan2(y1 - y2, x2 - x1)
请注意,我交换了y1
和y2
,这实际上取代了每个人的负数。
第二个假设是"第一个点(x1,y1)是这两个点中最左边的。"在您的示例中,第一个点是最右侧点,而不是最左侧。如果第一个点有一个更大的x坐标,你应该编写例程来交换点。
通过这些更改,您的积分是
pt1 = {X = 241 Y = 325}
pt2 = {X = 421 Y = 350}
并使用公式angle = atan2(y1 - y2, x2 - x1)
给出结果
-0.13800602365751946
该角度为负,因此将图片逆时针旋转角度0.13800602365751946
弧度,即7.907162702958458
度。
试一下,看看它是否有效。我不懂你的语言(是VB.NET吗?)所以我不能评论你的代码或为你的环境显示你的代码。我这些天用Python编程。