如果这是一个愚蠢的问题,请提前道歉。
我有一个图形对象操纵图像,我在具有背景的面板上绘图。我想要做的是让图像围绕其中心旋转。 这是我现在所拥有的代码:
全球声明:
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)
(占位符图形)
正如您所看到的,我设置了RenderingOrigin(如this answer中所示):但旋转仍然在0,0左右。我已经尝试实现RotateTransform(10,160,68)(指定了旋转中心),this documentation表示应该可以,但是我收到了构建错误"重载解析失败,因为无法访问' RotateTransform'接受这个数量的论点"。
我哪里出错了,如何让图像绕中心旋转?
答案 0 :(得分:2)
我开始了一个新的VB.NET Windows Forms项目。我添加了一个200px x 200px的面板和一个按钮,可以根据需要暂停动画。我给Panel1一个背景图片:
制作一张与你相似的图片:
并使用以下代码:
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
并实现了这个目标:
注1:以正确的顺序设置转换非常重要。
注2:我在.Dispose()
事件中的可支配资源上调用了MyBase.Closing
。这可以确保内存保持干净,没有任何泄漏。
毫无疑问,创建动画的方法更好,但是在你想要的每秒一帧的情况下,这会达到你所追求的效果。