Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 旋转图片框中的图像_.net_Vb.net_Image - Fatal编程技术网

.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