VBNETプリクラ

【画面構成】

 以下のように配置する。(OpenFileDialogなどの貼り付けも忘れないように!)

 

【画像を扱うクラス(オブジェクト)とプリクラの考え方】

画像を扱うときに次の3つのクラス(オブジェクト)があり,

イメージを表示・保存する imageクラス →「画用紙」

点画(ドット)として画像を扱うbitmapクラス →「ルーペや針道具」

線や丸を描いたりするGraphicクラス →「定規やコンパス道具」

と,各々の役割が違う。また,画像を表示する「額」としてPictureBoxがあり,初心者にはわかりにくい状況となっている。

 このプログラムでは,画像に最終保存場所としてimageを軸に,必要なときにbitmapGraphicsを使っている。

このプリクラプログラムは,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