玄関へお回り下さい。
マウスのドラッグで範囲を選択し画像を取得してPictureBox2 に表示   (SNo.095)

1.マウスのドラッグで選択範囲の四角形を描く
2.選択範囲内の画像を取得して他の PictureBox にファイルに保存できるように表示
使用コントロール Button1  PictureBox1  PictureBox2
その他条件 WindowsXP(Vista) Visual Basic 2005(VB2008)
 
★ マウスのドラッグで範囲を選択し画像を取得して他のピクチャーボックスに表示

 
Private Sub Form1_Load(ByVal sender As System.Object, _
                       ByVal e As System.EventArgs) Handles MyBase.Load
    '画像ファイルを読み込みPictureBoxに表示
    PictureBox1.Image = System.Drawing.Image.FromFile("..\..\test.bmp")
End Sub

Private sPos As MouseEventArgs  'マウスのドラッグの開始点
Private ePos As MouseEventArgs  'マウスのドラッグの終了点

Private Sub PictureBox1_MouseDown(ByVal sender As ObjectByVal e As _
            System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
    If e.Button = MouseButtons.Left Then
        '開始点の取得
        sPos = e
        ePos = e
    End If
End Sub


Private Sub PictureBox1_MouseMove(ByVal sender As ObjectByVal e As _
            System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
    'マウスのドラッグで線を引く
    If e.Button = MouseButtons.Left Then
        Dim g As Graphics = PictureBox1.CreateGraphics()
        Dim BPen As New Pen(Color.Black, 1)
        BPen.DashStyle = Drawing2D.DashStyle.Dash
        '描いたの一旦消す(VB6.0の XorPen の代り)   # ここがこのサンプルのミソ
        PictureBox1.Refresh()
        '消える描画でドラッグ中の四角形を描く
        g.DrawRectangle(BPen, sPos.X, sPos.Y, ePos.X - sPos.X, ePos.Y - sPos.Y)
        ePos = e    'マウスポインターの移動終了点を取得
        g.Dispose()
    End If
End Sub


Private Sub PictureBox1_MouseUp(ByVal sender As ObjectByVal e As _
                System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
    If e.Button = MouseButtons.Left Then
        PictureBox1.Refresh()   '最後の四角形を削除
        Dim g As Graphics = PictureBox1.CreateGraphics()
        Dim BPen As New Pen(Color.Black, 1)
        BPen.DashStyle = Drawing2D.DashStyle.Dash
        '範囲確定の四角形を描く
        g.DrawRectangle(BPen, sPos.X, sPos.Y, ePos.X - sPos.X, ePos.Y - sPos.Y)
        g.Dispose()

'-------------- 指定範囲の画像取得部分 -----------------
        '四角形の範囲の画像を取得
        Dim rect As New Rectangle(sPos.X, sPos.Y, ePos.X - sPos.X, ePos.Y - sPos.Y)
        '選択範囲が異常の場合表示処理をしない
        If (ePos.X - sPos.X) < 2 Or (ePos.Y - sPos.Y) < 2 Then
            Exit Sub
        End If
        'PictureBox2 のサイズを切り取った画像のサイズに合せる
        Dim g2 As Graphics
        'コピー元の PictureBox を指定の事 
        Dim bmp As Bitmap = New Bitmap(PictureBox1.Image)
        With PictureBox2
            .Image = New Bitmap(ePos.X - sPos.X, ePos.Y - sPos.Y)
            .SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize
            g2 = Graphics.FromImage(.Image)
        End With

        '取得した画像を PictureBox2 に表示
        g2.DrawImage(bmp, 0, 0, rect, GraphicsUnit.Pixel)
        bmp.Dispose()
        g2.Dispose()
    End If
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button1.Click
'PictureBox2 の画像をファイルに保存
    'PictureBoxになにも表示していないと保存時エラーとなるのでチェック
    With PictureBox2
        If Not (.Image Is NothingThen
            .Image.Save("..\test09.bmp", Imaging.ImageFormat.Jpeg)
        End If
    End With
End Sub
 
 マウスのドラッグで選択範囲を描いてマウスを離した状態の実行図
 

 次のマウスダウンで四角形は消えます。再度取得した時点で PictureBox2 の画像が入れ替わります。
勿論、取得した画像は、エラーが発生する事無く、保存できます。
尚、上記コードを試される場合は、必ずそのまま状態で試して動作確認後に改造するなり、変更するようにして下さい。
色々変更を加えてから動作がおかしいとかのメールや質問を頂いてもお答えする事はできません。





2006/07/01


VBレスキュー(花ちゃん)
VB.NET2003  VB2005