bmp.saveがうまくいかない

このQ&Aのポイント
  • 自身で.DrawLineでピクチャーボックスに描画した線を含めて画像をbmp.saveで保存したいのですが、もとのピクチャーボックスしかsaveされません。
  • ソースコードでは、DrawToBitmapメソッドを使用してピクチャーボックスの画像をキャプチャし、bmp.Saveメソッドを使用してファイルに保存しています。
  • しかし、保存されるのは元のピクチャーボックスの画像だけで、線の描画が反映されません。
回答を見る
  • ベストアンサー

.bmp.saveがうまくいかない

お世話になります。 自身で.DrawLineでピクチャーボックスに描画した線を含めて画像をbmp.saveで保存したいのですが、もとのピクチャーボックスしかsaveされません。 今行っているソースは以下の通りです。 Private Sub GraphImgSave() Dim bmp As New Bitmap(Pic_GraphHere.Width, Pic_GraphHere.Height) Dim Mtop As Integer Dim Mleft As Integer Mtop = 250 'Mleft = 10 'キャプチャする Me.DrawToBitmap(bmp, New Rectangle(Mleft, Mtop, Pic_GraphHere.Width, Pic_GraphHere.Height)) 'ファイルに保存する Try bmp.Save("d:\graphimg\curelastgraph.bmp") Catch ex As Exception MsgBox("保存できませんでした" & vbCrLf & ex.Message) End Try '後始末 bmp.Dispose() End Sub 宜しくお願いします

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

  • ベストアンサー
  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

Image への描画は情報が保存されますが、 Graphics オブジェクトを利用した描画では、 つねにプログラムによる再描画が必要です。 http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html

