画像ファイルの拡大や回転方法の違いについて

Cc440874.download(ja-jp,MSDN.10).gif サンプル コードのダウンロード (vbmigtips_Image.exe, 98.7 KB)

画像ファイルを表示し、拡大や回転などの編集を行うアプリケーションを作成する場合があると思います。そこで今回は、画像ファイルの読み込みと保存方法、さらに、拡大や回転などの画像ファイルの変形方法について紹介します。今回は、図1 のようにフォーム内に 2 つのコントロールを貼り付け、フォームの Load 時に画像ファイルを表示します。そして、コントロールに表示された画像を保存したり、拡大・縮小、回転などを実装したりするアプリケーションを作成します。

 Cc440874.Image_fig01(ja-jp,MSDN.10).gif
 図1

Visual Basic 6.0 で画像ファイルを表示する場合、 PictureBox コントロール、または Image コントロールを使用します。 PictureBox コントロールと Image コントロールは、共に、ビットマップ、アイコン、メタファイル、jpeg ファイル、gif ファイルを表示することができます。しかし、 Image コントロールでは、表示した画像の保存や画像の回転などを実装することができません。そのため、画像ファイルの保存を実装したい場合には PictureBox コントロールを使用します。今回、Visual Basic 6.0 では、フォーム (図1) に PictureBox コントロール (右) と Image コントロール (左) を貼り付けます。
画像ファイルを読み込む場合は LoadPicture 関数を使用し、保存する場合は SavePicture 関数を使用します。実装コードは以下のとおりです。

Dim fileName As String

Private Sub Form_Load()
fileName = "C:\bmp1.bmp"
Image1.Picture = LoadPicture(fileName)
Picture1.Picture = LoadPicture(fileName)
End Sub

Private Sub menuSave_Click()
SavePicture Picture2.Picture, "C:\MyBmp.jpg"
End Sub

リスト1

上記 (リスト1) の「Image1.Picture = LoadPicture(fileName)」と「Picture1.Picture = LoadPicture(fileName)」で、 C ドライブの bmp1.bmp ファイルを読み込み、Image1 と Picture1 に表示します (図1)。「SavePicture Picture2.Picture, "C:\MyBmp.jpg"」で、Picture1 に表示されている画像を jpg 形式で C ドライブに保存します。

一方の、Visual Basic .NET では、Visual Basic 6.0 でサポートされていた Image コントロールは、Visual Basic .NET で、PictureBox コントロールと統合されました。
Visual Basic .NET で画像ファイルを読み込む場合は Image.FromStream メソッドを使用し、画像を保存する場合は Image.Save メソッドを使用します。実装コードは以下のとおりです。

Dim fileName As String

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
fileName = "C:\bmp1.bmp"
Dim hStream As New System.IO.FileStream(fileName, System.IO.FileMode.Open)
With PictureBox1
.SizeMode = PictureBoxSizeMode.AutoSize
.Image = Image.FromStream(hStream)
End With
With PictureBox2
.SizeMode = PictureBoxSizeMode.AutoSize
.Image = Image.FromStream(hStream)
End With
hStream.Close()
End Sub

