none
作った画像の保存方法について RRS feed

  • 質問

  • VB2010を使い始めてからまだかけだしの私です。よろしくおねがいします。

    picturebox上にすきな図形をかいてその絵をファイルとして保存しようとしましたが、エラーがでて、それにはこう書かれてあったんです

    オブジェクト参照がオブジェクトインスタンスに設定されていません    オブジェクトインスタンスの作成にはnewキーワードを使用しますと。

    なんのことやらさっぱりわかりません。  私がVB2010に書き込んだコードは次の通りです。どこがいけないのか、どうかみなさまご教授くださいませ

     Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint

    Dim gpbox As Graphics = PictureBox1.CreateGraphics()

    Dim mypen As New Pen(Color.FromArgb(255, 255, 0, 0), 1)

    gpbox.DrawLine(mypen, 0, 0, 50, 50)

    PictureBox1.Image.Save("C:\mydata\outfile.bmp", Imaging.ImageFormat.Bmp)

     End Sub

    以上です。

    2011年5月17日 13:24

回答

  • VB2010を使い始めてからまだかけだしの私です。よろしくおねがいします。

    最初からこういったことを言うのは酷かもしれませんが、自分が書いたコード、持ってきたコードが何をしているのか、よく考えてみてください。

    オブジェクト参照がオブジェクトインスタンスに設定されていません    オブジェクトインスタンスの作成にはnewキーワードを使用しますと。

    何も入っていない箱(Image プロパティ)に対して、保存しろ(Save メソッド)を呼び出したので、何も入っていないよという例外(NullReferenceException)が発生したわけです。
    これは例外(問題)の出方の一つであり、これだけでは何が悪いかを特定できるものではありません。
    ただ、実行が止まったときに、PictureBox1.Image.Save の行がハイライト(色が変わっている)していたと思います。その近辺に問題があるということがわかるわけです。

    Dim gpbox As Graphics = PictureBox1.CreateGraphics()

    これは、PictureBox1 の画面に描ける Graphics を作ります。

    Dim mypen As New Pen(Color.FromArgb(255, 255, 0, 0), 1)

    gpbox.DrawLine(mypen, 0, 0, 50, 50)

    作った Graphics に対して、線を描きます。
    画面には表示されますが、Image プロパティには何も入っていないままです。

    PictureBox1.Image.Save("C:\mydata\outfile.bmp", Imaging.ImageFormat.Bmp)

    何も入っていない Image プロパティに対して操作したので例外が発生します。

     

    PictureBox の Image プロパティは自分で設定した場合にのみ何か入っています。
    また、Graphics に対して何か描いたとしても、Image プロパティの中身は変化しません。
    描いた絵を保存したいのであれば、以下のページを参考に Bitmap を自分で作り、それに描いてから保存することが必要です。
    http://dobon.net/vb/dotnet/graphics/createimage.html

    (参考)
    http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年5月17日 14:03
    モデレータ
  • さっそくのご教授、ありがとうございます。

    あらかじめCドライブの中に mydata というフォルダを作り、PictureBox1の大きさを150x150にして

    下記のようにコードを組んだところ、すべてうまくいきました。mydataに目的とする画像ファイルが作られていました

    ほんとうにありがとうございます。

         コード

           ↓

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim rect As Rectangle = PictureBox1.ClientRectangle
            PictureBox1.Image = New Bitmap(rect.Width, rect.Height)
            Dim r As Integer
            r = 0
            'PictureBox1.Imageのイメージに文字列を描画する
            Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)
            g.FillRectangle(Brushes.White, g.VisibleClipBounds)
            For y = 0 To 100
                For x = 0 To 100

                    Dim mypen2 As New SolidBrush(Color.FromArgb(255, r, 0, 0))
                    g.FillRectangle(mypen2, x, y, 1, 1)
                    r = r + 1
                    If r > 255 Then r = 0
                Next
            Next
            g.Dispose()

            'PictureBoxを再描画する
            PictureBox1.Invalidate()
            'PictureBox1.imageを保存する
            PictureBox1.Image.Save("C:\mydata\outfile.jpg", Imaging.ImageFormat.Jpeg)
        End Sub

    2011年5月19日 8:21

すべての返信

  • VB2010を使い始めてからまだかけだしの私です。よろしくおねがいします。

    最初からこういったことを言うのは酷かもしれませんが、自分が書いたコード、持ってきたコードが何をしているのか、よく考えてみてください。

    オブジェクト参照がオブジェクトインスタンスに設定されていません    オブジェクトインスタンスの作成にはnewキーワードを使用しますと。

    何も入っていない箱(Image プロパティ)に対して、保存しろ(Save メソッド)を呼び出したので、何も入っていないよという例外(NullReferenceException)が発生したわけです。
    これは例外(問題)の出方の一つであり、これだけでは何が悪いかを特定できるものではありません。
    ただ、実行が止まったときに、PictureBox1.Image.Save の行がハイライト(色が変わっている)していたと思います。その近辺に問題があるということがわかるわけです。

    Dim gpbox As Graphics = PictureBox1.CreateGraphics()

    これは、PictureBox1 の画面に描ける Graphics を作ります。

    Dim mypen As New Pen(Color.FromArgb(255, 255, 0, 0), 1)

    gpbox.DrawLine(mypen, 0, 0, 50, 50)

    作った Graphics に対して、線を描きます。
    画面には表示されますが、Image プロパティには何も入っていないままです。

    PictureBox1.Image.Save("C:\mydata\outfile.bmp", Imaging.ImageFormat.Bmp)

    何も入っていない Image プロパティに対して操作したので例外が発生します。

     

    PictureBox の Image プロパティは自分で設定した場合にのみ何か入っています。
    また、Graphics に対して何か描いたとしても、Image プロパティの中身は変化しません。
    描いた絵を保存したいのであれば、以下のページを参考に Bitmap を自分で作り、それに描いてから保存することが必要です。
    http://dobon.net/vb/dotnet/graphics/createimage.html

    (参考)
    http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年5月17日 14:03
    モデレータ
  • さっそくのご教授、ありがとうございます。

    あらかじめCドライブの中に mydata というフォルダを作り、PictureBox1の大きさを150x150にして

    下記のようにコードを組んだところ、すべてうまくいきました。mydataに目的とする画像ファイルが作られていました

    ほんとうにありがとうございます。

         コード

           ↓

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim rect As Rectangle = PictureBox1.ClientRectangle
            PictureBox1.Image = New Bitmap(rect.Width, rect.Height)
            Dim r As Integer
            r = 0
            'PictureBox1.Imageのイメージに文字列を描画する
            Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)
            g.FillRectangle(Brushes.White, g.VisibleClipBounds)
            For y = 0 To 100
                For x = 0 To 100

                    Dim mypen2 As New SolidBrush(Color.FromArgb(255, r, 0, 0))
                    g.FillRectangle(mypen2, x, y, 1, 1)
                    r = r + 1
                    If r > 255 Then r = 0
                Next
            Next
            g.Dispose()

            'PictureBoxを再描画する
            PictureBox1.Invalidate()
            'PictureBox1.imageを保存する
            PictureBox1.Image.Save("C:\mydata\outfile.jpg", Imaging.ImageFormat.Jpeg)
        End Sub

    2011年5月19日 8:21
  • ところで、PictureBox1 に表示することは必要だったのでしょうか?
    もし、画面に表示することが必要でなかったのであれば、PictureBox1 自体を使う必要がありませんのでご留意ください。
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年5月19日 13:25
    モデレータ