関連するQ&A

  • エクセルVBAでの画像ファイル名取得他

    VBAについての質問です。 http://hp.vector.co.jp/authors/VA033788/kowaza.html#0158 上記をベースに、なんとかVBAを下記のように書き換えました。 Sub LoadPictures3() Dim Fnames As Variant Dim Fn As Variant Dim i As Integer Dim Pic As Picture Dim R As Range Dim R2 As Range Dim Pc As Integer Fnames = Application.GetOpenFilename("図(*.jpg;*.gif),*.jpg;*.gif", MultiSelect:=True) If TypeName(Fnames) = "Boolean" Then Exit Sub Application.ScreenUpdating = False '一枚目の貼付け位置 Set R = Range("B5") Set R2 = R.Offset(35) Pc = 0 For i = 1 To UBound(Fnames) Set Pic = ActiveSheet.Pictures.Insert(Fnames(i)) Select Case (i - 1) Mod 4 + 1 Case 1 Pc = Pc + 1 If Pc >= 2 Then ActiveSheet.HPageBreaks.Add R2 End If With R Pic.Left = .Left Pic.Top = .Top Pic.Width = 300 Pic.Height = 225 End With Case 2 With R.Offset(0, 6) '一枚目に対する二枚目の相対位置 Pic.Left = .Left Pic.Top = .Top Pic.Width = 300 Pic.Height = 225 End With Case 3 With R.Offset(18, 0) Pic.Left = .Left Pic.Top = .Top Pic.Width = 300 Pic.Height = 225 End With Case 4 With R.Offset(18, 6) Pic.Left = .Left Pic.Top = .Top Pic.Width = 300 Pic.Height = 225 End With '次ページの相対位置 Set R = R.Offset(39) End Select Next Application.ScreenUpdating = True End Sub ここで、画像の上の位置(B5のセル位置の画像の場合、B4)に 元々の画像ファイル名を取得し、表記させたいのですが 調べた所、multiselect:=Trueで複数ファイルを選択するときに 画像名が図1、図2に変わっているようで、どうしていいかわかりません。 後、画像を300×225の「変倍」画像にしたいのですが どのようにすれば可能でしょうか? 全くVBAの知識がなく、上のURLを参考に、単語を調べつつ書き換えている状態で、変数やらなんやらの指定・書き方等わかりません。 どなたかご教授願います。

  • エクセル マクロ 画像についての質問です。

    エクセル マクロについての質問です。 下記のコードでセルに画像を合わせて貼り付け、表を作成しています。 が、このコードだと画像の保存先を移動させると画像が表示されなくなり、分類でフィルターをかけるとバラバラの違う画像が表示されてしまったりして困っています・・・。 どなたか良いご意見を頂ければと思い、投稿しました。よろしくお願いします! Sub PictFit() Dim PicFile As String Dim Pic As Picture PicFile = Application.GetOpenFilename() '画像のパスを取得 If PicFile = "False" Then Exit Sub Set Pic = ActiveSheet.Pictures.Insert(PicFile) '画像を貼り付ける With Pic .Height = ActiveCell.MergeArea.Height '画像の高さ .Top = ActiveCell.Top '画像の上位置を変更 .Left = ActiveCell.Left + (ActiveCell.MergeArea.Width - .Width) / 2 '画像の横位置を変更(セル幅中央に画像中央) End With End Sub

  • VB2005での画像処理

    各ピクセルの色情報を取得し,そのままコピーするプログラムです. 同じ大きさのPictureBox1とPictureBox2,それとButton1があります. エラーや警告は出ませんが,Button1をクリックしてもまったく動きません. 最終的にはPictureBox1を画像処理してPictureBox2に結果を表示させたいのですが,そのままコピーも出来ないため原因を探しています. A = picture1.GetPixel(i, j).ToArgb() picture2.SetPixel(i, j, color.FromArgb(A)) ではだめなのでしょうか.ご教授ください. -----以下プログラム------ Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer Dim j As Integer Dim A As Integer Dim picture1 As New Bitmap(PictureBox1.Image) Dim picture2 As New Bitmap(PictureBox2.Image) For j = 0 To PictureBox1.Width - 1 For i = 0 To PictureBox1.Height - 1 A = picture1.GetPixel(i, j).ToArgb() picture2.SetPixel(i, j, color.FromArgb(A)) Next Next End Sub

  • Visual Basic でスクリーンショット

    学生で、visual basic を勉強しているものです Button1をクリックするとスクリーンショットを1秒ごとに撮り、 "c:\iMonitoring"に保存するというプログラムを書いています (Button2をクリックすると止まる) 写真の名前を撮った時刻にしたいのですがエラーが出てうまくいきません どうしていいか分からばいので教えてください (コードです) ********************************************************************************* Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Timer1.Enabled = False System.IO.Directory.CreateDirectory("C:\iMonitoring") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Enabled = True End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Timer1.Enabled = False End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim x As String = Now().ToString() Dim a As String = "C:\iMonitoring\" Dim b As String = ".bmp" Dim y As String = (a & x & b) 'Imports System.Drawing 'Imports System.Windows.Forms 'Bitmapの作成 Dim bmp As New Bitmap(Screen.PrimaryScreen.Bounds.Width, _ Screen.PrimaryScreen.Bounds.Height) 'Graphicsの作成 Dim g As Graphics = Graphics.FromImage(bmp) '画面全体をコピーする g.CopyFromScreen(New Point(0, 0), New Point(0, 0), bmp.Size) '解放 g.Dispose() '保存 bmp.Save(y) End Sub End Class

  • VBAで保存(save)の意味は?

    お世話になります。 エクセル2013を使用です。 VBAで3万~5万行程度の処理をしています。 今回は、ショッピングモールのAPIのxmlデータを シートに転記する作業です。 それで、下記のように、一定回数ループをした後に、 念のためブックの保存(thisworkbook.save)をしているのですが、 この保存処理のための動作が非常に時間がかかります。 (ステータスバーに保存中ブック名と表示される状態のことです) それで、見直しをしていましたが、2点程疑問がでてきました。 1.そもそも、ループ処理の間に保存処理をする意味はあるのかどうか?   ・保存はPCのメモリーフリークなどが心配だったからなのですが、    保存しないことでメモリーフリークする可能性はあるのでしょうか?   ・途中でなにかしらの原因で動作が止まった時に、    保存しておけば、そこからまたやり直しすれば良いという考えでしたが    他に時間がかかるなら、1からやり直しても良い。 2、上記でやはり保存コードがあった方が良い場合、   saveだと行数が増えると時間がかかると思います。   他にブックを保存する方法で、時間がかからない方法があるのでしょうか?   ・上書き保存とは、ブック全体を一度読み込んでいると思うのですが、    追加分だけを読み込むという保存方法はあるのでしょうか? --------------- Sub tes() Dim xml As object Dim i_row As Integer, LastRow As Integer LastRow = Cells(Rows.Count, 1).End(xlUp).Row For i_row = 2 To LastRow Application.StatusBar = (i_row - 1) & "/" & LastRow & "件目 API取得中..." '処理コード   '例:cells(i_row,2)=xml.Item(1).text If i_row / 50 = Int(i_row / 50) Then  ThisWorkbook.Save  ’←★ここのsaveは意味ありますか?  DoEvents End If Next i_row Application.StatusBar = (i_row - 1) & "件取得完了" ThisWorkbook.Save MsgBox "完了" End Sub --------------------- お手数をお掛けしますが 何卒よろしくお願いします。

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

  • VBAのプロシージャーと変数の名前の区別について

    VBAの初心者です。教えてください。 Sub ex() Dim a As Integer Dim b As Integer a = 2 a a, b MsgBox b End Sub Sub a(a As Integer, b As Integer) b = a End Sub 上記のプログラムを実行するとうまくいきません。VBAのプロシージャーと変数って同じ名前を使うとだめなのですか?教えてください。

  • bitmapの宣言

    こんばんわ。 bitmapの宣言を最初に行い、途中のサブルーチン内で大きさの変更を行いたいのですが、可能でしょうか? Public Class Form1 Dim BMP As New Bitmap(300, 200) Private Sub このなかで、300*200の指定を行いたいです。 End Sub ちなみに、 Public Class Form1 Dim BMP As Bitmap Private Sub BMP = New Bitmap(300, 200) End Sub などと悪あがきをしましたがダメでした。 良い解決策を教えてください。よろしくお願いします。 バージョンは、.NET 2005です。

  • VB6で作成した自作DLLをVB.NETで呼び出し例外発生時に参照渡しの引数に値を設定する方法

    VB6で作成した自作のDLLをVB.NET2005で作成したEXEから呼び出した際に、DLLメソッドの正常・異常終了に関わらず第2引数の戻り値に第1引数の値を設定したいと考えていますが旨くいきません。 何かよい方法はないでしょうか? 以下、簡単なサンプルです。 =========================== VB6 DLL =========================== Public Sub getDataForTest(ByVal strIn As String, ByRef strOut As String) Dim intData As Integer 'strInの値をstrOutに代入 strOut = strIn 'strInの値を1で割り算 intData = CInt(strIn) / 1 End Sub =============================================================== =================== DLL呼び出し正常パターン =================== Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim objCom As New Project1.Class1 Dim strRet As String = "" Try Call objCom.getDataForTest("1", strRet) Catch ex As Exception MsgBox(ex.Message) Finally MsgBox(strRet) ←←← 1が表示される  End Try End Sub =============================================================== =================== DLL呼び出し異常パターン =================== Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim objCom As New Project1.Class1 Dim strRet As String = "" Try Call objCom.getDataForTest("A", strRet) Catch ex As Exception MsgBox(ex.Message) Finally MsgBox(strRet) ←←← この時にAを表示したいがstrRetが空  End Try End Sub ===============================================================

  • 矢印の所のようにしたら。。。

    矢印の所のようにしたら、subまたはfunctionが定義されていませんって出ます。いくら変えてみてもだめです。解決できる方助言してください。お願いします。 Const maxMONDAI = 5 '問題の最大数格納場所 Dim MONDAI_NOKORI '残り問題数格納場所 Dim MONDAI_NO As Integer '現在の問題番号格納場所 Dim SEIKAI As Integer '正解した問題数格納場所 Function GETMONDAI_NO() As Integer Randomize '以下の式で「1-5」までの整数を作る。 GETMONDAI_NO = Int(Rnd * maxMONDAI) + 1 End Function '初期設定 Sub initialize() MONDAI_NOKORI = maxMONDAI '残り問題数を初期値に戻す。 End Sub '終了ボタンを押した時の動き Private Sub cmdEND_Click() Dim END_BT As Integer END_BT = MsgBox("終了しますか?", vbYesNo + vbQuestion, "終了の確認") If END_BT = vbYes Then End End If End Sub '開始ボタンを押した時の動き Private Sub cmdSTART_Click() Call initialize '初期設定呼び出し MONDAI_NO = GETMONDAI_NO '現在の問題番号を得る。 txtRANSU.Text = Str(GETMONDAI_NO) '乱数の表示デバック用 txtNOKORI.Text = Str(MONDAI_NOKORI) '残り問題数の表示 imgHYOUJI.Picture = Pic2.Picture '←ここをimgHYOUJI.picture=pic(MONDAI_NO).pictureにしたい。 End Sub