玄関へお回り下さい。
PictureBoxに文字を描画してファイルに保存(画像を加工して保存) (2個)   (SNo.094)

1.PictureBoxに文字を描画してファイルに保存(間違った操作)
2.PictureBoxに文字を描画してファイルに保存(正しい操作)
使用コントロール Button1 〜 Button6  PictureBox1  PictureBox2 
その他条件 WindowsXP(Vista) Visual Basic 2005(VB2008)
 
1.PictureBoxに文字を描画してファイルに保存(間違った操作)
 
Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button1.Click
'消えない描画で文字とラインを描く
    Dim g As Graphics
    With PictureBox1
        .Image = New Bitmap(150, 50)
        g = Graphics.FromImage(.Image)
    End With
'------------- 以下の部分は同じです ----------------------------
    Dim f As New Font("MS Pゴシック", 14)
    g.DrawString("花ちゃん", f, Brushes.Blue, 10, 10)
    g.DrawLine(Pens.Black, 0, 40, 100, 40)
    f.Dispose()
    g.Dispose()
    'この画像を保存して、再度読込み表示するとバックが青くなっている
End Sub

描いたものを一旦ファイルに保存します

Private Sub Button2_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button2.Click
'PictureBox の Image をファイルに保存
    '表示した画像を保存して、消去
    With PictureBox1
        If Not (.Image Is NothingThen
            .Image.Save("..\test94.bmp", Imaging.ImageFormat.Bmp)
            .Image.Dispose()
            .Image = Nothing
        End If
    End With
End Sub

保存したファイルを読み込んで表示するとバックが青くなっている

Private Sub Button3_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button3.Click
    With PictureBox1
        .SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize
        '画像ファイルを読み込みPictureBoxに表示
        .Image = System.Drawing.Image.FromFile("..\test94.bmp")
        'このように読込んで表示し、その後保存すると下記のエラーが発生する
    
'(ロックされないように読み込んでも同じです)
    End With

''System.Runtime.InteropServices.ExternalException' 
'のハンドルされていない例外が system.drawing.dll で発生しました。

'追加情報 : GDI+ で一般的なエラーが発生しました。
End Sub

2.PictureBoxに文字を描画してファイルに保存(正しい操作)

Private Sub Button4_Click(ByVal sender As System.Object, _
                         
ByVal e As System.EventArgs) Handles Button4.Click
   
Dim g As Graphics
   
With PictureBox2
        .Image = 
New Bitmap(150, 50)
        g = Graphics.FromImage(.Image)
        'バックのカラーをPictureBox2.BackColor と
        '同じに設定(印刷する場合は白色等に設定)
        'g.Clear(Color.White)    'この部分を追加
        g.Clear(.BackColor)       
'この部分を追加
   
End With
'------------- 以下の部分は同じです ----------------------------
   
Dim f As New Font("MS Pゴシック", 14)
    g.DrawString("花ちゃん", f, Brushes.Blue, 10, 10)
    g.DrawLine(Pens.Black, 0, 40, 100, 40)
    f.Dispose()
    g.Dispose()
End Sub

Private Sub Button5_Click(ByVal sender As System.Object, _
                         
ByVal e As System.EventArgs) Handles Button5.Click
'PictureBox の Image をファイルに保存(この処理は Button2 と同じです)
   
With PictureBox2
       
If Not (.Image Is NothingThen
            .Image.Save("..\test99.bmp", Imaging.ImageFormat.Bmp)
       
End If
        '表示した画像を消去
       
If Not (.Image Is NothingThen
            .Image.Dispose()
            .Image = 
Nothing
       
End If
   
End With
End Sub

Private Sub Button6_Click(ByVal sender As System.Object, _
                         
ByVal e As System.EventArgs) Handles Button6.Click
'消えない画像表示のところで紹介したコードをそのまま使って表示
   
Dim g As Graphics
   
With PictureBox2
        .SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize
        .Image = 
New Bitmap(.Size.Width, .Size.Height)
        g = Graphics.FromImage(.Image)
   
End With
'------------- 以下の部分は同じです ----------------------------
   
Dim bmap As Bitmap = New Bitmap("..\test99.bmp")
    g.DrawImage(bmap, 0, 0)
    bmap.Dispose()
    g.Dispose()
End Sub

掲示板で質問があって作成したものです。
必ず、Button1 〜 Button6 迄のコードを試して、見比べて下さい。

VB6.0 のように Picture1.AutoRedraw = True のような機能はありません。
書き方によっては、画像が消えたり、保存ができない。又、保存ができてもバックが青くなる等、それに加工したファイルを保存しようとすると GDI+ で一般的なエラーが発生しました。のエラーが発生したりと色々問題が発生するようです。
尚、
PictureBox1.BackColor = Color.White のような事では背景が描画されません。(保存したファイルには)
保存時にエラーが発生するのは、読込時にファイルをロックして読み込む事とは関係がありません、ロックを外して読み込んでも同じくエラーは発生します。





2004/06/24
2005/10/13


VBレスキュー(花ちゃん)
VB.NET2003  VB2005