WPF BitmapImage资源无法释放的问题

  好些时间没进空间了,先前是因为在忙项目,经常加班,没时间再顾其他了。而之后应该是又犯懒了吧.......

  这一个多星期都在做一个练习,用WPF做的,因为也是刚开始学,所以碰到了很多问题,标题这个算比较大的一个了。在这先要感谢一下CSDN里的周药师,再有百度HI里的mickeysullivan,你的文章帮我解决了这个问题。在这换个标题,期望能被容易的搜索到,帮助更多有此问题的同学们。

  eg:程序是可以选择图片,把它显示在Image控件里,并把该文件复制到指定的文件下内,最后还可以删除该文件。

  ==================问题===================

  不说其他的了,直接说有问题的代码

  BitmapImage bitmap = new BitmapImage(new Uri(pngfile));//pngfile为图片的全路径名

  这句话用来上传图片,以便图片在Image中显示。

  可问题是,BitmapImage 对象会一直占用它最后使用的那个资源不释放,而且它也没有Dispose()方法可以选择释放,所以总会在删除其某些图片时跳出错误“The process cannot access the file 'F:\2.jpg' because it is being used by another process”,其原因即是F:\2.jpg被占用了。

  ==========================================

  之后我想了很多办法,包括把它换成 用FileStream读取,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
FileStream fs = null;
                        byte[] buffer = null;
                        try
                        {
                            if (File.Exists(a)) //图片文件的全路径字符串
                            {
                                fs = new FileStream(a, FileMode.Open);
                                buffer = new byte[fs.Length];
                                fs.Read(buffer, 0, int.Parse(fs.Length.ToString()));
                                fs.Close();
                                fs.Dispose();
                            }
                        }
                        catch
                        {
                            fs.Close();
                            fs.Dispose();
                        }

  或是在using FileStream之前加lock、在new FileStream的参数中加入FileAccess.ReadWrite、FileShare.ReadWrite、以及将bitmap.Clone作为currentImage的Source,都不成功

  ===============解决方法=============

  最后发现初始化BitmapImage可以通过byte[]进行,于是只能通过将png文件读成byte[],再进行BitmapImage的初始化,就没有问题了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// Read byte[] from png file
BinaryReader binReader = new BinaryReader(File.Open(filePath, FileMode.Open));
FileInfo fileInfo = new FileInfor(filePath);
byte[] bytes = binReader.ReadBytes((int)fileInfo.Length);
binReader.Close();

// Init bitmap
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = new MemoryStream(bytes);
bitmap.EndInit();
posted @ 2011-11-09 15:09  therockthe  阅读(2316)  评论(0)    收藏  举报