且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何旋转图像以保留其原始大小?

更新时间:2023-11-21 14:16:16

我不太清楚您希望如何旋转图像.问题是旋转轴,旋转图像的新尺寸还是其他?

Not quite clear to me how would you like to rotate the image. Is the problem the rotation axis, the new size of the rotated image, or something else?

无论如何,据我所知,以下代码片段围绕画布的边缘或中心点旋转图像.

Anyways, to the best of my guessing, the following code snippet rotates the image either around the edges of the canvas or around it's center point.

Private Function RotateImage(ByVal src As Bitmap,
                            ByVal width As Integer,
                            ByVal height As Integer,
                            ByVal angle As Single,
                            Optional ByVal CenterRotation As Boolean = False) As Bitmap

   Dim cornors As Point() = {New Point(0, 0),
                        New Point(width, 0),
                        New Point(width, height),
                        New Point(0, height)}
   Using m As New Matrix
    If Not CenterRotation Then
        m.RotateAt(angle, New PointF(width / 2, height / 2))
        m.TransformPoints(cornors)
    End If

    Dim left = Integer.MaxValue
    Dim right = Integer.MinValue
    Dim top = Integer.MaxValue
    Dim bottom = Integer.MinValue

    For i = 0 To UBound(cornors)
        If cornors(i).X < left Then left = cornors(i).X
        If cornors(i).X > right Then right = cornors(i).X
        If cornors(i).Y < top Then top = cornors(i).Y
        If cornors(i).Y > bottom Then bottom = cornors(i).Y
    Next

    Dim b As New Bitmap(right - left, bottom - top)
    Dim x = (b.Width - width) / 2
    Dim y = (b.Height - height) / 2

    Using g As Graphics = Graphics.FromImage(b)
        m.Reset()
        m.RotateAt(angle, New PointF(b.Width / 2, b.Height / 2))
        g.Transform = m
        g.InterpolationMode = InterpolationMode.HighQualityBicubic
        g.SmoothingMode = SmoothingMode.HighQuality
        g.CompositingQuality = CompositingQuality.HighQuality
        g.Clear(Color.Transparent)
        g.DrawImage(src, New Rectangle(x, y, width, height))
    End Using
    Return b
   End Using
End Function

如果您还需要调整旋转图像的大小以适合画布,那么在第一个之后还需要以下代码:

If you also need to resize the rotated image to fit into the canvas, then you also need the following code AFTER THE FIRST ONE:

Private Function CreateThumbnail(ByVal bmp As Bitmap,
                                    ByVal canvasWidth As Integer,
                                    ByVal canvasHeight As Integer,
                                    Optional Stretch As Boolean = False) As Bitmap

    Dim bmpOut As Bitmap = Nothing

    If Stretch Then
        bmpOut = bmp.GetThumbnailImage(canvasWidth, canvasHeight, Nothing, IntPtr.Zero)
    Else
        Dim newWidth As Integer = 0
            Dim newHeight As Integer = 0

            bmpOut = New Bitmap(canvasWidth, canvasHeight)

            Dim ratioX As Double = CDbl(canvasWidth) / CDbl(bmp.Width)
            Dim ratioY As Double = CDbl(canvasHeight) / CDbl(bmp.Height)
            Dim ratio = If(ratioX < ratioY, ratioX, ratioY)

            newWidth = Convert.ToInt32(bmp.Width * ratio)
            newHeight = Convert.ToInt32(bmp.Height * ratio)

            If newWidth > bmp.Width Then
                newWidth = bmp.Width
            End If
            If newHeight > bmp.Height Then
                newHeight = bmp.Height
            End If

            Dim posX = Convert.ToInt32((canvasWidth - newWidth) / 2)
            Dim posY = Convert.ToInt32((canvasHeight - newHeight) / 2)

            Using g As Graphics = Graphics.FromImage(bmpOut)
                g.InterpolationMode = InterpolationMode.HighQualityBicubic
                g.SmoothingMode = SmoothingMode.HighQuality
                g.CompositingQuality = CompositingQuality.HighQuality
                g.Clear(Color.Transparent)
                g.DrawImage(bmp, posX, posY, newWidth, newHeight)
            End Using
        End If

    Return bmpOut
End Function

这是一个快速演示:

祝你好运.