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

このQ&Aのポイント
  • VB.netのPictuerBoxで描写した内容を保存する際、背景が真っ黒になる問題について解説します。
  • VB.netのPictuerBoxを使用して描写した内容を保存すると、背景が真っ黒になります。この問題の原因と解決方法について紹介します。
  • VB.netのPictuerBoxでの描写内容の保存において、背景が真っ黒になる問題が発生します。この問題の解決方法を解説します。
回答を見る
  • ベストアンサー

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) どなたかわかる方よろしくお願いいたします。

  • pczzz
  • お礼率86% (26/30)

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

  • ベストアンサー
noname#166246
noname#166246
回答No.1

Bitmapを新規に作成すると、「透明の」黒の画像となります。 つまり、データ的に言えば、 アルファ(透明度)、R、G、B、全てが0のものです。 無色に見えているのは、アルファ=0のせいです。 これは、 Dim btmap As Bitmap = PictureBox1.Image Dim c As Color = btmap.GetPixel(5, 5)   '情報が欲しい画像のPixelを指定 Debug.Print("Alpha={0},Red={1},Green={2},Blue={3}", c.A, c.R, c.G, c.B) を実行してもらえれば、確認できます。 で、JPEGは、このアルファをサポートしていません。 なので、R・G・Bが全て0という黒の画像として保存されてしまいます。 試しに、PNGファイルで保存すると、アルファ値も保存されるため、 黒にならないはずです。 ただし、この保存したPNGファイルを見る際にも注意が必要です。 Vista付属のペイントで見たりすると、黒になってしまいます。 これは、ペイントの方がPNGファイルのアルファ値を 見てないからだと考えられます。 Windowsフォトギャラリーなど、少しまともなアプリなら ちゃんと透明に見えるはずです。

pczzz
質問者

お礼

おお、PNGだとうまくいきますね。 確かにペイントで開くと黒になってしまうようですが、保存した画像は、再びPictureBoxで読ませるだけなので問題はないようです。 ありがとうございました。

