VBNETプリクラ
【画面構成】
以下のように配置する。(OpenFileDialogなどの貼り付けも忘れないように!)

【画像を扱うクラス(オブジェクト)とプリクラの考え方】
画像を扱うときに次の3つのクラス(オブジェクト)があり,
イメージを表示・保存する imageクラス →「画用紙」
点画(ドット)として画像を扱うbitmapクラス →「ルーペや針道具」
線や丸を描いたりするGraphicクラス →「定規やコンパス道具」
と,各々の役割が違う。また,画像を表示する「額」としてPictureBoxがあり,初心者にはわかりにくい状況となっている。
このプログラムでは,画像に最終保存場所としてimageを軸に,必要なときにbitmapやGraphicsを使っている。
このプリクラプログラムは,2枚の画像から1枚の画像へ合成し,印刷する。

+
【コード】<<ダウンロード>>
|
Public
Class Form1 Inherits
System.Windows.Forms.Form Windows フォーム デザイナで生成されたコード '変数やオブジェクトのひな形を準備 Dim
img1, img2, img3 As Image Dim
bmp1, bmp2, bmp3 As Bitmap Dim
g1, g2, g3 As Graphics Dim
b As Brush Private
Sub Form1_Load(ByVal
sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load '画用紙(透明)の準備 img1
= New Bitmap(PictureBox1.Width,
PictureBox1.Height)
img2 = New Bitmap(PictureBox2.Width,
PictureBox2.Height)
img3 = New Bitmap(PictureBox3.Width,
PictureBox3.Height) '画用紙をビットマップとして使用する準備
bmp1 = img1 : bmp2 = img2 : bmp3 = img3 'お絵かき道具(DrawLineなどの)の準備
g1 = Graphics.FromImage(img1) : g2 = Graphics.FromImage(img2) : g3 =
Graphics.FromImage(img3) 'ブラシの準備
p1 = New Pen(co1, pw) b
= Brushes.White '額縁(Picturebox)に画用紙を貼り付ける
PictureBox1.Image = img1 : PictureBox2.Image = img2 :
PictureBox3.Image = img3 '画用紙が透明(黒)では嫌なので,白で塗りつぶす。
g1.FillRectangle(b, 0, 0, PictureBox1.Width, PictureBox1.Height)
g2.FillRectangle(b, 0, 0, PictureBox2.Width, PictureBox2.Height)
g3.FillRectangle(b, 0, 0, PictureBox3.Width, PictureBox3.Height) End
Sub Private
Sub Button1_Click(ByVal
sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click Dim i, j As Integer Dim c As Color '合成後のピクチャーボックスの大きさまで,i,jを変化させる。 For i = 0 To
PictureBox3.Height - 1
For j = 0 To
PictureBox3.Width - 1
'枠画像の座標(j,i)の色を取得
c = bmp2.GetPixel(j, i)
'もし,枠画像の座標(j,i)の色が白(不透明度255,赤255,緑255,青255)だったら,
If c.Equals(Color.FromArgb(255, 255,
255, 255)) Then
'写真画像の座標(j,i)の色を取得してセット
c = bmp1.GetPixel(j, i)
End If
'合成画像枠に点を打つ
bmp3.SetPixel(j, i, c)
Next Next 'PictureBoxを再描画する
PictureBox1.Invalidate() : PictureBox2.Invalidate() :
PictureBox3.Invalidate() End
Sub 'メニューアイテム4ハンドルだけでなく,ピクチャボックス1クリックハンドルも追加する Private
Sub MenuItem2_Click(ByVal
sender As System.Object, ByVal e As
System.EventArgs) Handles _ MenuItem2.Click, PictureBox1.Click Dim ret As
DialogResult '写真画像の読み込み エラー処理はしていないので必ず画像ファイルを指定すること
ret = OpenFileDialog1.ShowDialog() If ret = DialogResult.OK Then
'画像の大きさを合わせて画像を表示する
PictureBox1.Image.FromFile(OpenFileDialog1.FileName)はダメ
bmp1 = New
Bitmap(OpenFileDialog1.FileName)
g1.DrawImage(bmp1, 0, 0, PictureBox1.Width, PictureBox1.Height)
bmp1 = PictureBox1.Image
'PictureBoxを再描画する
PictureBox1.Invalidate() End If End
Sub 'メニューアイテム4ハンドルだけでなく,ピクチャボックス2クリックハンドルも追加する Private
Sub MenuItem3_Click(ByVal
sender As System.Object, ByVal e As
System.EventArgs) Handles _ MenuItem3.Click, PictureBox2.Click Dim ret As
DialogResult '枠の画像の読み込み
ret = OpenFileDialog1.ShowDialog() If ret = DialogResult.OK Then
'画像の大きさを合わせて画像を表示する
PictureBox2.Image.FromFile(OpenFileDialog1.FileName)はダメ
bmp2 = New
Bitmap(OpenFileDialog1.FileName)
g2.DrawImage(bmp2, 0, 0, PictureBox2.Width, PictureBox2.Height)
bmp2 = PictureBox2.Image
'PictureBoxを再描画する
PictureBox2.Invalidate() End If End
Sub 'メニューアイテム4ハンドルだけでなく,ピクチャボックス3クリックハンドルも追加する Private
Sub MenuItem4_Click(ByVal
sender As System.Object, ByVal e As
System.EventArgs) Handles _ MenuItem4.Click,
PictureBox3.Click Dim ret As
DialogResult '画像の保存(jpeg形式)
ret = SaveFileDialog1.ShowDialog() If ret = DialogResult.OK Then
PictureBox3.Image.Save(SaveFileDialog1.FileName,
Imaging.ImageFormat.Jpeg) End If End
Sub 'メニューアイテム5ハンドルだけでなく,ボタン2クリックハンドルも追加する Private
Sub MenuItem5_Click(ByVal
sender As System.Object, ByVal e As
System.EventArgs) Handles _ MenuItem5.Click,
Button2.Click 'PrintDocumentオブジェクトの作成 Dim pd As New System.Drawing.Printing.PrintDocument 'PrintPageイベントハンドラの追加 AddHandler pd.PrintPage, AddressOf
pd_PrintPage 'PrintDocumentを指定
PrintDialog1.Document = pd '印刷の選択ダイアログを表示する If PrintDialog1.ShowDialog() = DialogResult.OK Then
'OKがクリックされた時は印刷する
pd.Print() End If End
Sub Private
Sub pd_PrintPage(ByVal
sender As Object,
ByVal e As System.Drawing.Printing.PrintPageEventArgs) Dim i, j As Integer '横に4枚分,縦に8枚分 For i = 0 To 7
For j = 0 To
3
'画像を描画する
e.Graphics.DrawImage(img3, j * (PictureBox3.Width + 20), i * (PictureBox3.Height
+ 20))
Next Next '次のページがないことを通知する
e.HasMorePages = False End
Sub Private
Sub MenuItem6_Click(ByVal
sender As System.Object, ByVal e As
System.EventArgs) Handles MenuItem6.Click 'アプリケーションの終了
Application.Exit() End
Sub End Class |