VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

メニューへ戻ります。 描画・画像関係のメニュー
1.直線・四角形・楕円・多角形形(星形)を描画及び消去
2.PictureBoxに文字と画像を描画してファイルに保存(エラー回避)
3.マウスのドラッグで範囲を選択し画像を取得して他のピクチャーボックスに表示
4.PictureBox に表示した画像の閉じた領域内をペイントの塗潰しのように塗潰す
5.
6.
7.
8.
9.
10.
11.
12.
 .
20.その他、当サイト内に掲載の描画・画像に関するサンプル


4.PictureBox に表示した画像の閉じた領域内をペイントの塗潰しのように塗潰す(31_Gra_04) (旧、SampleNo.377 / 194)
1.PictureBox に表示した画像の閉じた領域内をペイントの塗潰しのように塗潰す
2.
3.
4.
5.
6.

 下記プログラムコードに関する補足・注意事項 
動作確認:Windows 8.1 (Windows 7) / VB2013 (VB2010) / Framework 4.5.1 / 対象の CPU:x86
Option :[Compare Text] [Explicit On] [Infer On] [Strict On]
Imports :System.Runtime.InteropServices
参照設定:
追加なし
その他 :テスト用の日本地図の画像ファイルは右記よりダウンロードしてお使い下さい。 JapanMap.zip
    :
このサンプル等の内容を無断で転載、掲載、配布する事はお断りします。(私の修正・改訂・削除等が及ばなくなるので)
必要ならリンクをはるようにして下さい。(引用の場合は引用元のリンクを明記して下さい)
このページのトップへ移動します。 1.PictureBox に表示した画像の閉じた領域内をペイントの塗潰しのように塗潰す

Imports System.Runtime.InteropServices

Public Class Form1

#Region "本文関係の処理"

Private frgPset As Boolean

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    frgPset = True
    Button1.BackColor = Color.Yellow
End Sub

Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
    If frgPset Then
        'その2の方法での塗潰し(対象ピクチャーボックス、塗潰す領域内の位置、塗潰す色)
        '塗り潰す色の指定は、カラーダイアログ等から指定するようにして下さい。
        PaintingOut2(PictureBox1, e.Location, Color.Red)
    End If
End Sub

''' <summary>
''' 閉じた領域内をペイントの塗潰しのように塗り潰す
''' </summary>
''' <param name="myPic">画像が表示してある PictureBox </param>
''' <param name="mPos">塗り潰す領域内の座標位置 </param>
''' <param name="Pcor">塗り潰す色</param>
Private Sub PaintingOut2(ByVal myPic As PictureBox, ByVal mPos As Point, ByVal Pcor As Color)
'その2での塗潰し(詳しくは、[ExtFloodFill FromHbitmap]をキーに検索して調べてください。)
    Dim bmp As Bitmap = New Bitmap(myPic.Image)                                 'PictureBox1.Image からBitmapオブジェクトを作成
    Using g As Graphics = Graphics.FromImage(bmp)                               'Graphicsオブジェクトの作成
        Dim memhdc As IntPtr = CreateCompatibleDC(g.GetHdc())                   'メモリデバイスコンテキストを作成
        Dim hBrush As IntPtr = CreateSolidBrush(ColorTranslator.ToWin32(Pcor))  '塗りつぶしのブラシを作成
        Dim oldBrs As IntPtr = SelectObject(memhdc, hBrush)                     'ブラシをオブジェクトに設定
        Dim gdibmp As IntPtr = bmp.GetHbitmap()                                 'GDI+ Bitmap からGDIビットマップオブジェクトを作成
        Dim oldbmp As IntPtr = SelectObject(memhdc, gdibmp)                     'ブラシをオブジェクトに設定
        'カーソルの形状によっては指定の位置の補正が必要になりので
        Dim GetCol As Integer = GetPixel(memhdc, mPos.X - 0, mPos.Y + 0)        'メモリDC の指定位置のカラーを取得(カーソル分位置補正)
        ExtFloodFill(memhdc, mPos.X - 0, mPos.Y + 0, GetCol, FLOODFILLSURFACE)  '指定位置の領域内を指定のブラシの色で置き換える
        bmp = Bitmap.FromHbitmap(gdibmp)                                        'GDIビットマップオブジェクトのハンドルからBitmapを作成
        '以下、後始末  
        Dim ret As IntPtr = IntPtr.Zero
        ret = SelectObject(memhdc, oldBrs)      'ブラシを元に戻す
        ret = SelectObject(memhdc, oldbmp)      '元のビットマップを置き換え
        ret = DeleteObject(gdibmp)              'オブジェクトを削除
        ret = DeleteObject(hBrush)              'オブジェクトを削除
        ret = DeleteObject(memhdc)              'オブジェクトを削除
    End Using
    myPic.Image = New Bitmap(bmp)               'Bitmapオブジェクトを表示
    bmp.Dispose()
    frgPset = False
    Button1.BackColor = Control.DefaultBackColor

    'bmp.Save("..\..\test02.png", Imaging.ImageFormat.Png)   '保存する場合
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
'保存処理
    If Not (PictureBox1.Image Is Nothing) Then
        PictureBox1.Image.Save("test01.png", Imaging.ImageFormat.Png)
    End If
