「画像ファイルを読み込み、Imageオブジェクトを作成する」で紹介しているような方法で画像ファイルからImageオブジェクトを作成した時、Imageオブジェクトが破棄されるまで画像ファイルがロックされます。
例えば以下のように、Image.FromFileメソッドでImageオブジェクトを作成して、PictureBox.Imageプロパティで画像を表示した場合、少なくとも画像を表示している間は、その画像ファイルの削除、名前変更、上書きなどができなくなります。
'PictureBox1に"C:\test.bmp"を表示する。"C:\test.bmp"が削除できなくなる。
PictureBox1.Image = System.Drawing.Image.FromFile("C:\test.bmp")
//PictureBox1に"C:\test.bmp"を表示する。"C:\test.bmp"が削除できなくなる。
PictureBox1.Image = System.Drawing.Image.FromFile(@"C:\test.bmp");
この問題の回避法は、「マイクロソフト サポート技術情報 - 309482」にある通り、FileStreamオブジェクトを使用することです。
以下に、ファイルをロックすることなくImageオブジェクトを作成するメソッドの例を示します。
''' <summary> ''' 指定したファイルをロックせずに、System.Drawing.Imageを作成する。 ''' </summary> ''' <param name="filename">作成元のファイルのパス</param> ''' <returns>作成したSystem.Drawing.Image。</returns> Public Shared Function CreateImage(ByVal filename As String) _ As System.Drawing.Image Dim fs As New System.IO.FileStream( _ filename, _ System.IO.FileMode.Open, _ System.IO.FileAccess.Read) Dim img As System.Drawing.Image = System.Drawing.Image.FromStream(fs) fs.Close() Return img End Function
/// <summary> /// 指定したファイルをロックせずに、System.Drawing.Imageを作成する。 /// </summary> /// <param name="filename">作成元のファイルのパス</param> /// <returns>作成したSystem.Drawing.Image。</returns> public static System.Drawing.Image CreateImage(string filename) { System.IO.FileStream fs = new System.IO.FileStream( filename, System.IO.FileMode.Open, System.IO.FileAccess.Read); System.Drawing.Image img = System.Drawing.Image.FromStream(fs); fs.Close(); return img; }
(この質問は掲示板でいただいた質問です。)