PictureBoxでImageの取得方法は?

解決


初心者です  2004-04-28 09:52:43  No: 83189  IP: [192.*.*.*]

VB.netからVC++で作ってあるDLLに、PictureBoxのHandleをわたして、VC++で作図させたのですが、VB側でPictureBoxから図を取得しようとしても、どうやって取得いたら良いのか分かりません。ご存知の方いらっしゃいましたら教えてください。

ちなみにプログラムはこんな感じです。

Private Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hWnd As Integer) As Integer

が宣言されていて、
描画させたいVBの関数で、

Dim hDC As Integer
hDC = GetDC(PictureBox1.Handle.ToInt32)
Call Draw(hDC, width, height, Color)

として、VC++の関数(Draw)にPictureBox1のハンドルと、サイズと色を指定して図を描いています。

この、PictureBox1からVB側で図を取り出したいのですが・・・。

よろしくお願いします。

編集 削除
ねろ  2004-04-28 14:26:32  No: 83190  IP: [192.*.*.*]

"取得"とか"取り出す"とはファイルにSaveすると言うことですか?

編集 削除
初心者です  2004-04-28 15:03:03  No: 83191  IP: [192.*.*.*]

>"取得"とか"取り出す"とはファイルにSaveすると言うことですか?
はい。その通りです。
また、Bitmap等の変数に格納して保持しておきたいと思っています。

編集 削除
ねろ  2004-04-28 16:00:38  No: 83192  IP: [192.*.*.*]

SavePicture Picture1.Image ,"XXXXX.bmp"
こんなので。

編集 削除
初心者です  2004-04-28 17:01:54  No: 83193  IP: [192.*.*.*]

>SavePicture Picture1.Image ,"XXXXX.bmp"

すみません。使用方法がよくわからないので、もう少しやさしく教えて頂けると助かります。
よろしくお願い致します。

編集 削除
初心者です  2004-04-28 18:33:04  No: 83194  IP: [192.*.*.*]

SavePicture関数について調べてみたのですが、VB6.0ではあったようですが、
VB.NETではなくなっているように思われるのですが。
他に良い方法がありましたら教えてください。よろしくお願い致します。

編集 削除
うにぃ  2004-04-28 18:45:54  No: 83195  IP: [192.*.*.*]

System.Drawing.ImageクラスのSaveメソッドを使用すればできると思います
ImageオブジェクトはPictureBox.Imageプロパティで取得できます。

詳しくはMSDNライブラリなどを参照してください。

編集 削除
ねろ  2004-04-28 21:30:03  No: 83196  IP: [192.*.*.*]

VB.NETでしたね。
書き込みは
PictureBox1.Image.Save("xxxx.bmp")
イメージの取得は
Dim img as Image
img=PictureBox1.Image
こんなことに。

編集 削除
初心者です  2004-05-06 10:51:35  No: 83197  IP: [192.*.*.*]

アドバイスありがとうございます。しかし、どうも上手くいきません。
プログラムのイメージとしては「http://anetm.com/dev/tools/vbdotnet/112243.htm」のような作りになっています。
このプログラムのButton1_Clickイベントの最後にPictureBox1.Image.Save("xxxx.bmp")
でBitMapを保存しようとしてもエラーになるのですがどのようにすれば保存できるでしょうか?

アドバイスよろしくお願いいたします。

*上記プログラムはWebから画像を取得していますが、私の場合はVC++で画像を描いているため、あくまでもPictureBoxから画像を取得しなければなりません。

編集 削除
うにぃ  2004-05-06 11:12:57  No: 83198  IP: [192.*.*.*]

ファイル名の部分をフルパスで指定してもダメでしたでしょうか?

編集 削除
初心者です  2004-05-06 11:16:52  No: 83199  IP: [192.*.*.*]

ダメでした。

ちなみに表示されたエラーメッセージは以下の通りです。

'System.NullReferenceException' のハンドルされていない例外が WindowsApplication1.exe で発生しました。

追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。


引続きアドバイスよろしくお願い致します。

