.net 旋转图片框中的图像
我目前正在编写一个游戏,它使用一个需要旋转的箭头来告诉用户他们将以什么角度“投掷”他们的球。我已经编码了几乎所有的解决方案,但是,我有一个箭头作为图片框和它里面的图像。我需要能够旋转并记录它旋转的角度,我有一个计时器,我计划在每次勾选图像时将其旋转一度,并将其添加到角度变量中。我唯一要做的就是旋转图像。您需要的任何详细信息我都可以提供 非常感谢您的帮助, 非常感谢,, 丹.net 旋转图片框中的图像,.net,vb.net,image,.net,Vb.net,Image,我目前正在编写一个游戏,它使用一个需要旋转的箭头来告诉用户他们将以什么角度“投掷”他们的球。我已经编码了几乎所有的解决方案,但是,我有一个箭头作为图片框和它里面的图像。我需要能够旋转并记录它旋转的角度,我有一个计时器,我计划在每次勾选图像时将其旋转一度,并将其添加到角度变量中。我唯一要做的就是旋转图像。您需要的任何详细信息我都可以提供 非常感谢您的帮助, 非常感谢,, 丹 私有函数旋转图像(图像为图像,角度为单个)为位图 '调用代码负责(并且必须) '处理返回的位图 将retBMP调整为新位图(
私有函数旋转图像(图像为图像,角度为单个)为位图
'调用代码负责(并且必须)
'处理返回的位图
将retBMP调整为新位图(图像)
retBMP.SetResolution(image.HorizontalResolution,image.VerticalResolution)
使用g=Graphics.FromImage(retBMP)
'围绕图像中心旋转
g、 TranslateTransform(image.Width\2,image.Height\2)
“轮换
g、 旋转变换(角度)
g、 TranslateTransform(-image.Width\2,-image.Height\2)
'将图像绘制到新的boitmap
g、 DrawImage(retBMP,新点F(0,0))
终端使用
返回retBMP
端函数
私有子PowerTimer_Tick(发送方作为对象,e作为事件参数)处理PowerTimer.Tick
如果箭头角度>=45,则
角度增加=错误
ElseIf ArrowAngle和VB翻译有几个问题。首先,CreateGraphics
几乎从来都不是正确的选择。紧接着,它被Graphics.FromImage
中的一个替换。这是正确的方法,因为您将绘制到位图,但没有一个位图被释放,因此应用程序将泄漏。如果计时器上有东西在旋转,这可能是个问题
其次,c#版本存在缺陷:该方法期望传递一个偏移量,但可以进行计算(“如何使用”不需要费心传递偏移量)。最后,c版本也在泄漏
Private Function RotateImage(img As Image, angle As Single) As Bitmap
' the calling code is responsible for (and must)
' disposing of the bitmap returned
Dim retBMP As New Bitmap(img.Width, img.Height)
retBMP.SetResolution(img.HorizontalResolution, img.VerticalResolution)
Using g = Graphics.FromImage(retBMP)
' rotate aroung the center of the image
g.TranslateTransform(img.Width \ 2, img.Height \ 2)
'rotate
g.RotateTransform(angle)
g.TranslateTransform(-img.Width \ 2, -img.Height \ 2)
'draw image to the bitmap
g.DrawImage(img, New PointF(0, 0))
Return retBMP
End Using
End Function
用法:
' form level var if rotating over and over
Private CatImg As Bitmap
' elsewhere:
CatImg = New Bitmap("C:\Temp\ceiling_cat.jpg")
' to create a new rotated image:
Dim bmp = RotateImage(CatImg, -65)
pb1.Image = bmp
'ToDo: dispose of the picbox image
结果(之前和之后):
由于代码不计算新的边框大小,因此会剪裁角。如果旋转的物体在更大的图像中,它仍然可以工作
使用旋转方法在计时器上来回重定向箭头-90到90度:
斯穆特!很大程度上取决于要旋转的图像的性质,在这种情况下,我们对图像一无所知。瞥一眼TaskManager,没有发现任何泄漏-请务必处理前一张图像。您做过任何研究吗?第一次谷歌搜索返回RotateFlip
方法的MSDN记录。是的,我做过研究,但你应该知道,RotateFlip方法不能做像1度这样的值,它可以做90度、180度和所有其他主要值,但我不相信它可以做1度。如果我错了,请纠正我,并显示一些示例代码,但我不相信此方法适用于我的实现。正如你所知,我也研究了图像图形(图形),但仅仅旋转箭头似乎有点低效。这似乎不起作用,我正在使用Visual Studio的vb.net(因此是标记)表单应用程序。提供的链接是为C#提供的,我曾试图将其转换为VB.Net代码,但它认为实用程序未定义。其中一条评论说,它似乎可以很好地转换为VB.Net。你挂在哪一行?使用这个代码,如果需要的话,可以将它添加到我的原始帖子中,但它会绘制到旧图像上,将两者都放在屏幕上,当我旋转很多次时,这会导致图片框只填充红色。有什么想法吗?当然,我不知道你的图像是什么样子,也不知道红色是如何融入其中的。该方法返回一个从原始图像旋转的新图像,因此,如果该图像绘制到上一个图像,则说明您如何使用它。这应该是一个像时钟一样的东西(你提到了1度旋转),看起来很奢侈。图像是红色的,它是一个红色的箭头。我会把我现在的代码放到原来的帖子里
' form level var if rotating over and over
Private CatImg As Bitmap
' elsewhere:
CatImg = New Bitmap("C:\Temp\ceiling_cat.jpg")
' to create a new rotated image:
Dim bmp = RotateImage(CatImg, -65)
pb1.Image = bmp
'ToDo: dispose of the picbox image