VB.NETでのPictureBoxによる画像保存について

このQ&Aのポイント
  • VB.NETでプログラムでPictureBoxに絵を描かせる方法についてお尋ねします。画像を保存する際にエラーが発生しており、解決方法を教えていただきたいです。
  • 現在、VB.NETでPictureBoxに絵を描かせるプログラムを作成しています。画像の保存を試みた際にエラーが発生し、「System.Runtime.InteropServices.ExternalException」が発生しました。解決策を教えていただけると助かります。
  • VB.NETのプログラムでPictureBoxに描かれた絵を保存したいのですが、保存中にエラーが発生してしまいます。「System.Runtime.InteropServices.ExternalException」が発生し、GDI+で一般的なエラーが発生しましたと表示されます。どなたか解決方法をご教授いただけませんか?
回答を見る
  • ベストアンサー

VB.NETでのPictureBoxによる画像保存について

またお世話になります。 VB.NETでプログラムでPictureBoxに絵を描かせているのですが、そこまでは表示させることができました。このできた画像をBitmapなりjpegなりに保存させて、ほかの画像ビューワ等でも見れる形にしたいのですがうまくいきません。 ちなみに今はこのように書いて、 Dim gra1 As Graphics = PictureBox1.CreateGraphics FileOpen(2, myfile2, OpenMode.Output) (絵を描かせるプログラム) PictureBox1.Image.Save(myfile2, System.Drawing.Imaging.ImageFormat.Bmp) FileClose(2) としてまわしたところ、 System.Runtime.InteropServices.ExternalException' のハンドルされていない例外が system.drawing.dll で発生しました。 追加情報 : GDI+ で一般的なエラーが発生しました。 といわれました。 どなたかご教授いただけたらお願いしますm(__)m

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

やっぱり Dim gra1 As Graphics = PictureBox1.CreateGraphics が悪いと思うんですよね。 画面上に描画するだけならそれでいいと思うんですが。 フォームをロードした時に、 Dim bitmap As Bitmap = New Bitmap(PictureBox1.Width, PictureBox1.Height) PictureBox1.Image = bitmap 見たいに、まず、イメージを作ってやって 描画する部分では Dim gra1 As Graphics Dim bluepen As Pen gra1 = Graphics.FromImage(PictureBox1.Image) bluepen = New Pen(Color.Blue, 2) gra1.DrawEllipse(bluepen, 10, 10, 100, 100) PictureBox1.Refresh() 見たいな感じでやってみて下さい。 イメージのセーブは同じ。 背景は塗ってやらないといけないけど。 それはいいですね。

kawaching2
質問者

お礼

うまくいきました!! ありがとうございますm(__)m 画像を保存するには、Bitmapでの定義がと必要とは・・・知らなかったです。 Bitmaptとはとりあえず仮の絵を描かせる場所と思えばいいですかねえ?

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

最初の Dim gra1 As Graphics = PictureBox1.CreateGraphics が気になるんですけど、 ホントに、PictureBox1に書き込みしてますか? 例えば、 プログラム動作中に、PictureBox1にJPGの画像とかロードしてみたらどうなりますか? あるいは、プロパティであらかじめ画像を読み込んでおいて、 その画像の上に描画できますか? 実は、フォームの上に描いてたりしませんか?

kawaching2
質問者

補足

どうやらPictureBox1に書いているみたいです。 真っ黒になるのはブラシの色を最初にBlackに指定してるからかなと思ったので、Redにしたのですが真っ黒です・・・ 絵を描かせるプログラムの中で、データからの計算より数値をfromArgbでColorを変えてやっています。 表示はうまくいっているみたいなのでやはり保存の時の手順がいかんのかなあって思っています。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

色々怪しそうな処はあるけど、 myfile2は、ファイル名のstringだよね。 だったら、 FileOpenとFileCloseは要らないよ。 多分、ファイルが既にオープンされているのに、 Image.Saveでファイルをオープンして書き込もうとしたから例外になったのじゃないかな。

kawaching2
質問者

補足

myfile2はおっしゃるとおりStringです。 BLUEPIXYさんの通り、FileopenとFilecloseを消してまわしたところ、一応まわるにはまわるのですが、出てきたBitmapが真っ黒です・・・背景等も黒ではないのに、何ででしょう??

