VB.NET围绕中心旋转图形对象

时间:2016-09-28 10:19:53

标签: vb.net graphics rotatetransform

如果这是一个愚蠢的问题,请提前道歉。

我有一个图形对象操纵图像,我在具有背景的面板上绘图。我想要做的是让图像围绕其中心旋转。 这是我现在所拥有的代码:

全球声明:

Dim myBitmap As New Bitmap("C:\Users\restofthefilepath")  
Dim g As Graphics

Form1_Load的:

g = Panel1.CreateGraphics

Timer1_tick(设置为1s间隔):

Panel1.Refresh()
g.DrawImage(myBitmap, -60, 110)
g.RenderingOrigin = New Point(160, 68)
g.RotateTransform(10)

我明白了:左边是第一个刻度线,右边是第二个刻度线。 enter image description here

(占位符图形)

正如您所看到的,我设置了RenderingOrigin(如this answer中所示):但旋转仍然在0,0左右。我已经尝试实现RotateTransform(10,160,68)(指定了旋转中心),this documentation表示应该可以,但是我收到了构建错误"重载解析失败,因为无法访问' RotateTransform'接受这个数量的论点"。

我哪里出错了,如何让图像绕中心旋转?

1 个答案:

答案 0 :(得分:2)

我开始了一个新的VB.NET Windows Forms项目。我添加了一个200px x 200px的面板和一个按钮,可以根据需要暂停动画。我给Panel1一个背景图片:

enter image description here

制作一张与你相似的图片:

enter image description here

并使用以下代码:

Public Class Form1

    Dim wiggle As Bitmap
    Dim tim As Timer

    Sub MoveWiggle(sender As Object, e As EventArgs)
        Static rot As Integer = 0
        Panel1.Refresh()

        Using g = Panel1.CreateGraphics()
            Using fnt As New Font("Consolas", 12), brsh As New SolidBrush(Color.Red)
                ' the text will not be rotated or translated
                g.DrawString($"{rot}°", fnt, brsh, New Point(10, 10))
            End Using
            ' the image will be rotated and translated
            g.TranslateTransform(100, 100)
            g.RotateTransform(CSng(rot))
            g.DrawImage(wiggle, -80, 0)
        End Using

        rot = (rot + 10) Mod 360

    End Sub

    Private Sub bnPause_Click(sender As Object, e As EventArgs) Handles bnPause.Click
        Static isPaused As Boolean = False
        If isPaused Then
            tim.Start()
            bnPause.Text = "Pause"
        Else
            tim.Stop()
            bnPause.Text = "Start"
        End If

        isPaused = Not isPaused

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        wiggle = New Bitmap("C:\temp\path3494.png")
        wiggle.SetResolution(96, 96) ' my image had a strange resolution
        tim = New Timer With {.Interval = 50}
        AddHandler tim.Tick, AddressOf MoveWiggle
        tim.Start()

    End Sub

    Private Sub Form1_Closing(sender As Object, e As EventArgs) Handles MyBase.Closing
        RemoveHandler tim.Tick, AddressOf MoveWiggle
        tim.Dispose()
        wiggle.Dispose()

    End Sub

End Class

并实现了这个目标:

enter image description here

注1:以正确的顺序设置转换非常重要。

注2:我在.Dispose()事件中的可支配资源上调用了MyBase.Closing。这可以确保内存保持干净,没有任何泄漏。

毫无疑问,创建动画的方法更好,但是在你想要的每秒一帧的情况下,这会达到你所追求的效果。