トップ回答者
作った画像の保存方法について

質問
-
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
以上です。
回答
-
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
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答としてマーク doctor of osaka 2011年5月19日 8:13
- 回答としてマークされていない doctor of osaka 2011年5月19日 8:14
- 回答としてマーク 山本春海 2011年5月20日 1:43
-
さっそくのご教授、ありがとうございます。
あらかじめ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 100Dim 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- 回答としてマーク doctor of osaka 2011年5月19日 8:22
すべての返信
-
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
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。- 回答としてマーク doctor of osaka 2011年5月19日 8:13
- 回答としてマークされていない doctor of osaka 2011年5月19日 8:14
- 回答としてマーク 山本春海 2011年5月20日 1:43
-
さっそくのご教授、ありがとうございます。
あらかじめ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 100Dim 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- 回答としてマーク doctor of osaka 2011年5月19日 8:22