関連するQ&A

  • VB.NETのグラフィック描画で困っています

    VB.NETでのグラフィックの記述方法ですが 何かをクリックすると描画させるのではなく 単にあるsubプロシージャ内でグラフィックを描画させる記述する方法として pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) を教えていただきました。そこで private sub xy_keisan() '座標を計算させるプロシージャ disp_x() 'x座標に目盛りを表示させるプロシージャ disp_Y() 'xの目盛り数によってY座標の位置を変えて表示させるプロシージャ end sub private sub disp_x() pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) g.DrawLine(****** end sub private sub disp_y() pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) g.DrawLine(****** end sub のような記述(引数とか細かい所は端折っています)ですとdisp_yは描画されていますが,disp_xは消えてしまいます。 pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) が消えてしまう原因だとおもって宣言場所を変えてみましたが同じです 逆にこれが無いと描画させることが出来なくなります。 これの意味も今ひとつ判りません よろしくお願い致します

  • 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

  • VB.NET ピクチャーボックスのImageの一部をクリップボードにコピー

    Picturebox1.Image = New Bitmap(Picturebox1.Width, Picturebox1.Height) Dim g As Graphics = Graphics.FromImage(Picturebox1.Image) これ以降 g.DrawLine 等で描画を行っています そして、ピクチャーボックスの一部の領域(矩形)を指定して クリップボードにコピーしたいのですがどうしたらいいでしょうか よろしくお願いします 他のピクチャーボックスにその一部をコピーできるだけでもいいのですが

  • VB2010にて、文字を上下鏡反転したいのですが、どなたか教えていただ

    VB2010にて、文字を上下鏡反転したいのですが、どなたか教えていただけないでしょうか。 マトリックスでピクチャーボックスの左下を原点としてグラフ描画できましたが、 文字が逆さまになってしまいました。 ピクチャーボックスに、グラフィクスオブジェクトを使い ビットマップイメージで描画して文字を上下反転しようと試みています。 以下のコードで、 Me.PictureBox1.Image.RotateFlip(RotateFlipType.RotateNoneFlipY) の部分がエラーとなってしまいます。 どう修正すればよいか教えていただけませんでしょうか。 どうぞよろしくお願いいたします。 Dim myPen As New Pen(Color.Red, 1) Dim myFont As New Font("MS UI Gothic", 20) Dim myMatrix As New Matrix 'Dim g As Graphics = Me.PictureBox1.CreateGraphics Dim Image2 As New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height) Dim pg As Graphics = Graphics.FromImage(Image2) Dim px, py As Long px = Me.PictureBox1.Width py = Me.PictureBox1.Height myMatrix.Scale(1, -1) '拡大縮小(y軸のみ正負の方向を逆にする) myMatrix.Translate(0, -py) '平行移動(ピクチャーボックスの高さ分,下へ平行移動) 'g.Transform = myMatrix pg.Transform = myMatrix 'g.DrawLine(myPen, 0, 0, 200, 200) pg.DrawLine(myPen, 0, 0, 200, 200) 'g.DrawString("text", myFont, Brushes.Red, 100, 100) pg.DrawString("text", myFont, Brushes.Red, 100, 100) '"text"を上下反転する 'Me.PictureBox1.Image = Image.FromFile("C:\☆test.bmp") Me.PictureBox1.Image.RotateFlip(RotateFlipType.RotateNoneFlipY) Me.PictureBox1.Refresh()

  • VB.NETの画像の切り取りについて教えて

    Dim bmp1 As Bitmap Dim bmp2 As Bitmap となっていて、bmp1にファイルから読み込んだ画像を入れてあり bmp2に切り出し位置とサイズを指定して、bmp1の一部を入れたいのですが、 どのようにやれば良いでしょうか。 PictureBoxを使う方法はサンプルを見つけたのですが、 PictureBoxを使わずにやりたいのですが方法がありましたら ご教授頂けないでしょうか。宜しくお願い致します。 Frameworkは1.1です。

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

    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 で発生しました どこが間違っているのでしょうか? 正しく動作させるにはどこを修正すべきかをお教え下さい。

  • VB2005 コード記述作法

    VBのコード記述作法に自身がなく不安です。 CADのラバーラインのような感じです。 PictureBoxを置いてFormの上下左右にアンカーしてるだけです。 lineモードにXorがないので下記のようにしました。 今は、とりあえず動いてますが、<?>印部分をここに記述しても安定動作しますか? (メモリの無駄使いとか・CPUの負荷とか) 又Form1_Resizeで再描画してますが、Windowを最小化すると当然でしょうが PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) でエラーになります。 これを防ぐ方法を教えて下さい。 Public Class Form1 Private sx, sy, ex, ey As Integer Private flg As Boolean = False Private fg, bg As Graphics   '----<?>---- Private d(100, 4) As Integer Private po As Integer = 1 '-------------------------------- Private Sub PictureBox1_MouseDown(~~ If flg = False Then sx = e.X sy = e.Y ex = sx ey = sy flg = True fg = PictureBox1.CreateGraphics() '----<?>---- Else flg = False ex = e.X ey = e.Y PictureBox1.Refresh() fg.Dispose() '----<?>---- bg = Graphics.FromImage(PictureBox1.Image) '----<?>---- bg.DrawLine(Pens.Black, sx, sy, ex, ey) bg.Dispose() '----<?>---- PictureBox1.Refresh() d(po, 1) = sx d(po, 2) = sy d(po, 3) = ex d(po, 4) = ey po = po + 1 End If End Sub '-------------------------------- Private Sub PictureBox1_MouseMove(~~ If flg = True Then PictureBox1.Refresh() fg.DrawLine(Pens.Blue, sx, sy, e.X, e.Y) ex = e.X ey = e.Y End If End Sub '-------------------------------- Private Sub Form1_Resize(~~ Dim x As Integer PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) bg = Graphics.FromImage(PictureBox1.Image) ' ----<?>---- For x = 1 To po - 1 bg.DrawLine(Pens.Black, d(x, 1), d(x, 2), d(x, 3), d(x, 4)) Next bg.Dispose() ' ----<?>---- End Sub '-------------------------------- End Class

  • VB.NETでPictureBoxへの描画について

    VB.NETでPictureBoxへの描画について PictureBoxに画像を表示し、余白部分を含めて、マウスで描画できる処理を作成しているのですが、 どうも上手くいかない為、皆さんの知恵をお借りしたいと思い質問させて頂きました。 まず、880×560のPictureBoxを用意し、その中に、600×480の画像を埋め込んでいます。 そのPictureBoxの中で、画像以外の部分(余白)にもマウスで線等を書きたいのです。 画像のみに描く場合は上手くいくのですが、余白を含めると上手くいかなくなってしまい、 困っております。 プログラムの違いは以下の箇所のみです。2の場合は上手くいきます。 1.PictureBox全体に描画する(画像も含め) Dim g As Graphics = PictureBox1.CreateGraphics 2.画像のみに描画する Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) ちなみに、マウスではなく、ボタンクリック時に描画した時は、1の場合でも上手くいきます。 お手数ですが、ご回答の程、よろしくお願いします。

  • VB.NETのグラフィック描画について

    グラフィック描画ですが、引数を持たないサブルーチンプロシージャ(固定的な 目盛り等)は、PictureBox_paint(***イベントプロシージャ内に記述すればグラフィック描画ができます(e.Graphicsでグラフィックスオブジェクトを取得できる為)が、 X、Y座標を引数としたサブルーチンプロシージャを作り、その中でLineDraw(*****で描画させたい場合サブルーチンプロシージャ内に dim g As Graphics=pictureBox1.CreateGraphics() でグラフィックオブジェクトを生成しても 描画できないのですがどのようにすれば解決できるでしょうか(イメージがわかり難いかもしれませんのでサンプルを書きました) よろしくお願いします (1)private sub pictureBox1_paint(Byval sender as Object, Byval e as system****** e.Graphics.DrawLine(****** (これは描画できる) End Sub (2)private sub zahyou() ' 座標を生成するサブルーチンプロシージャ dim i as integer for i=0 to 10 hyouji( i , i*5 ) End Sub private sub hyouji( x as integer, y as integer) ’直線を引くサブルーチンプロシージャ dim g As Graphics=pictureBox1.CreateGraphics() g.DrawLine(***,x,y**** (これは描画できない)

  • VB2008 PaintイベントとResize

    VB初心者です VisualStudio2008 VBを使用しております 早速質問なのですが Form1にPictureBox1があり、プロパティDockがFillとします このピクチャーボックスの色を赤にして、左上から中心に向かって線を引きたいのですが Public Class Form1 Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint Dim p1XC, p1YC As Integer p1XC = PictureBox1.Width / 2 p1YC = PictureBox1.Height / 2 e.Graphics.Clear(Color.Red) e.Graphics.DrawLine(Pens.Black, 0, 0, p1XC, p1YC) End Sub -------------------------------------------------------------------------------- Private Sub PictureBox1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.Resize Dim p1XC, p1YC As Integer p1XC = PictureBox1.Width / 2 p1YC = PictureBox1.Height / 2 Dim g As Graphics = PictureBox1.CreateGraphics g.Clear(Color.Red) g.DrawLine(Pens.Black, 0, 0, p1XC, p1YC) End Sub End Class ↑は、おかしいですよね? eに書いてるのかgに書いているのか・・・ そもそも←の考え方がおかしいのか eの扱いがよくわからないです。 *同じ色だとわからないですが、色違いにすると大きくした時は増えた部分しか書かれてない *ペイントのみにしてしまうとサイズを小さくしたときに中心に線がいかない *リサイズのみだと元の部分しか塗られない こういう場合どうするのがいいのしょうか? 実際はもっと複雑な絵を描きたいので、イベントと描写を分けたいと思っているのですが・・・ どなたかご教示下さい。