Private Sub menuSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menuSave.Click
PictureBox2.Image.Save("C:\MyBmp.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
End Sub

リスト2

上記 (リスト2) の「Dim hStream As New System.IO.FileStream(fileName, System.IO.FileMode.Open)」で C ドライブの bmp1.bmp を開き、「.Image = Image.FromStream(hStream)」で bmp1.bmp の画像ファイルを読み込み PictureBox コントロールに表示します (図1)。最後に、Close メソッドで開いた bmp1.bmp を閉じます。「PictureBox2.Image.Save("C:\MyBmp.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)」で、PictureBox2 に表示されている画像 (ビットマップ ファイル) を jpg 形式で保存します。

続いて、PictureBox コントロールに表示された画像を拡大・縮小、回転する方法について紹介します。Visual Basic 6.0 で、画像の拡大・縮小や回転を行う場合、PaintPicture 関数を使用します。実装コードは以下のとおりです。

Private Sub MenuExpansion200_Click()
With Picture1
.Picture = Nothing
.Cls
.PaintPicture Image1.Picture, 0, 0, _
Image1.Parent.ScaleWidth * 2, _
Image1.Parent.ScaleHeight * 2, 0, 0, _
Image1.Parent.ScaleWidth, Image1.Parent.ScaleHeight
End With
End Sub

Private Sub MenuExpansion50_Click()
With Picture1
.Picture = Nothing
.Cls
.PaintPicture Image1.Picture, 0, 0, _
Image1.Parent.ScaleWidth * 0.5, _
Image1.Parent.ScaleHeight * 0.5, 0, 0, _
Image1.Parent.ScaleWidth, Image1.Parent.ScaleHeight
End With
End Sub

Private Sub menuRotate_Click()
With Picture1
.Picture = Nothing
.Cls
.PaintPicture Image1.Picture, Image1.Picture.Width, Image1.Picture.Height, _
-Image1.Picture.Width, -Image1.Picture.Height
End With
End Sub

リスト3

リスト3 のように、画像の拡大・縮小は、PaintPicture 関数を使用して、Image1 に表示されている画像のサイズを変更し Picture1 にコピーします。「.PaintPicture Image1.Picture, 0, 0, Image1.Parent.ScaleWidth * 2, Image1.Parent.ScaleHeight * 2, 0, 0, Image1.Parent.ScaleWidth, Image1.Parent.ScaleHeight」では 200% (2倍) 拡大し、「.PaintPicture Image1.Picture, 0, 0, Image1.Parent.ScaleWidth * 0.5, Image1.Parent.ScaleHeight * 0.5, 0, 0, Image1.Parent.ScaleWidth, Image1.Parent.ScaleHeight」では、50%縮小 (0.5倍に拡大) します。また、「.PaintPicture Image1.Picture, Image1.Picture.Width, Image1.Picture.Height, -Image1.Picture.Width, -Image1.Picture.Height」で、Image1 の画像を 180 度回転させ Picture1 にコピーします。

上記 (リスト3) を実装し、[変形]メニューの[拡大]の[200%]を選択すると、Image1 の 2 倍に拡大し Picture1 に表示されます (図2)。

 Cc440874.Image_fig02(ja-jp,MSDN.10).gif
 図2

[変形]メニューの[回転]を選択すると、図3 のように Image1 の画像が 180 度に回転表示されます。

 Cc440874.Image_fig03(ja-jp,MSDN.10).gif
 図3

今回、画像の回転に PaintPicture 関数を使いましたが、 Win32API の GetPixel 関数と SetPixel 関数を使用することで、より細かな角度で表示することができます。

一方、Visual Basic .NET で、画像を拡大・縮小する場合は、表示する PictureBox のサイズを変更し、SizeMode プロパティで画像を PictureBox のサイズに合わせて表示するように設定します。また、画像を回転する場合は、Image.RotateFlip メソッドを使用し、回転または反転のタイプを指定します。Visual Basic .NET での実装コードは以下のとおりです。

Private Sub MenuExpansion200_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuExpansion200.Click
PictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage
PictureBox2.Size = New Size(PictureBox1.Size.Width * 2, PictureBox1.Size.Height * 2)
End Sub

Private Sub MenuExpansion50_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuExpansion50.Click
PictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage
PictureBox2.Size = New Size(PictureBox1.Size.Width * 0.5, PictureBox1.Size.Height * 0.5)
End Sub

Private Sub menuRotate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menuRotate.Click
PictureBox2.Image.RotateFlip(RotateFlipType.Rotate180FlipNone)
PictureBox2.Image = PictureBox2.Image
End Sub

リスト4

リスト4 の「PictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage 」で PictureBox2 のサイズに合わせて画像を表示します。そして、「PictureBox2.Size = New Size(PictureBox1.Size.Width * 2, PictureBox1.Size.Height * 2)」で、PictureBox2 のサイズを 200% (2 倍) に拡大表示します。「PictureBox2.Size = New Size(PictureBox1.Size.Width * 0.5, PictureBox1.Size.Height * 0.5)」で PictureBox2 のサイズを 50% 縮小 (0.5 倍に拡大) 表示します。また、「PictureBox2.Image.RotateFlip(RotateFlipType.Rotate180FlipNone)」で、PictureBox2 に表示されている画像を 180度回転します。
上記を実装し、[変形]メニューの[拡大]の[200%]を選択すると、図4 のように表示されます。

 Cc440874.Image_fig04(ja-jp,MSDN.10).gif
 図4

また、[変形]メニューの[回転]を選択すると図5 のように PictureBox2 の画像が 180 度回転されます。

 Cc440874.Image_fig05(ja-jp,MSDN.10).gif
 図5