NonSoft

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


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

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

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

Bitmapを中心座標と角度を指定して回転するサンプル(Form1.cs)
namespace RotateBitmap
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// オリジナルBitmap
        /// </summary>
        private Bitmap org = null;

        /// <summary>
        /// 現在の回転角度
        /// </summary>
        private float ang = 0;

        /// <summary>
        /// フォームロード
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void Form1_Load(object sender, EventArgs e)
        {
            // オリジナルBitmapの取得
            Bitmap bmp = new Bitmap("test.jpg");
            org = new Bitmap(bmp, 512, 512);
            bmp.Dispose();

            // オリジナルBitmapをpictureBoxに設定
            pictureBox1.Image = org;
        }

        /// <summary>
        /// ボタンクリック
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void button1_Click(object sender, EventArgs e)
        {
            // ビットマップ(Bitmap)を回転する
            ang += 5;
            pictureBox1.Image = RotateBitmap(org, ang, 100, 200);
        }

        /// <summary>
        /// ビットマップ(Bitmap)を回転する
        /// </summary>
        /// <param name="bmp">ビットマップ</param>
        /// <param name="angle">回転角度</param>
        /// <param name="x">中心点X</param>
        /// <param name="y">中心点Y</param>
        /// <returns></returns>
        public Bitmap RotateBitmap(Bitmap bmp, float angle, int x, int y)
        {
            Bitmap bmp2 = new Bitmap((int)bmp.Width, (int)bmp.Height);
            Graphics g = 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;
        }

    }
}