C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: フリーハンド描画を保存


(過去ログ 82 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■48655 / inTopicNo.1)  フリーハンド描画を保存
  
□投稿者/ lino. (1回)-(2010/04/11(Sun) 23:34:33)

分類:[VB.NET/VB2005 以降] 

vb2008です。

pictureboxに読み込んだファイルの上にフリーハンドで線を描いて、それを保存するという、つまりペイントみたいなものを作ろうとしています。
しかし、保存しても、描いた線がその読み込んだファイルの上に上書き保存されません。画像を回転させた場合、例えばもと画像から90度回転させた場合はちゃんと90度傾いた状態で保存されるのですが、フリーハンドで描画した線だけは保存されません。一時的な描画のままのようで(だから「最小化」を押して、また出した時に、描画した線は消えている)……。
どのようにすればフリーハンドで描いた線も保存できるようになるでしょうか、教えていただけないでしょうか。



    Dim drawflg As Boolean = False 'trueなら描画中
    Dim x1 As Integer = -1, y1 As Integer


    '「開く」
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            
                Dim img As Image
                fs = New System.IO.FileStream(OpenFileDialog1.FileName, FileMode.Open, FileAccess.Read)

                PictureBox1.Image = System.Drawing.Image.FromStream(fs)
                fs.Close()
                img = PictureBox1.Image

        End If

    End Sub


    '描画開始
    Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown

            If e.Button = Windows.Forms.MouseButtons.Left Then
                x1 = e.X
                y1 = e.Y
            End If
        drawflg = True

    End Sub

    '描画中
    Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove

        Dim mypen As New Pen(Color.Black, 1) 
        Dim g1 As Graphics
        g1 = PictureBox1.CreateGraphics()

        If drawflg = True Then
                g1.DrawLine(mypen, x1, y1, e.X, e.Y)
                x1 = e.X
                y1 = e.Y
        End If

    End Sub

    '描画終了
    Private Sub PictureBox1_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp

        If drawflg = True Then
            drawflg = False
        End If

    End Sub

    '「保存」
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

            If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
                PictureBox1.Image.Save(SaveFileDialog1.FileName, Imaging.ImageFormat.Png)
            End If

    End Sub


引用返信 編集キー/
■48659 / inTopicNo.2)  Re[1]: フリーハンド描画を保存
□投稿者/ Azulean (544回)-(2010/04/12(Mon) 07:20:55)
とりあえず、こちらの記事を読んで頂いて、わからない点を再度質問して頂けないでしょうか。
http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html
引用返信 編集キー/
■48704 / inTopicNo.3)  Re[2]: フリーハンド描画を保存
□投稿者/ lino. (2回)-(2010/04/12(Mon) 21:00:15)
No48659 (Azulean さん) に返信
> とりあえず、こちらの記事を読んで頂いて、わからない点を再度質問して頂けないでしょうか。
> http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html

はい……。すみません……ありがとうございます。

 '描画中
    Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal e As 
System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove

        Dim mypen As New Pen(Color.Black, 1) 
        Dim g1 As Graphics
       
        'g1 = PictureBox1.CreateGraphics()

        With PictureBox1
            .Image = New Bitmap(PictureBox1.Image)
            g1 = Graphics.FromImage(.Image)
        End With

        If drawflg = True Then
                g1.DrawLine(mypen, x1, y1, e.X, e.Y)
                x1 = e.X
                y1 = e.Y
                g1.Dispose()
        End If

    End Sub

こうしてみました。
結果、保存できるようになりました。ありがとうございました。

解決済み
引用返信 編集キー/
■48712 / inTopicNo.4)  Re[3]: フリーハンド描画を保存
□投稿者/ Azulean (545回)-(2010/04/13(Tue) 00:07:36)
できているのかもしれないけど、ちょっと考えてほしいので解決済みを外します。

No48704 (lino. さん) に返信
> With PictureBox1
> .Image = New Bitmap(PictureBox1.Image)
> g1 = Graphics.FromImage(.Image)
> End With
このコードはどのようなことをしているか説明できますか?
少なくとも、Dispose すべきインスタンスを Dispose していなかったり、そもそも新しい Bitmap を作らないといけないのかという疑問が残ったりします。

> If drawflg = True Then
> g1.DrawLine(mypen, x1, y1, e.X, e.Y)
> x1 = e.X
> y1 = e.Y
> g1.Dispose()
> End If
drawflg は必ず True なのでしょうか?
もし、False になることがあれば、g1 は Dispose されません。
必ず True になるのであれば、そもそも If を書く必要はありません。
引用返信 編集キー/
■48727 / inTopicNo.5)  Re[4]: フリーハンド描画を保存
□投稿者/ lino. (3回)-(2010/04/13(Tue) 15:16:34)
むむむ。


> ■No48704 (lino. さん) に返信
>>        With PictureBox1
>>            .Image = New Bitmap(PictureBox1.Image)
>>            g1 = Graphics.FromImage(.Image)
>>        End With
> このコードはどのようなことをしているか説明できますか?
> 少なくとも、Dispose すべきインスタンスを Dispose していなかったり、そもそも新しい Bitmap を作らないといけないのかという疑問が残ったりします。
>

そういえばWithステートメントなのに.Image = New Bitmap(PictureBox1.Image)って……。.Image = New Bitmap(.Image)でいいのに。

            PictureBox1.Image = New Bitmap(PictureBox1.Image)
最初はBitmapとして取り込んでいない……のでBitmapとして取り込んでみました……。
今表示されているPictureBox1.ImageをBitmapオブジェクトに読み込みます。
            g1 = Graphics.FromImage(PictureBox1.Image)
そしてBitmapに読み込まれたイメージのGraphicsオブジェクトを取得

何か、この二つがないとマウスで描画することができませんでした。

 
>>        If drawflg = True Then
>>                g1.DrawLine(mypen, x1, y1, e.X, e.Y)
>>                x1 = e.X
>>                y1 = e.Y
>>                g1.Dispose()
>>        End If
> drawflg は必ず True なのでしょうか?
> もし、False になることがあれば、g1 は Dispose されません。
> 必ず True になるのであれば、そもそも If を書く必要はありません。

If drawflg = True Then

……
Else

……'ここでは全く別のことをやっていて、質問とは関係ない

End If

質問に必要ないと思われる部分はいろいろ削除して載せてました。よく見るとまだ必要でないものが残ってますね。
難しい……。


引用返信 編集キー/
■48935 / inTopicNo.6)  Re[5]: フリーハンド描画を保存
□投稿者/ Azulean (547回)-(2010/04/17(Sat) 00:15:12)
返信するの忘れてた。orz

No48727 (lino. さん) に返信
> PictureBox1.Image = New Bitmap(PictureBox1.Image)
> 最初はBitmapとして取り込んでいない……のでBitmapとして取り込んでみました……。
> 今表示されているPictureBox1.ImageをBitmapオブジェクトに読み込みます。
前に Image プロパティに設定されていた Bitmap は Dispose する必要がありますよね。
今の時点で提示されているコードだと、Paint イベントの度に新しい Bitmap を作っているようにみえます。
本当、それは必要なことなのでしょうか?

> If drawflg = True Then
>
> ……
> Else
>
> ……'ここでは全く別のことをやっていて、質問とは関係ない
>
> End If
その関係ないところを通る場合に g1 は Dispose されているんですよね?
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -