从文件打开图像,然后释放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;`