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側で図を取り出したいのですが・・・。
よろしくお願いします。
"取得"とか"取り出す"とはファイルにSaveすると言うことですか?
>"取得"とか"取り出す"とはファイルにSaveすると言うことですか?
はい。その通りです。
また、Bitmap等の変数に格納して保持しておきたいと思っています。
SavePicture Picture1.Image ,"XXXXX.bmp"
こんなので。
>SavePicture Picture1.Image ,"XXXXX.bmp"
すみません。使用方法がよくわからないので、もう少しやさしく教えて頂けると助かります。
よろしくお願い致します。
SavePicture関数について調べてみたのですが、VB6.0ではあったようですが、
VB.NETではなくなっているように思われるのですが。
他に良い方法がありましたら教えてください。よろしくお願い致します。
System.Drawing.ImageクラスのSaveメソッドを使用すればできると思います
ImageオブジェクトはPictureBox.Imageプロパティで取得できます。
詳しくはMSDNライブラリなどを参照してください。
VB.NETでしたね。
書き込みは
PictureBox1.Image.Save("xxxx.bmp")
イメージの取得は
Dim img as Image
img=PictureBox1.Image
こんなことに。
アドバイスありがとうございます。しかし、どうも上手くいきません。
プログラムのイメージとしては「http://anetm.com/dev/tools/vbdotnet/112243.htm」のような作りになっています。
このプログラムのButton1_Clickイベントの最後にPictureBox1.Image.Save("xxxx.bmp")
でBitMapを保存しようとしてもエラーになるのですがどのようにすれば保存できるでしょうか?
アドバイスよろしくお願いいたします。
*上記プログラムはWebから画像を取得していますが、私の場合はVC++で画像を描いているため、あくまでもPictureBoxから画像を取得しなければなりません。
ファイル名の部分をフルパスで指定してもダメでしたでしょうか?
ダメでした。
ちなみに表示されたエラーメッセージは以下の通りです。
'System.NullReferenceException' のハンドルされていない例外が WindowsApplication1.exe で発生しました。
追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。
引続きアドバイスよろしくお願い致します。
まぁ、エラーメッセージからみて参照してないオブジェクト変数を使ったのはわかるが。
どんなコードなのかさっぱりだが?
2004/05/06(木) 10:51:35 のメッセージを実行しただけなのですが・・・。
ちなみに保存するファイル名はフルパスで指定しています。
それでそういうエラーなら、PictureBox1かPictureBox1.Imageが非参照状態なんじゃないか?
手元にVB.Netがないからわからんが、調べて見るといいな。
プログラムのデバッグの基本として、エラーの原因が判らなかったら
なるべく簡単なコードで実験してみたらいかがでしょうか。
もう一つPictureBoxを作っておいて
PictureBox1.Image = Image.FromFile("c:\winnt\シャボン.bmp")
PictureBox2.Image = PictureBox1.Image 'Imageが正しく出来ているか
PictureBox1.Image.Save("c:\test.bmp") '正しく書き込めるか
こんなことをやってみるとImageが正しく出来ているか、
書き込みが正しく出来るか判断できると思いますが。
途中で送っちゃった、しかも自分の名前間違えて。(^^;
上記のneroさんのようにPictureBoxのImageプロパティにセットしたものについては表示及び保存が可能なのですが、「初心者です 2004/05/06(木) 10:51:35」にあるURLのプログラムのようにGraphicsオブジェクトのDrawImageでPictureBoxに描画したものに対してはどうも上手くいかないようです。
質問者さんの提示されたコードはエンドレスで画像がぐるぐる回る
コードで何処に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とは関係が無いということで。
アドバイスを頂いた方々ありがとうございます。
>要するに
>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イベント受信時に再描画処理をする必要もありませんでした。
ツイート | ![]() |