関連するQ&A

  • 動的に画像を作成し保存するには?

    Visual Basic 2012を使用しています。 下記プログラムを実行するとエラーが表示されてしまいます。 Dim img As New Bitmap(200, 100) Dim g As Graphics = Graphics.FromImage(img) g.FillRectangle(Brushes.Black, g.VisibleClipBounds) g.Dispose() PictureBox1.Image = img img.Save("E:\EPUB_test\test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg) img.Dispose() 表示されるエラーは下記です。 型 'System.ArgumentException' のハンドルされていない例外が System.Drawing.dll で発生しました どこが間違っているのでしょうか? 正しく動作させるにはどこを修正すべきかをお教え下さい。

  • VB.netでのPictuerBoxに描写した内容の保存について。

    VB.netでのPictuerBoxに描写した内容の保存について。 PictureBoxに描写した内容を保存してみると、描写した項目事態は正しく保存されているのですが、背景が真っ黒になってしまいますこれは、なぜなのでしょうか? ソースは以下の様な感じです。 Dim bmp As Bitmap Dim g As Graphics bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height) PictureBox1.Image = bmp g = Graphics.FromImage(PictureBox1.Image) g.DrawLine(Pens.AliceBlue, 0, 10, 20, 10) PictureBox1.Refresh() PictureBox1.Image.Save("test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg) どなたかわかる方よろしくお願いいたします。

  • pictureboxの画像を削除するには?

    Visual C# 2008を使用しています。 ボタンを押すとpictureboxに画像が表示されるプログラムを作成しました。 今度は、その表示された画像をクリックし、別のボタンを押すことでその画像が削除できるようにしたいと思っているのですが、うまくプログラムできません。 誰か教えていただけないでしょうか? ソースコードは以下のようになっています。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace algorithm { public partial class Form1 : Form { int space = 10; public Form1() { InitializeComponent(); } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { } private void kihonsyori_Click(object sender, EventArgs e) { if (this.pictureBox1.Image == null) { Bitmap img = new Bitmap(@"C:\Documents and Settings\admin\My Documents\Visual Studio 2008\Projects\algorithm\algorithm\picture\基本処理箱.png"); Graphics g = pictureBox1.CreateGraphics(); g.DrawImage(img, 0, space, 0.4F * img.Width, 0.3F * img.Height); space += 50; img.Dispose(); g.Dispose(); } else { this.pictureBox1.Image.Dispose(); this.pictureBox1.Image = null; } } private void groupBox1_Enter(object sender, EventArgs e) { } private void pictureBox1_Click(object sender, EventArgs e) { } private void hanpuku_Click(object sender, EventArgs e) { if (this.pictureBox1.Image == null) { Bitmap img = new Bitmap(@"C:\Documents and Settings\admin\My Documents\Visual Studio 2008\Projects\algorithm\algorithm\picture\反復箱.png"); Graphics g = pictureBox1.CreateGraphics(); g.DrawImage(img, 0, space, 0.4F * img.Width, 0.3F * img.Height); space += 80; img.Dispose(); g.Dispose(); } else { this.pictureBox1.Image.Dispose(); this.pictureBox1.Image = null; } } private void sentaku_Click(object sender, EventArgs e) { if (this.pictureBox1.Image == null) { Bitmap img = new Bitmap(@"C:\Documents and Settings\admin\My Documents\Visual Studio 2008\Projects\algorithm\algorithm\picture\選択箱.png"); Graphics g = pictureBox1.CreateGraphics(); g.DrawImage(img, 0, space, 0.4F * img.Width, 0.3F * img.Height); space += 80; img.Dispose(); g.Dispose(); } else { this.pictureBox1.Image.Dispose(); this.pictureBox1.Image = null; } } private void sakujyo_Click(object sender, EventArgs e) { pictureBox1.Image = null; space = 0; } } }

  • VB.NETにて、構造体へデータをセットするにはどうすればよいですか?

    バイナリーファイルから読み込んだデータを構造体にセットするにはどのようにすればよいですか? ご教授よろしくお願いします。 ファイルサイズは構造体のサイズと同じく300byteです。 Public Structure ST1 <VBFixedString(10), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=10)> _ Public str1() As String <VBFixedString(20), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=20)> _ Public str2() As String <VBFixedString(30), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=30)> _ Public str3() As String Public Sub Initialize() ReDim str1(4) ReDim str2(4) ReDim str3(4) End Sub End Structure 処理 Private Sub btn1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn1.Click dim ST as new ST1 ST.Initialize() FileOpen(1, OpenFileDialog1.FileName, OpenMode.Binary, OpenAccess.Read, OpenShare.Default)) FileGet(1, ST) FileClose(1) End Sub ここでわからないのが、イニシャライズを行い、配列数を設定しても、ファイルから読み込んでくるバイト数は配列でないときと同じサイズ(60byte)で読み込んできてしまいます。 STをイニシャライズしても、Marshal.SizeOf(ST)の値が変わらないのが原因だと思うのですが、宣言の仕方がおかしいのでしょうか? ご教授お願いいたします。

  • pictureBoxの絵保存について。

    pictureBoxにマウスを動かして絵を書いて、書いた絵を保存したいんですが、書いたデータは消えてしまいます。 なんでかわからないんで教えてください。例を載せときます。 cli::array<PointF>^ poi; Graphics^ grf; Pen^ pen; bool cap; private: System::Void pictureBox1_MouseMove(System::Object^sender, System::Windows::Forms::MouseEventArgs^ e) { if(!cap)return; PointF pt = PointF(e->X, e->Y); poi->SetValue(pt, 1); grf->DrawPolygon(pen, poi); poi->SetValue(pt, 0); // } private: System::Void pictureBox1_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { if(checkBox1->Checked == true){ Color color = Color::FromArgb(hScrollBar1->Value ,hScrollBar2->Value,hScrollBar3->Value); if(e->Button == System::Windows::Forms::MouseButtons::Right) color = Color::Red; cap = true; grf= pictureBox1->CreateGraphics(); // // pen = gcnew Pen(color); poi = gcnew cli::array<PointF>(2); PointF pt = PointF(e->X, e->Y); poi->SetValue(pt, 0); poi->SetValue(pt, 1); grf->DrawPolygon(pen, poi); } } private: System::Void pictureBox1_MouseUp(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { cap = false; }

  • ファイルの存在の確認をする方法

    こんにちは。 VB.netでプログラミングしているんですが、ファイル処理について質問があります。ファイルを保存する際に、よく「すでにファイルが存在します。上書きしますか?」と聞いてきますよね。これを実現するにはどんな方法があるでしょうか?ただし、コモンダイアログは使いません。FileOpen、FileCloseで実現したいのです。 以下のプログラムをどのように変えたらいいでしょうか?ご教授お願いいたします。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click   FileOpen(1, Format(Now, "yyyyMMdd") & " .txt", OpenMode.Output)   PrintLine(1, "test")   FileClose(1) End Sub

  • VC#でのファイル保存

    private void Save_File_Click(object sender, System.EventArgs e) { if (saveFileDialog1.ShowDialog() == DialogResult.OK) {pb2.Image.Save(saveFileDialog1.FileName,ImageFormat.Jpeg);} } ↑のようにすると、「型または名前空間名 'ImageFormat' が見つかりませんでした。ディレクティブを使うかアセンブリ参照を使ってください。」とエラーがでます。 テキストを真似てプログラムしたのですが・・・ pb2はpictureBox2です(PictureBox pb2;pb2=pictureBox2;) よろしくお願いします。

  • C#の保存フォーマット指定

    C♯のプログラムで 保存、読み込みにおいてbmp以外にjpgとgifを指定しないといけないのですが、 >saveFileDialog1.Filter =のあとの“イメージ(*.bmp)…には追加したのですが、 >そのあとの System.Drawing.Imaging.ImageFormat.Bmp: の部分を変えないといけないのですが、そこが分からなくて詰まっています! 誰か教えてください! お願いします

  • lineinput について

    下記のプログラムで処理を繰り返す時、どうして LinInput関数は正確に順序良く1行1行を読み取るのか分かりません。 下のプログラムでは永遠に1行目を読み取るか、読み取る行が ランダムになってしまうような気がするのですが、なぜでしょうか? 宜しくお願いします。 ---------------------------------------------------------------- filenum = FreeFile() FileOpen(filenum, openfile, OpenMode.Input) Do Until EOF(filenum) readline = LineInput(filenum) TextBox1.Text = TextBox1.Text & readline & vbCrLf Loof FileClose(filenum)

  • VB.NETにおける二値化処理の高速化

    いつも参考にさせて頂いております。 現在、VB.NET(VS2003/.NET Framework1.1)を使用して画像の二値化処理のプログラムを作成しております。 処理する事は簡単で、ビットマップファイルのRED要素を取り出し、閾値内なら白に変換して二値化するプログラムです。 以下がそのプログラムです。 ----- '変換する前の画像をファイルから読み込む Dim img1 As System.Drawing.Bitmap = New System.Drawing.Bitmap(filepath) '変換後のビットマップ Dim img2 As System.Drawing.Bitmap = New System.Drawing.Bitmap(img1.Width, img2.Height) '二値化処理 Dim b As Byte For i = 0 To img1.Width - 1 For j = 0 To img1.Height - 1 b = img1.GetPixel(i, j).R If b >= 閾値下限 And b <= 閾値上限 Then img2.SetPixel(i, j, Color.White) Else img2.SetPixel(i, j, Color.Black) End If Next Next PictureBox1.Image = img ----- これで処理は出来るのですが、ファイルが大きい場合は、非常に時間が掛かってしまいます。処理速度はCPUの速度にもよると思うのですが、できるだけ高速化したのですが、何かよい知恵があればご教授頂けると助かります。よろしくお願いいたします。 XP Pro SP2/VS2003/VB.NET/.NET Framework1.1

専門家に質問してみよう