DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

画像を傾けて表示する

注意:画像の表示方法が分からないという方は、まず「コントロールやフォームに画像を表示する」をご覧ください。

左上隅、右上隅、および左下隅の3箇所の表示先での座標を指定することにより、画像を傾けて表示することができます。この方法で画像を回転、反転表示することも可能です。詳しいことはGraphics.DrawImage メソッドをご覧いただくとして、具体例を以下に示します。

VB.NET
コードを隠すコードを選択
'Imports System.Drawing

'画像を傾けて表示する

'描画先とするImageオブジェクトを作成する
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

'描画する画像のBitmapオブジェクトを作成
Dim img As Bitmap =  New Bitmap("test.bmp") 
'元の画像を比較のためにそのまま描画する
g.DrawImage(img, 0, 0)

'画像を表示させる位置を指定する
'元の画像の左上の位置を(400, 10)にする
'元の画像の右上の位置を(300, 100)にする
'元の画像の左下の位置を(450, 200)にする
Dim destinationPoints() As Point
destinationPoints = New Point() {New Point(400, 10),
                            New Point(300, 100),
                            New Point(450, 200)}
'傾いた画像を描画する
g.DrawImage(img, destinationPoints)

'リソースを解放する
g.Dispose()
img.Dispose()

'PictureBox1に表示する
PictureBox1.Image = canvas
C#
コードを隠すコードを選択
//using System.Drawing;

//画像を傾けて表示する

//描画先とするImageオブジェクトを作成する
Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
//ImageオブジェクトのGraphicsオブジェクトを作成する
Graphics g = Graphics.FromImage(canvas);

//描画する画像のBitmapオブジェクトを作成
Bitmap img = new Bitmap("test.bmp");
//元の画像を比較のためにそのまま描画する
g.DrawImage(img, 0, 0);

//画像を表示させる位置を指定する
//元の画像の左上の位置を(400, 10)にする
//元の画像の右上の位置を(300, 100)にする
//元の画像の左下の位置を(450, 200)にする
Point[] destinationPoints;
destinationPoints = new Point[] {new Point(400, 10),
                            new Point(300, 100),
                            new Point(450, 200)};
//傾いた画像を描画する
g.DrawImage(img, destinationPoints);

//リソースを解放する
g.Dispose();
img.Dispose();

//PictureBox1に表示する
PictureBox1.Image = canvas;

結果は、下の図のようになります。

補足:MSDNの説明によると、例えば元の大きさのまま画像を表示するには、左上に(0, 0)、右上に(画像の横幅 - 1, 0)、左下に(0, 画像の高さ - 1)の座標を指定すれば良いように思われますが、実際はそうではなく、左上が(0, 0)、右上が(画像の横幅, 0)、左下が(0, 画像の高さ)となるようです。

画像を指定した角度回転して表示する

次に画像を回転して表示する例を示します。ここでは画像ファイルを30度回転させ、ピクチャボックスPictureBox1に表示しています。

VB.NET
コードを隠すコードを選択
'Imports System.Drawing

'描画先とするImageオブジェクトを作成する
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

'描画する画像のBitmapオブジェクトを作成
Dim img As Bitmap =  New Bitmap("dbs1.gif")

'ラジアン単位に変換
Dim d As Double =  30/(180/Math.PI)
'新しい座標位置を計算する
Dim x As Single =  30F
Dim y As Single =  10F
Dim x1 As Single =  x + img.Width * CType(Math.Cos(d), Single)
Dim y1 As Single =  y + img.Width * CType(Math.Sin(d), Single)
Dim x2 As Single =  x - img.Height * CType(Math.Sin(d), Single)
Dim y2 As Single =  y + img.Height * CType(Math.Cos(d), Single)
'PointF配列を作成
Dim destinationPoints() As PointF = {New PointF(x, y), _
                    New PointF(x1, y1), _
                    New PointF(x2, y2)}

'画像を表示
g.DrawImage(img, destinationPoints)

'リソースを解放する
img.Dispose()
g.Dispose()

'PictureBox1に表示する
PictureBox1.Image = canvas
C#
コードを隠すコードを選択
//using System.Drawing;

//描画先とするImageオブジェクトを作成する
Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
//ImageオブジェクトのGraphicsオブジェクトを作成する
Graphics g = Graphics.FromImage(canvas);

//描画する画像のBitmapオブジェクトを作成
Bitmap img = new Bitmap("dbs1.gif");

//ラジアン単位に変換
double d = 30/(180/Math.PI);
//新しい座標位置を計算する
float x = 30F;
float y = 10F;
float x1 = x + img.Width * (float) Math.Cos(d);
float y1 = y + img.Width * (float) Math.Sin(d);
float x2 = x - img.Height * (float) Math.Sin(d);
float y2 = y + img.Height * (float) Math.Cos(d);
//PointF配列を作成
PointF[] destinationPoints = {new PointF(x, y),
                    new PointF(x1, y1),
                    new PointF(x2, y2)};
//画像を表示
g.DrawImage(img, destinationPoints);

//リソースを解放する
g.Dispose();
img.Dispose();

//PictureBox1に表示する
PictureBox1.Image = canvas;

回転して画像を表示する方法については、「ワールド変換により画像を平行移動、拡大、縮小、回転して表示する」もご覧ください。

  • 履歴:
  • 2012/8/1 表示する方法を、PictureBox.Imageプロパティを使った方法に変更。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。