NonSoft

Bitmapを中心点と角度を指定して回転する
サンプル(VB.NET)


 サンプル(ソース/コード)
<このサンプルの概要>
VB.NETのBitmapを中心点の座標と角度を指定して回転するサンプルを作ってみました。
Bitmap回転のサンプルは沢山ありますが、その殆どが左上座標(0,0)を中心として回転しています。
このサンプルは回転する中心点を指定出来ます。例えば画像の中心位置を支点に回転します。

このサンプルのポイントとなるキーワードは以下の通りです。
(1)Graphics
(2)TranslateTransform
(3)RotateTransform
(4)MatrixOrder.Append
(5)DrawImageUnscaled

C#.NETのサンプルはこちらです。
Bitmapを中心点と角度を指定して回転するサンプル(C#.NET)

Bitmapを中心座標と角度を指定して回転するサンプル(Form1.vb)
Public Class Form1
    ''' <summary>
    ''' オリジナルBitmap
    ''' </summary>
    Private org As Bitmap = Nothing

    ''' <summary>
    ''' 現在の回転角度
    ''' </summary>
    Private ang As Single = 0

    ''' <summary>
    ''' フォームロード
    ''' </summary>
    ''' <param name="sender">sender</param>
    ''' <param name="e">e</param>
    Private Sub Form1_Load( _
        ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' オリジナルBitmapの取得
        Dim bmp As Bitmap = New Bitmap("test.jpg")
        org = New Bitmap(bmp, 512, 512)
        bmp.Dispose()

        ' オリジナルBitmapをpictureBoxに設定
        PictureBox1.Image = org
    End Sub

    ''' <summary>
    ''' ボタンクリック
    ''' </summary>
    ''' <param name="sender">sender</param>
    ''' <param name="e">e</param>
    Private Sub Button1_Click( _
        ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' ビットマップ(Bitmap)を回転する
        ang += 5
        PictureBox1.Image = RotateBitmap(org, ang, PictureBox1.Width / 2, PictureBox1.Height / 2)
    End Sub

    ''' <summary>
    ''' ビットマップ(Bitmap)を回転する
    ''' </summary>
    ''' <param name="bmp">ビットマップ</param>
    ''' <param name="angle">回転角度</param>
    ''' <param name="x">中心点X</param>
    ''' <param name="y">中心点Y</param>
    ''' <returns></returns>
    Private Function RotateBitmap( _
        ByVal bmp As Bitmap, ByVal angle As Single, ByVal x As Integer, ByVal y As Integer) As Bitmap

        Dim bmp2 As Bitmap = New Bitmap(bmp.Width, bmp.Height)
        Dim g As Graphics = Graphics.FromImage(bmp2)
        g.Clear(Color.Black)

        g.TranslateTransform(-x, -y)
        g.RotateTransform(angle, System.Drawing.Drawing2D.MatrixOrder.Append)
        g.TranslateTransform(x, y, System.Drawing.Drawing2D.MatrixOrder.Append)

        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear

        g.DrawImageUnscaled(bmp, 0, 0)
        g.Dispose()

        Return bmp2
    End Function
End Class