PictureBoxの画像を塗りつぶすには?

解決


Takeru  2006-12-19 06:55:16  No: 134654

お世話になります。Takeruと申します。

[VB.NET]でPictureBoxの画像をAPIのextfloodfillを使用して、塗りつぶし、その画像をBMPとして保存しようとしています。

しかし、下記のソースで実行したところ、
extfloodfill実行後は塗りつぶされているのですが(見た目だけ)、
再描画された際に塗りつぶされていない状態に戻ってしまいます。
ですので、保存されたBMPも塗りつぶされていない状態で保存されています。

-----------------------------------------------------------------------------------------------------------------
'API宣言
Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Integer) As Integer
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Integer, ByVal hObject As Integer) As Integer
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Integer) As Integer
Private Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Integer) As Integer
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Integer, ByVal X As Integer, ByVal Y As Integer) As Integer
Private Declare Function ExtFloodFill Lib "gdi32" (ByVal hdc As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal crColor As Integer, ByVal wFillType As Integer) As Integer
Private Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hwnd As System.IntPtr) As System.IntPtr
Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Integer, ByVal hDC As Integer) As Integer
Private Const FLOODFILLSURFACE As Short = 1

Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    '画像の取得
    Dim bmp As Bitmap = New Bitmap("c:\test.bmp")
    PictureBox1.Image = bmp

    Dim hBlackBrush As Integer = CreateSolidBrush(RGB(0, 0, 0))
    Dim g As Graphics
    g = Graphics.FromImage(PictureBox1.Image)
    Dim hdc As IntPtr = GetDC(PictureBox1.Handle)
    Dim rc As IntPtr = SelectObject(hdc, hBlackBrush)

    '塗りつぶし
    Dim color As Integer
    color = GetPixel(hdc, 60, 60)
    call ExtFloodFill(hdc, 60, 60, color, FLOODFILLSURFACE)

    PictureBox1.Image.Save("c:\test1.bmp", System.Drawing.Imaging.ImageFormat.Bmp)

    'PictureBoxを再描画する
    PictureBox1.Refresh()
End Sub
-----------------------------------------------------------------------------------------------------------------

塗りつぶしたい領域は図形ではないので、
GraphicsオブジェクトのFillRectangleメソッドなどでは
塗りつぶすことができません。

アドバイスをいただきたいと思います。
宜しくお願いいたします。


VBレスキュー(花ちゃん)  2006-12-20 22:18:54  No: 134655

下記のような感じにできればいいのでしょうか?
http://hanatyan.sakura.ne.jp/samplepic/vb8_194.htm

私も色々試したのですが、多分、それでは継続的な描画ができないかと思います。
塗りつぶした後、その画像をPictureBox にコピーしてやればできますが。


Takeru  2006-12-21 10:44:28  No: 134656

そんなかんじです。
私の力ではどうにもならないので、有料サンプルを買わせていただきます。


Takeru  2007-01-03 04:56:09  No: 134657

VBレスキュー(花ちゃん)さんへ。
有料サンプル、参考にさせていただきました。
が、「画面に表示されている画像しか保存できない」などの問題があり
私の実現しようとしている物には生かせませんでした。
アルゴリズムを使って手動で塗りつぶす方法で実現しようと思います。
ありがとうございました


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加