我有以下图片:
我想以这样的方式旋转图像,2 点在同一条线上。
眼睛的最低点应该在同一“水平”上。
我怎么能确定我必须旋转图像的程度?
我已经按照建议尝试了 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 °?
如果您有这两个点的坐标,并且这些坐标的纵横比是一对一的,并且如果定义了坐标系,则向右移动会增加第一个(x)坐标,而向上移动会增加第二个(y)坐标,并且如果第一个点(x1,y1)是这两个点中最左边的点,则大多数计算机语言都可以通过
angle = atan2(y2 - y1, x2 - x1)
将图片顺时针旋转该角度将使两个点彼此水平,如果返回的角度为负,则将其更改为正,然后逆时针旋转。
请注意,一些语言交换 x 和 y 坐标,大多数语言将以弧度返回角度。(如果您需要度,将得到的弧度角乘以 180,然后除以 pi。)如果我陈述的任何假设都是错误的,则需要相应地调整该公式。如果您有任何这些假设的更多详细信息,请告诉我,我可以为您调整公式。
(在提问者尝试后添加。)
正如我刚才在最初的答案中强调的那样,我的公式取决于多个假设是否正确。现在你已经展示了你尝试的细节,我看到其中两个假设是错误的。
最重要的是,一个假设是“向上移动会增加第二个 (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 编程。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(77条)