アプリ版:「スタンプのみでお礼する」機能のリリースについて

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の場合でも上手くいきます。
お手数ですが、ご回答の程、よろしくお願いします。

A 回答 (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

この回答への補足

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()

補足日時:2010/07/29 11:48
    • good
    • 0

申し訳ないのですが、何がしたいのか? どこが解らないのかが、私には判断できません。


答えても、言葉足らずで申し訳ありませんでしたと言う事になるかと。

四角の赤枠を描画したいのか?
四角の赤枠内の画像を取得したいのか(その時赤枠は非表示 or 表示)
初めの質問は、画像以外のピクチャーボックスにマウスのドラッグで線を描画したいとの事
だったので、そのものズバリのサンプルを書いたのですが。

質問される場合は、質問内容に 5W1H を入れるようにして箇条書き等で書くようにしないと
これを見ている人には中々伝わりません。

こう言った掲示板でやり取りする場合は、2~3回のやり取りで解決するように事前に下調べ等
をしてから、ピンポイント質問するようにしないと何から何まで教えて下さいでは、話も進みません。

下記等を参考に本当に何をしたいのか? 何を知りたいのかを再投稿するようにして見て下さい。
http://www.hyuki.com/writing/techask.html
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。


自分の中ではやりたいことが分かっていても、上手く内容が記載できていなかったです。
申し訳ありませんでした。

今まで、ご回答頂いた、内容で再度チャレンジしてみて、
もしできなかったら、参考URLを確認して、再度投稿したいと思います。

お礼日時:2010/07/30 10:53

マウスイベント時に描いても、PictureBox の再描画(OnDraw())時には描かれませんから、いつ消えても(それこそ描画直後に消える事も)あるわけです。



私がビットマップに描けといったのは、それに対するバッファリングの意味合いがございました。

さらにがんばってみてください!!
    • good
    • 0

おそらくPictureBox のデバイスコンテキストに上手くかけたとしても、マウントされたイメージは問答無用で一から描画されるために上書きされてしまうのかと。



私ならPicutreBox いっぱいの空のビットマップを用意し、そこに画像と線を描画します。
    • good
    • 0
この回答へのお礼

2bypi8921cfrさん

ご回答ありがとうございます。

>PicutreBox いっぱいの空のビットマップを用意し
というのは、PicutreBoxのImageか、BackgroundImageにセットする
ということでしょうか?
一応、白のビットマップを用意して、セットしてみましたが上手くできませんでした。

お礼日時:2010/07/28 19:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています