動的に画像を作成して保存する方法とエラーの解決方法
- Visual Basic 2012を使用して動的に画像を作成し、保存する方法について解説します。
- プログラムを実行する際に発生するエラー「System.ArgumentException」の解決方法についても説明します。
- 修正すべき箇所や正しい動作のためのポイントを詳しく解説します。
- ベストアンサー
動的に画像を作成し保存するには?
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 で発生しました どこが間違っているのでしょうか? 正しく動作させるにはどこを修正すべきかをお教え下さい。
- pu-rapura
- お礼率100% (2/2)
- Visual Basic
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
PictureBox1.Image = img でPictureBoxに設定した画像を img.Dispose() で片付けてしまっているからだと思います。
関連するQ&A
- カラーダイアログの指定色で塗りつぶしの四角形を描きたい
VB.NET2003環境なのですが、 Dim g1 As Graphics = PictureBox1.CreateGraphics() g1.FillRectangle(Brushes.Red, 0, 0, 100, 100) g1.Dispose() の方法で四角形を描いているのですが、 この状態だとBrushes.Redの赤で描きますが、 これをColorDialogで指定した色を指定したいのですが、 どうしたら良いですか? g1.FillRectangle(ColorDialog1.Color, 0, 0, 100, 100) このようなことなのですが、これだとエラーになってしまいます。 ご教示頂けたら幸いです。
- ベストアンサー
- Visual Basic
- 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) どなたかわかる方よろしくお願いいたします。
- ベストアンサー
- Visual Basic
- VB PictureBoxの描画範囲
VisualStudio2010のVBにて、ピクチャーボックスの範囲をプログラム中で大きくして描画をさせたいのですが、ピクチャーボックスのサイズを大きくしても、大きくした範囲には描画がされません。 やり方は↓の方法です。 まず、formにボタンとピクチャーボックスを300×200で配置して、 http://homepage1.nifty.com/rucio/main/dotnet/Samples/dnSampleKeepImage.htm ↑のページで書かれてた方法でグラフィックを再描画させています。 Public Class Form1 Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim g As Graphics = AutoGraphics(PictureBox1) PictureBox1.Width = 400 g.FillRectangle(Brushes.Black, 100, 100, 10, 10) '1つ目の図形 g.FillRectangle(Brushes.Black, 350, 100, 10, 10) '2つ目の図形 g.Dispose() End Sub Public Function AutoGraphics(ByVal picSource As PictureBox) As Graphics If picSource.Image Is Nothing Then picSource.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) End If Return Graphics.FromImage(picSource.Image) End Function End Class これを実行すると、1つ目の図形は描画されていますが、拡大した範囲にある2つ目の図形は描画されていません。 ピクチャーボックスの範囲を大きくした所にも描画をさせたいと思っています。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- 色の変更
また分からないことが出来ましたので、よろしくお願いいたします。 今、openFileDialogで画像を読取、その画像の黒色を白色に変更してpicutreBoxに表示するプログラムを作成しています。 [C#] Bitmap img = new Bitmap(openFileDialog.FileName); Graphics g = Graphics.FromImage(img); System.Drawing.Imaging.ColorMap[] cms = new System.Drawing.Imaging.ColorMap[] {new System.Drawing.Imaging.ColorMap(), new System.Drawing.Imaging.ColorMap()}; cms[0].OldColor = Color.Black; cms[0].NewColor = Color.White; System.Drawing.Imaging.ImageAttributes ia = new System.Drawing.Imaging.ImageAttributes(); ia.SetRemapTable(cms); g.DrawImage(img, new Rectangle(img.Width + 10, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel,ia); g.Dispose(); PictureBox1.Image = img; という風に作成したのですが、色が変更されませんでした。 どこが違うのか分かられる方がいらっしゃいましたら、よろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- 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
- ベストアンサー
- Visual Basic
- VB2005 でビットの深さ8の画像を処理したい。
VB2005を使って簡単な画像処理のツールを制作しています。 処理内容は、画像ファイル(jpg)を読み込み、画像を縦に区切って 左側と右側を別のファイルに保存する、という処理です。 縦に区切る位置(x 座標)は、自由に指定できます。 上記のような処理を「任意の解像度(0~300 dpi)、ビットの深さ 8 」 の画像で行うには、どのようにしたらよいのでしょうか。 (ビットの深さ 8 の image からは Graphics オブジェクトを 作ることができず、そのため、読み込んだ画像の解像度を 保てませんでした。) ビットの深さが 24 の画像は、以下のようにして問題なく動きました。 "scanfile01.jpg" は、 解像度 300dpi / ビットの深さ 24 / 縦1500 × 横1200 ピクセル の画像ファイルです。 --------------- private sub splitImage() '画像(src)の読み込み Dim fs As New IO.FileStream("scanfile01.jpg", _ IO.FileMode.Open) Dim src As Image = Image.FromStream(fs, False, False) Dim srcG As Graphics = Graphics.FromImage(src) '解像度の取得用 'src を分割する位置(x座標) '(横幅1500 の scanfile01.jpg を左右半分に分ける) Dim cutx As Integer = 750 'src の左側を格納する Bitmap を新規作成 '(src の解像度を引き継ぐ) Dim destLeft As Image = New Bitmap(cutx, src.Height, srcG) Dim rect As New Rectangle(0, 0, cutx, src.Height) Dim destLeftG As Graphics = Graphics.FromImage(destLeft) Dim rect As New Rectangle(0, 0, cutx, src.Height) destLeftG.DrawImage(src, 0, 0, rect, GraphicsUnit.Pixel) 'src の左側をファイルに保存 destLeft.Save("scanfile01-left.jpg" _ , System.Drawing.Imaging.ImageFormat.Jpeg) destLeft.Dispose() destLeftG.Dispose() 'src の右側を格納する Bitmap を新規作成 ~省略~ srcG.Dispose() src.Dispose() fs.Dispose() End Sub ---------------- ビットの深さ 8 の画像を読み込むと、実行時に Dim srcG As Graphics = Graphics.FromImage(src) '解像度の取得用 の部分で「インデックス付きのピクセルから Graphics オブジェクトを作成できません」というエラーが発生します。 そこで、解像度は引き継がずに、以下のように変更してみました。 ・srcG の定義文を削除 ・destLeft の定義時に解像度は指定せず、以下のように変更 Dim destLeft As Image = New Bitmap(cutx, src.Height) すると、エラーは発生せずファイルが作成されましたが、 解像度が引き継がれずに元の画像よりずっと小さな画像になって 作成されていました。 (作成されたファイルを開くと、イメージが小さくなった分、 黒い隙間ができていました。) 300 dpi の画像を読み込んだので、VB2005 で作成される?Bitmap のデフォルトの解像度 96 dpi に変換される際にピクセル抜けが 発生して画像が小さくなったのだと思います。 ビットの深さ 8 の画像を半分に区切ってファイルに保存する方法は ないのでしょうか。また、任意の解像度でピクセル抜けが 発生しないようにしたいです。
- 締切済み
- Visual Basic
- System.ArgumentException
Dim Gl As Grapocs=Me.CreateGraphics Gl.DrawLine(Pens.Black, 0, 0, 50, 50) 以上のコードを実行するとエラーが出ます。 System.ArgumentException はハンドルされませんでした。 Message="使用されたパラメータが有効ではありません。" Source="System.Drawing" また、以下のように変えたりしても変わりません。 Gl.FillEllipse(Brushes.Black, 70, 70, 10, 10) どうしてこのようなエラーが発生するのかがわかりません。 ご存知の方はぜひご伝授ください。
- 締切済み
- Visual Basic
- bitmap 画像のサイズを大きくしたいのですが...
度々スミマセン 例えば600X600のpbox.image を使用して Dim canvas As g = Graphics.FromImage(pbox.Image) のような感じで800X600の graphics を取得したい場合 どの様にすればよろしいでしょうか? 大変申し訳ありません。宜しくお願いします。
- 締切済み
- Visual Basic
- 8bit(256色)グレースケール画像の保存
32bitのRGB画像ではなく、8bitのグレースケール画像を保存したいと考えています。 保存形式は、tiffとbmpのどちらでも構いません。 ですが、以下のような方法では、 アルファチャンネルを含んだ32bitのRGB画像が保存されてしまいます。 (作成中のプログラムの一例) Dim img As Bitmap Dim x As Integer Dim y As Integer img = New Bitmap(256, 50) For x = 0 To 255 For y = 0 To 49 img.SetPixel(x, y, Color.FromArgb(x, x, x)) Next Next img.Save("gradation.tif", System.Drawing.Imaging.ImageFormat.Tiff) なお、一例として単純なグラデーション画像を保存していますが、 あくまでも一例であり、グラデーション画像を作成することが目的ではありません。 最終的には、VisualBasicのBitmapクラスで作成したbitmap画像を Photoshopで、8bitのグレースケール画像として開けることが理想です。 どうか、アドバイスをよろしくお願い致しますm(__)m
- 締切済み
- Visual Basic
- 2次関数のグラフを書くには・・・(VB.net)
初めまして。 プログラム未経験なのですがVB.netでログラムを組まなくてはならなくなりました。 本を読んだのですが、分からなかったので皆さんに質問させていただきます。よろしくお願いします。 タイトル通り、「描画」ボタンのクリックで 2次関数が書きたいのですが表示されません。 参考にしたプログラムは平方根のグラフ表示です。以下 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click On Error Resume Next Dim g As Graphics = CreateGraphics() g.TranslateTransform(0, ClientRectangle.Height) g.ScaleTransform(1, -1) g.Clear(BackColor) Dim x As Integer For x = 0 To 400 g.FillRectangle(Brushes.Green, x, CInt(10 * Math.Sqrt(x)), 1, 1) Next End Sub 以下は僕が以上から考えて書いたプログラムです。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click On Error Resume Next Dim g As Graphics = CreateGraphics() g.TranslateTransform(0, ClientRectangle.Height) g.ScaleTransform(1, -1) g.Clear(BackColor) Dim x, y As Integer For x = 0 To 400 Step 10 y = -1 * (x * x) + 1 g.FillRectangle(Brushes.Blue, x, 10 * (-1 * (x * x) + 1), 1, 1) Next End Sub エラーは起きないのですがグラフが出ません。 つまらない質問かもしれませんがどうかご指導お願いいたします。。。
- 締切済み
- Visual Basic
お礼
その通りでした。 ありがとうございました。