最近想搞一搞Visual Basic.NET中的图像处理。
只做了一个非常简单的图像绕指定原点进行旋转指定角度的功能。
Private Sub myTimer_Tick(sender As Object, e As EventArgs) Handles myTimer.Tick
Static ang As Integer = 0
Dim img As Image = My.Resources.进度环
Dim bitSize As Single = Math.Sqrt(img.Width ^ 2 + img.Height ^ 2)
'bitSize = img.Width
With Me.PictureBoxRoll
Dim bmp As Bitmap = New Bitmap(CInt(bitSize), CInt(bitSize))
Using g As Graphics = Graphics.FromImage(bmp)
Dim point_c As New Point(-bitSize / 2, -bitSize / 2)
g.TranslateTransform(bitSize / 2, bitSize / 2)
g.RotateTransform(ang)
g.DrawImage(img, point_c)
End Using
.Image = bmp
End With
ang += 20
End Sub
但是有几个问题:
1、旋转的图像比原图形大:是原图形的根号2倍,如果将代码中的bitSize 改成bitSize = img.Width的话,旋转的中心又不在环形的中间了;
2、在旋转的过程中,旋转的中心与环形的中心总是有一点偏移,大概有一两个像素,在旋转的过程中有点偏心轮的效果,这是为什么呢?
3、上面对图片文件的调用方式:Dim img As Image = My.Resources.进度环,这种方式对不对?还是说应该先将图片加载到内存中,然后在每一次Tick事件中去调用图片的变量?
4、如果图像是一种不断添加式的旋转,即每转动一次,都是在原图上进行叠加,而不是对原图形进行旋转(请问这种叠加会不会使程序的内存不断加大啊,还是只是改变了那片区域的像素值)?
------解决思路----------------------
:.net按任意角度旋转图片功能
private void button1_Click(object sender, EventArgs e)
{
Graphics g = this.panel1.CreateGraphics();//实例化绘图对象
float MyAngle = 0;//旋转的角度
while (MyAngle < 360)//codego.net/tags/1/1/
{
TextureBrush MyBrush = new TextureBrush(MyBitmap);//实例化TextureBrush类
this.panel1.Refresh();//使工作区无效
MyBrush.RotateTransform(MyAngle);//以指定角度旋转图像
g.FillRectangle(MyBrush, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height);//绘制旋转后的图像
MyAngle += 0.5f;//增加旋转的角度
System.Threading.Thread.Sleep(50);//使线程休眠50毫秒
}
}