次のコード行を使用して、ファイルからImage
を開きます。
_pictureBox1.Image = Image.FromFile("test.png");
_
ファイルをロックし、イメージをメモリにロードし、_pictureBox1.Image
_をメモリ内のコピーに設定し、ロックを解除することを期待しています。実際には、メモリ内のImage
のDispose()
までロックは解除されません。 memory I amを使用してファイルを削除するまで、使用していないハードドライブ上のファイルのロックを解除できません。
MicrosoftのサイトではC#ラベルの記事で言及されていますが、その解決策はvisual basicで書かれていますが、これは役に立たないです。
要約すると、_pictureBox1.Image
_を_"test.png"
_に保存されているイメージに設定し、ユーザーに_"test.png"
_などを編集または削除させます。
ストリームによるアプローチは正しくありません。
こちらをご覧ください https://stackoverflow.com/a/8701748/355264
上記のリンクからの正しいコード:
Image img;
using (var bmpTemp = new Bitmap("image_file_path"))
{
img = new Bitmap(bmpTemp);
}
または、さらに良いことに、using
ステートメントを使用します(以下のコードは、sylonの[削除]投稿からコピーされます)。 Image.FromStream
は例外をスローしますが、ストリームがすぐに閉じられることを保証できます。
using (FileStream stream = new FileStream("test.png", FileMode.Open, FileAccess.Read))
{
pictureBox1.Image = Image.FromStream(stream);
}
ストリームを使用して画像を読み取り、ストリームを閉じることもできます。
FileStream stream = new FileStream("test.png", FileMode.Open, FileAccess.Read);
pictureBox1.Image = Image.FromStream(stream);
stream.Close();
私が見つけた最も簡単な方法は、Source(ファイルへのパス)を含むオブジェクトをフリーズすることです。画像を含むことができるすべてのコントロールは、nullでない場合、それが指すファイルをロックする.Sourceを持っているようです。
ここでの秘trickは、Imageコントロールを「読み取り専用」状態に変更し、ファイルのロックを解除することです。
私の解決策:
private Image CreatePreviewImage()
{
Image ReportImage = new Image();
Uri path = new Uri(@"C:\Folder\Image1.png");
if (File.Exists(path.OriginalString))
{
ReportImage.Name = "Report1";
ReportImage.Source = LoadImageFromFile(path);
}
return ReportImage;
}
public ImageSource LoadImageFromFile(Uri path)
{
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = path;
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
bitmap.DecodePixelWidth = 900;
bitmap.EndInit();
bitmap.Freeze(); //This is the magic line that releases/unlocks the file.
return bitmap;
}
開いて、読んで、リリースする
StreamReader streamReader = new StreamReader( "picture.png"); ビットマップtmpBitmap =(ビットマップ)Bitmap.FromStream(streamReader.BaseStream); streamReader.Close(); pictureBox1.Image = tmpBitmap; `