編集 削除
いちゆ  2004-05-06 11:31:09  No: 83200  IP: [192.*.*.*]

まぁ、エラーメッセージからみて参照してないオブジェクト変数を使ったのはわかるが。
どんなコードなのかさっぱりだが?

編集 削除
初心者です  2004-05-06 11:35:20  No: 83201  IP: [192.*.*.*]

2004/05/06(木) 10:51:35  のメッセージを実行しただけなのですが・・・。

ちなみに保存するファイル名はフルパスで指定しています。

編集 削除
いちゆ  2004-05-06 11:46:19  No: 83202  IP: [192.*.*.*]

それでそういうエラーなら、PictureBox1かPictureBox1.Imageが非参照状態なんじゃないか?
手元にVB.Netがないからわからんが、調べて見るといいな。

編集 削除
nero  2004-05-06 14:03:39  No: 83203  IP: [192.*.*.*]

プログラムのデバッグの基本として、エラーの原因が判らなかったら
なるべく簡単なコードで実験してみたらいかがでしょうか。 
    もう一つPictureBoxを作っておいて
    PictureBox1.Image = Image.FromFile("c:\winnt\シャボン.bmp")
    PictureBox2.Image = PictureBox1.Image    'Imageが正しく出来ているか       
    PictureBox1.Image.Save("c:\test.bmp")    '正しく書き込めるか
  
こんなことをやってみるとImageが正しく出来ているか、
書き込みが正しく出来るか判断できると思いますが。

編集 削除
ねろ  2004-05-06 14:08:05  No: 83204  IP: [192.*.*.*]

途中で送っちゃった、しかも自分の名前間違えて。(^^;

編集 削除
初心者です  2004-05-06 14:31:36  No: 83205  IP: [192.*.*.*]

上記のneroさんのようにPictureBoxのImageプロパティにセットしたものについては表示及び保存が可能なのですが、「初心者です 2004/05/06(木) 10:51:35」にあるURLのプログラムのようにGraphicsオブジェクトのDrawImageでPictureBoxに描画したものに対してはどうも上手くいかないようです。

編集 削除
ねろ  2004-05-06 18:19:20  No: 83206  IP: [192.*.*.*]

質問者さんの提示されたコードはエンドレスで画像がぐるぐる回る
コードで何処にSaveを入れたのか判りませんが、(なんとなく横着の匂いが)
とりあえず、
  Do 
  Exit Do
  System.Windows.Forms.Application.DoEvents()
  Loop

の4行をコメントアウトして
Private Sub Button1_Click 
の最後に
MyBitmap2.Save("C:\test.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
か又は
PictureBox1.Image = MyBitmap2
PictureBox1.Image.Save("C:\test.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
こんなコードを入れるとSave出来ると思いますが。
下の場合は  System.Windows.Forms.Application.DoEvents()のコメントアウトはいらないかな。

要するに
PictureBoxに書かれたものと、PictureBox1.Imageとは関係が無いということで。

編集 削除
初心者です  2004-05-10 12:40:35  No: 83207  IP: [192.*.*.*]

アドバイスを頂いた方々ありがとうございます。

>要するに
>PictureBoxに書かれたものと、PictureBox1.Imageとは関係が無いということで。
上記について調べてみたところ、「http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html」に紹介されておりました。

上記URLを参考に以下のようなコードで解決することが出来ました。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  ' PictureBoxのImageプロパティにBitmapオブジェクトを設定。
  Dim bmp As Bitmap = New Bitmap(PictureBox1のサイズ)
  PictureBox1.Image = bmp
  ' Bitmapオブジェクトに描画。
  Dim g As Graphics = Graphics.FromImage(bmp)
  Dim hdc As IntPtr = g.GetHdc()
  Call DrawBitMap (hdc.ToInt32, PictureBox1.Width, PictureBox1.Heght)
  ...
  g.ReleaseHdc(hdc) '必ずReleaseする
End Sub

また、上記のやり方だと画面のPaintイベント受信時に再描画処理をする必要もありませんでした。

編集 削除