现在的位置: 首页 > 综合 > 正文

VB.NET 中图形旋转任意角度 [ZT]

2012年10月02日 ⁄ 综合 ⁄ 共 3908字 ⁄ 字号 评论关闭

最近CSDN有几个人问这个问题,图形旋转任意角度方法算法都很多,这里主要用 Graphics.RotateTransform()方法实现。

Public Class Form1
    Dim img1 As Image
    Const PI = 3.14159265
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Me.PictureBox1.Image = Rotate(img1, 30)

    End Sub
    '
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        img1 = Image.FromFile("d:\9.jpg")
        Me.PictureBox1.Image = img1
    End Sub

    Public Function Rotate(ByVal imgSource As Image, ByVal degree As Integer) As Image
        degree = degree Mod 360
        If degree < 0 Then degree = 360 + degree
        If imgSource Is Nothing Then Return Nothing
        Dim ImgTarget As Image = Nothing
        Try
            Select Case degree
                Case 0 To 89
                    ImgTarget = Rotate0_90(imgSource, degree)
                Case 90 To 179
                    ImgTarget = Rotate90_180(imgSource, degree)
                Case 180 To 269
                    ImgTarget = Rotate180_270(imgSource, degree)
                Case 270 To 359
                    ImgTarget = Rotate270_360(imgSource, degree)
            End Select
        Catch
        End Try
        Return ImgTarget
    End Function
    Private Function Rotate0_90(ByVal img As Image, ByVal degree As Integer) As Image
        Dim ImgTarget As Bitmap
        Dim alpha As Double = (degree / 180) * PI

        Dim iWidth As Integer = img.Width * Math.Cos(alpha) + img.Height * Math.Sin(alpha)
        Dim iHeight As Integer = img.Width * Math.Sin(alpha) + img.Height * Math.Cos(alpha)

        ImgTarget = New Bitmap(iWidth, iHeight, Drawing.Imaging.PixelFormat.Format24bppRgb)
        Dim g As Graphics
        g = Graphics.FromImage(ImgTarget)

        g.TranslateTransform(img.Height * Math.Sin(alpha), 0)

        g.RotateTransform(degree)
        'ImgTarget.MakeTransparent(ImgTarget.GetPixel(1, 1))
        g.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height))
        Return ImgTarget
    End Function
    Private Function Rotate90_180(ByVal img As Image, ByVal degree As Integer) As Image
        Dim ImgTarget As Bitmap
        Dim alpha As Double = ((degree - 90) / 180) * PI

        Dim iHeight As Integer = img.Width * Math.Cos(alpha) + img.Height * Math.Sin(alpha)
        Dim iWidth As Integer = img.Width * Math.Sin(alpha) + img.Height * Math.Cos(alpha)

        ImgTarget = New Bitmap(iWidth, iHeight, Drawing.Imaging.PixelFormat.Format24bppRgb)
        Dim g As Graphics
        g = Graphics.FromImage(ImgTarget)

        g.TranslateTransform(iWidth, img.Height * Math.Sin(alpha))

        g.RotateTransform(degree)
        'ImgTarget.MakeTransparent(ImgTarget.GetPixel(1, 1))
        g.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height))
        Return ImgTarget
    End Function
    Private Function Rotate180_270(ByVal img As Image, ByVal degree As Integer) As Image
        Dim ImgTarget As Bitmap
        Dim alpha As Double = ((degree - 180) / 180) * PI

        Dim iWidth As Integer = img.Width * Math.Cos(alpha) + img.Height * Math.Sin(alpha)
        Dim iHeight As Integer = img.Width * Math.Sin(alpha) + img.Height * Math.Cos(alpha)

        ImgTarget = New Bitmap(iWidth, iHeight, Drawing.Imaging.PixelFormat.Format24bppRgb)
        Dim g As Graphics
        g = Graphics.FromImage(ImgTarget)

        g.TranslateTransform(img.Width * Math.Cos(alpha), iHeight)

        g.RotateTransform(degree)
        'ImgTarget.MakeTransparent(ImgTarget.GetPixel(1, 1))
        g.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height))
        Return ImgTarget
    End Function
    Private Function Rotate270_360(ByVal img As Image, ByVal degree As Integer) As Image
        Dim ImgTarget As Bitmap
        Dim alpha As Double = ((degree - 270) / 180) * PI

        Dim iHeight As Integer = img.Width * Math.Cos(alpha) + img.Height * Math.Sin(alpha)
        Dim iWidth As Integer = img.Width * Math.Sin(alpha) + img.Height * Math.Cos(alpha)

        ImgTarget = New Bitmap(iWidth, iHeight, Drawing.Imaging.PixelFormat.Format24bppRgb)
        Dim g As Graphics
        g = Graphics.FromImage(ImgTarget)

        g.TranslateTransform(0, img.Width * Math.Cos(alpha))

        g.RotateTransform(degree)
        'ImgTarget.MakeTransparent(ImgTarget.GetPixel(1, 1))
        g.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height))
        Return ImgTarget
    End Function
End Class

抱歉!评论已关闭.