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