从文件中打开图像,然后释放锁?

我使用以下代码行从一个文件打开一个 Image:

pictureBox1.Image = Image.FromFile("test.png");

我希望它锁定文件,将图像加载到内存中,将 pictureBox1.Image设置为内存中的副本,然后释放锁。实际上,只有在内存中的 ImageDispose()中,锁才会消失。我不能释放我不再使用的硬盘上的文件锁,直到我摆脱了 记忆中的文件,我 使用。
微软的网站在一篇带有 C # 标签的文章中提到了这个问题,但是他们的解决方案是用 visual basic编写的,这对我来说毫无用处。

In summary: I want to set pictureBox1.Image to the image stored in "test.png", then let the user edit or delete "test.png" or whatever.

66541 次浏览

您还可以使用流来读取图像,然后关闭流。

FileStream stream = new FileStream("test.png", FileMode.Open, FileAccess.Read);
pictureBox1.Image = Image.FromStream(stream);
stream.Close();

或者更好的方法是使用 using语句(下面的代码是从 Sylon 的[删除]文章中复制的)。这样,如果 Image.FromStream抛出异常,您仍然可以确保流被立即关闭。

using (FileStream stream = new FileStream("test.png", FileMode.Open, FileAccess.Read))
{
pictureBox1.Image = Image.FromStream(stream);
}

The approach with stream is not correct.

看这里 https://stackoverflow.com/a/8701748/355264

正确的代码从上面的链接:

Image img;
using (var bmpTemp = new Bitmap("image_file_path"))
{
img = new Bitmap(bmpTemp);
}

谈话开放,阅读和释放

StreamReader streamReader = new StreamReader("picture.png");
Bitmap tmpBitmap = (Bitmap)Bitmap.FromStream(streamReader.BaseStream);
streamReader.Close();
pictureBox1.Image = tmpBitmap;`

我找到的最简单的方法是冻结包含 Source (文件路径)的对象。所有可以包含图像的控件似乎都具有。源,如果不为空,它将锁定指向的文件。

现在的技巧是将 Image 控件更改为“只读”状态,然后解锁该文件。

My solution:

    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;
}