End Sub

#End Region

#Region "付帯処理関係(関数・メソッド等含む)"

'指定されたデバイスと互換性のあるメモリデバイスコンテキストを作成します
<DllImport("gdi32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function CreateCompatibleDC( _
    ByVal hdc As IntPtr) As IntPtr
End Function

'純色(ソリッドカラー)で論理ブラシを作成する(281)
<DllImport("gdi32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function CreateSolidBrush( _
    ByVal crColor As Integer) As IntPtr
End Function

'デバイスコンテキストにオブジェクトを選択する(268)
<DllImport("gdi32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function SelectObject( _
    ByVal hDC As IntPtr, _
    ByVal hObject As IntPtr) As IntPtr
End Function

'ピクセルカラー値を取得する(P489)
<DllImport("gdi32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function GetPixel( _
    ByVal hdc As IntPtr, _
    ByVal x As Integer, _
    ByVal y As Integer) As Integer
End Function

'現在選択されているブラシで一定の範囲内を塗りつぶす。(P482)
<DllImport("gdi32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function ExtFloodFill( _
    ByVal hdc As IntPtr, _
    ByVal X As Integer, _
    ByVal Y As Integer, _
    ByVal crColor As Integer, _
    ByVal wFillType As Integer) As Integer
End Function

'グラフィックオブジェクトを削除し、システムリソースを解放する(261)
<DllImport("gdi32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function DeleteObject( _
    ByVal hObject As IntPtr) As IntPtr
End Function

Private Const FLOODFILLSURFACE As Integer = 1

#End Region

#Region "起動時の処理及びWin32 API 関数の宣言及び変数の宣言"

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'画像ファイルを読み込み表示(ファイルのサイズで)
    With PictureBox1
        '表示する画像のサイズに合わせてPictureBoxを表示します
        .SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize
        '画像ファイルを読み込みPictureBoxに表示
        .Image = System.Drawing.Image.FromFile("..\..\..\data_pic\JapanMap.png")
    End With
End Sub

#End Region


End Class

 図1.上記実行結果(何回か塗潰しを繰り返しております。)
 vb2013graphics04_01
最初は、ペイントの塗りつぶしのように、塗りつぶす色を選択できるようにしていたのですが、本来のコードの部分がわかりづらくなったので、シンプルにと赤色で塗りつぶしております。
上記コードの動作確認がとれましたら、色を選択して指定の色で塗りつぶしができるようにして見て下さい。
このページのトップへ移動します。 2.


このページのトップへ移動します。 3.


このページのトップへ移動します。 4.


このページのトップへ移動します。 5.


このページのトップへ移動します。 6.


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)





このページのトップへ移動します。