- ベストアンサー
VB.NETでPictureBoxへの描画について
- VB.NETでPictureBoxへの描画についての質問です。画像を表示し、余白部分を含めてマウスで描画する処理を作成していますが、うまくいかない状況です。プログラムの違いによって結果が変わるようで、具体的にどのように修正すればいいかわかりません。
- VB.NETでPictureBoxへの描画についての質問です。画像のみに描画する場合はうまくいくのですが、画像以外の部分(余白)も描画したいと思っています。しかし、余白を含めると上手くいかなくなってしまい、困っています。マウスではなくボタンクリック時に描画する場合は問題がないようです。どのようにすればうまくいくかお教えください。
- VB.NETでPictureBoxへの描画についての質問です。PictureBox全体に描画する場合と、画像のみに描画する場合で結果が異なるようですが、具体的な原因がわかりません。余白も含めて描画したい場合、どのように修正すればいいか教えていただきたいです。お手数ですが、ご回答よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
余白を含めると上手くいかなくなってしまい という事は、どのような状態の事なのでしょうか? その辺の事を詳しく書いて頂かないと答えようがないかと。 (VB.NET だけでは、詳しい環境が解りません、質問される場合は、環境等も含め詳しく書くように して下さい。) 詳しい状況が解らないので、一度、下記コードを試して見て下さい。 Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load With PictureBox1 .Width = 880 .Height = 560 .Image = New Bitmap(.Size.Width, .Size.Height) End With Using g As Graphics = Graphics.FromImage(PictureBox1.Image) g.Clear(PictureBox1.BackColor) '表示する画像のフルパスを指定して下さい。 Using bmap As Bitmap = New Bitmap("..\..\..\test.jpg") g.DrawImage(bmap, 0, 0, bmap.Width, bmap.Height) End Using End Using End Sub Private Spos As MouseEventArgs Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As _ System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove 'マウスのドラッグで線を引く If e.Button = System.Windows.Forms.MouseButtons.Left Then PictureBox1.Image = PictureBox1.Image Using g As Graphics = Graphics.FromImage(PictureBox1.Image) Using BPen As New Pen(Color.Red, 5) g.DrawLine(BPen, Spos.X, Spos.Y, e.X, e.Y) End Using Spos = e End Using End If End Sub Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As _ System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown '描画開始位置 If e.Button = System.Windows.Forms.MouseButtons.Left Then Spos = e End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click '保存処理 With PictureBox1 If Not (.Image Is Nothing) Then .Image.Save("test.bmp", Imaging.ImageFormat.Bmp) End If End With End Sub End Class
その他の回答 (3)
- vbhanatyan
- ベストアンサー率79% (70/88)
申し訳ないのですが、何がしたいのか? どこが解らないのかが、私には判断できません。 答えても、言葉足らずで申し訳ありませんでしたと言う事になるかと。 四角の赤枠を描画したいのか? 四角の赤枠内の画像を取得したいのか(その時赤枠は非表示 or 表示) 初めの質問は、画像以外のピクチャーボックスにマウスのドラッグで線を描画したいとの事 だったので、そのものズバリのサンプルを書いたのですが。 質問される場合は、質問内容に 5W1H を入れるようにして箇条書き等で書くようにしないと これを見ている人には中々伝わりません。 こう言った掲示板でやり取りする場合は、2~3回のやり取りで解決するように事前に下調べ等 をしてから、ピンポイント質問するようにしないと何から何まで教えて下さいでは、話も進みません。 下記等を参考に本当に何をしたいのか? 何を知りたいのかを再投稿するようにして見て下さい。 http://www.hyuki.com/writing/techask.html
お礼
ご回答ありがとうございます。 自分の中ではやりたいことが分かっていても、上手く内容が記載できていなかったです。 申し訳ありませんでした。 今まで、ご回答頂いた、内容で再度チャレンジしてみて、 もしできなかったら、参考URLを確認して、再度投稿したいと思います。
マウスイベント時に描いても、PictureBox の再描画(OnDraw())時には描かれませんから、いつ消えても(それこそ描画直後に消える事も)あるわけです。 私がビットマップに描けといったのは、それに対するバッファリングの意味合いがございました。 さらにがんばってみてください!!
おそらくPictureBox のデバイスコンテキストに上手くかけたとしても、マウントされたイメージは問答無用で一から描画されるために上書きされてしまうのかと。 私ならPicutreBox いっぱいの空のビットマップを用意し、そこに画像と線を描画します。
お礼
2bypi8921cfrさん ご回答ありがとうございます。 >PicutreBox いっぱいの空のビットマップを用意し というのは、PicutreBoxのImageか、BackgroundImageにセットする ということでしょうか? 一応、白のビットマップを用意して、セットしてみましたが上手くできませんでした。
補足
vbhanatyanさん ご回答ありがとうございます。 言葉足らずで申し訳ありませんでした。 環境は以下となります。 OS:Windows7 開発環境:VisualStudio2008 .netframework:3.5 余白というのは、PictureBoxのImageで表示されている部分以外のことです。 例えば、800×600のPictureBoxに500×400のImageを左上に合わせて表示した場合、 右側が300、下側が200のスペースができると思います。その部分を余白としています。 頂きましたコードを実行してみましたら上手くいきました。 自分が作成しているコードに関しても、線の描画は上手くいくのですが、四角の描画の時に ちょっと困っています。 参考URLにありました、「マウスのドラッグで範囲を選択し画像を取得してPictureBox2 に表示 」を参考にして、 画像の切り貼りではなく、マウスを移動した分の四角を描画したかったのですが、 マウスを離した時に、描画したい四角が描画されませんでした。 おそらく、PictureBoxをrefreshしている為のような気がしますが、Image部分のみを 対象にした場合に、上手くいくので、よく分からなくなってしまいました。 MouseMove時 '四角 If e.Button = MouseButtons.Left Then Dim g As Graphics = PictureBox1.CreateGraphics() Dim BPen As New Pen(Color.Black, 0.1) BPen.DashStyle = Drawing2D.DashStyle.Dash PictureBox1.Refresh() '消える描画でドラッグ中の四角形を描く g.DrawRectangle(BPen, sPos.X, sPos.Y, ePos.X - sPos.X, ePos.Y - sPos.Y) ePos = e 'マウスポインタの移動終了点を取得 g.Dispose() End If MouseUp時 PictureBox1.Refresh() Dim g As Graphics = PictureBox1.CreateGraphics 'Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) 'Penオブジェクトの作成(幅10の黒色) Dim blackPen As New Pen(Color.Black, 1) '終点に矢印をつける blackPen.EndCap = Drawing2D.LineCap.ArrowAnchor '線を描画 g.DrawRectangle(blackPen, sPos.X, sPos.Y, ePos.X - sPos.X, ePos.Y - sPos.Y) 'Graphicsを破棄する g.Dispose() 'PictureBoxを再描画する PictureBox1.Invalidate()