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

我正在使用下面的代码行从文件中打开一个Image

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

我期望它locking文件,将图像加载到内存,将pictureBox1.Image设置到内存中的副本,并释放locking。 实际上,只有当我将Image Dispose()放置在内存中时,锁才会消失。 我不能释放硬盘上我不再使用的文件上的锁,直到我摆脱了我正在使用的内存中的文件。
微软的网站在一个C#标签的文章中提到它,但是他们的解决scheme是用visual basic编写的,这对我来说是无用的。

总结:我想将pictureBox1.Image设置为存储在"test.png"的图像,然后让用户编辑或删除"test.png"等等。

stream的方法是不正确的

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

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

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

或者更好的是,使用using语句(下面的代码是从sylon的[已删除的]文章中复制的)。 这样,如果Image.FromStream抛出一个exception,你仍然可以放心,stream立即closures。

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

您也可以使用stream来读取图像,然后closuresstream。

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

我发现的最简单的方法是冻结包含Source(文件的path)的对象。 所有可以包含图像的控件似乎都有一个.Source,如果不是null,它将locking它指向的文件。

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

我的解决scheme

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