当前位置: 代码迷 >> .NET Framework >> Visual Basic.NET 按任意角度旋转图片解决思路
  详细解决方案

Visual Basic.NET 按任意角度旋转图片解决思路

热度:96   发布时间:2016-05-01 23:24:01.0
Visual Basic.NET 按任意角度旋转图片
最近想搞一搞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毫秒
            }
        }
  相关解决方案