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.上記実行結果(何回か塗潰しを繰り返しております。) 最初は、ペイントの塗りつぶしのように、塗りつぶす色を選択できるようにしていたのですが、本来のコードの部分がわかりづらくなったので、シンプルにと赤色で塗りつぶしております。 上記コードの動作確認がとれましたら、色を選択して指定の色で塗りつぶしができるようにして見て下さい。 |
2. |
3. |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |