VB.NETでPictureBoxへの描画について
PictureBoxに画像を表示し、余白部分を含めて、マウスで描画できる処理を作成しているのですが、
どうも上手くいかない為、皆さんの知恵をお借りしたいと思い質問させて頂きました。
まず、880×560のPictureBoxを用意し、その中に、600×480の画像を埋め込んでいます。
そのPictureBoxの中で、画像以外の部分(余白)にもマウスで線等を書きたいのです。
画像のみに描く場合は上手くいくのですが、余白を含めると上手くいかなくなってしまい、
困っております。
プログラムの違いは以下の箇所のみです。2の場合は上手くいきます。
1.PictureBox全体に描画する(画像も含め)
Dim g As Graphics = PictureBox1.CreateGraphics
2.画像のみに描画する
Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)
ちなみに、マウスではなく、ボタンクリック時に描画した時は、1の場合でも上手くいきます。
お手数ですが、ご回答の程、よろしくお願いします。
No.1
- 回答日時:
おそらくPictureBox のデバイスコンテキストに上手くかけたとしても、マウントされたイメージは問答無用で一から描画されるために上書きされてしまうのかと。
私ならPicutreBox いっぱいの空のビットマップを用意し、そこに画像と線を描画します。
2bypi8921cfrさん
ご回答ありがとうございます。
>PicutreBox いっぱいの空のビットマップを用意し
というのは、PicutreBoxのImageか、BackgroundImageにセットする
ということでしょうか?
一応、白のビットマップを用意して、セットしてみましたが上手くできませんでした。
No.2ベストアンサー
- 回答日時:
余白を含めると上手くいかなくなってしまい という事は、どのような状態の事なのでしょうか?
その辺の事を詳しく書いて頂かないと答えようがないかと。
(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
この回答への補足
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()
No.3
- 回答日時:
マウスイベント時に描いても、PictureBox の再描画(OnDraw())時には描かれませんから、いつ消えても(それこそ描画直後に消える事も)あるわけです。
私がビットマップに描けといったのは、それに対するバッファリングの意味合いがございました。
さらにがんばってみてください!!
No.4
- 回答日時:
申し訳ないのですが、何がしたいのか? どこが解らないのかが、私には判断できません。
答えても、言葉足らずで申し訳ありませんでしたと言う事になるかと。
四角の赤枠を描画したいのか?
四角の赤枠内の画像を取得したいのか(その時赤枠は非表示 or 表示)
初めの質問は、画像以外のピクチャーボックスにマウスのドラッグで線を描画したいとの事
だったので、そのものズバリのサンプルを書いたのですが。
質問される場合は、質問内容に 5W1H を入れるようにして箇条書き等で書くようにしないと
これを見ている人には中々伝わりません。
こう言った掲示板でやり取りする場合は、2~3回のやり取りで解決するように事前に下調べ等
をしてから、ピンポイント質問するようにしないと何から何まで教えて下さいでは、話も進みません。
下記等を参考に本当に何をしたいのか? 何を知りたいのかを再投稿するようにして見て下さい。
http://www.hyuki.com/writing/techask.html
ご回答ありがとうございます。
自分の中ではやりたいことが分かっていても、上手く内容が記載できていなかったです。
申し訳ありませんでした。
今まで、ご回答頂いた、内容で再度チャレンジしてみて、
もしできなかったら、参考URLを確認して、再度投稿したいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 美術・アート ペンタブとオフィス系ソフト 1 2022/10/08 19:27
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Illustrator(イラストレーター) ワードに貼った画像のキャンバスと画像本体のサイズの調整 2 2022/05/19 18:31
- HTML・CSS トリミングで表示した画像をクリックで元どおりにしたい 3 2022/12/16 18:49
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- Windows 8 Route Generator の使い方 1 2023/05/03 00:36
- Illustrator(イラストレーター) 「頂点で線分を伸ばす」作業がうまく行かない。 1 2022/09/09 10:19
- マンガ・コミック 漫画の練習方について 1 2022/06/06 19:26
- デザイン 画像のようなラフなクロッキーを描くにはどの様な手順で描けばよいでしょうか? 色々調べましたがいまだに 2 2023/08/12 02:05
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
VB.NET フォーム上に描いたグラフィックのクリア方法
Visual Basic(VBA)
-
ピクチャボックスの座標取得
Visual Basic(VBA)
-
ピクチャーボックスに点を打つ .NET
Visual Basic(VBA)
-
-
4
コモンダイアログコントロールがコンポーネントにありません
Visual Basic(VBA)
-
5
Loadイベント中にほかのイベントを発生したくない
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[VB.net] DataGridViewの列ヘッ...
-
PCで「使用可能な場合はグラフ...
-
VB6,リストボックスの特定行の...
-
多角形の描画。(VC++)
-
C++にて、塗りつぶされた円を描...
-
UpdateData( FALSE); による文...
-
word
-
WM_SIZEとWM_SIZINGの違い (Win...
-
ちらつきを何とかしたい
-
CScrollViewの使用方法について
-
タブコントロール上のピクチャ...
-
MFCのタイマーのつかい方を教え...
-
VBAにGDI+を参照させる方法
-
VB.netでのライン描画方法がわ...
-
MFCタブコントロールのグラデー...
-
NVIDIAのシェーダーキャッシュ
-
アプリケーションのデザイン
-
ビューにビットマップファイル...
-
c++ ダブルバッファリング、以...
-
ペーパーマリオみたいにドット...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
TextBoxに文字を書いても表示さ...
-
word
-
UpdateData( FALSE); による文...
-
VC++プログラムをつかったBMP画...
-
InvalidateRectの使い方について
-
StretchBlt関数について
-
OneNote 2010 文字と描画がずれる
-
C# ラバーバンドの描画を快適に...
-
エクセルでガンチャートを作成...
-
C++にて、塗りつぶされた円を描...
-
VBAにGDI+を参照させる方法
-
MFC DrawText 背景色とフォント
-
GDI+で高速な描画
-
MFCのタイマーのつかい方を教え...
-
Labelの文字をスクロールする際...
-
FlexGridの一部のみ表示を更新...
おすすめ情報