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

最近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