ListBox做的图片浏览器,内存一直上涨,好忧桑 @_@

Jane_sl 2016-08-03 03:27:43
最近很困扰,将指定文件夹下的图片加载到Listbox中,发现每点击一张图片,内存就会增加一部分,导入了140多张图片,点到100多张以后,内存大的吓人。于是网上各种搜,大体就是以二进制流的形式读取图片,所有的方法都试了一遍,内存依然会持续增长,有遇见过的吗?还请指点一二。另外,代码中判断文件是否为图片的方式有点傻,不知各位有没有高见。我的源码地址:http://download.csdn.net/detail/jane_sl/9593760
主要代码给大神们贴出来看看:

private void ReadFile(string filePath)
{
DirectoryInfo folder = new DirectoryInfo(filePath);
DirectoryInfo[] subFolders = null;
itemCollection.Clear();
try
{
subFolders = folder.GetDirectories();

if (subFolders != null)
{
foreach (DirectoryInfo subfolder in subFolders)
{

FileInfo[] files = subfolder.GetFiles();
foreach (FileInfo file in files)
{
if (file.Extension.Equals(".JPG") | file.Extension.Equals(".jpg") | file.Extension.Equals(".bmp") | file.Extension.Equals(".BMP"))
{
ImageItem item = new ImageItem();

byte[] buff = null;
using (var fileStream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read))
using (var binaryReader = new BinaryReader(fileStream))
{
buff = binaryReader.ReadBytes((int)fileStream.Length);
}


// Init bitmap
BitmapImage bitmap = new BitmapImage();
bitmap.DecodePixelHeight = 100;
bitmap.DecodePixelWidth = 100;
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.BeginInit();
bitmap.StreamSource = new MemoryStream(buff); //File.ReadAllBytes(file.FullName)
bitmap.EndInit();
item.MyImage = bitmap;
itemCollection.Add(item);
}
}
}

FileInfo[] filess = folder.GetFiles();//*.jpg;*.png;*.bmp;*.gif");
foreach (FileInfo file in filess)
{
if (file.Extension.Equals(".JPG") | file.Extension.Equals(".jpg") | file.Extension.Equals(".bmp") | file.Extension.Equals(".BMP"))
{
ImageItem item = new ImageItem();

// Init bitmap
BitmapImage bitmap = new BitmapImage();
bitmap.DecodePixelHeight = 100;
bitmap.DecodePixelWidth = 100;
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.BeginInit();
bitmap.StreamSource = new MemoryStream(File.ReadAllBytes(file.FullName));
bitmap.EndInit();
item.MyImage = bitmap;
itemCollection.Add(item);
}
}

grid.DataContext = itemCollection;
}
}
catch (Exception ex)
{
System.Windows.MessageBox.Show("文件夹获取失败!" + ex.Message);
}

}
...全文
1500 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jimmyz2015 2016-09-13
  • 打赏
  • 举报
回复
好东西,学习了。
xinbada1985 2016-09-12
  • 打赏
  • 举报
回复
BitmapImage bmp = null; try { bmp = new BitmapImage(); bmp.BeginInit(); bmp.CacheOption = BitmapCacheOption.OnLoad; bmp.UriSource = new Uri(_currentImageResultsGroup.CurrentImagePath, UriKind.RelativeOrAbsolute);); bmp.EndInit(); } catch { bmp = null; } return bmp; 可以直接读取图片,不需要转流
xinbada1985 2016-09-12
  • 打赏
  • 举报
回复
第一个问题,你的MemoryStream没有释放,他就会一直涨!还有BitmapImage你给存储起来,没加载一下就多一个,也会一直的涨
Jane_sl 2016-08-23
  • 打赏
  • 举报
回复
顶一下,大牛快点看过来
Jane_sl 2016-08-05
  • 打赏
  • 举报
回复
有木有更有效的优化方法呢?求解
  • 打赏
  • 举报
回复
引用 4 楼 Jane_sl 的回复:
[quote=引用 2 楼 Libby1984 的回复:] [quote=引用 1 楼 Libby1984 的回复:] 将bitmap.CacheOption = BitmapCacheOption.OnLoad;改为None或者Default应该会有改善。
关于查找图片你可以使用Directory.GetFiles(directory, "*.JPG", SearchOption.AllDirectories);这样就可以查找到文件夹下面所有的jpg图片,包括子目录。[/quote]我要查找所有图片,不管是什么格式[/quote] 那你只能挨个枚举所有你想要的格式的
Jane_sl 2016-08-04
  • 打赏
  • 举报
回复
引用 2 楼 Libby1984 的回复:
[quote=引用 1 楼 Libby1984 的回复:] 将bitmap.CacheOption = BitmapCacheOption.OnLoad;改为None或者Default应该会有改善。
关于查找图片你可以使用Directory.GetFiles(directory, "*.JPG", SearchOption.AllDirectories);这样就可以查找到文件夹下面所有的jpg图片,包括子目录。[/quote]我要查找所有图片,不管是什么格式
Jane_sl 2016-08-04
  • 打赏
  • 举报
回复
引用 1 楼 Libby1984 的回复:
将bitmap.CacheOption = BitmapCacheOption.OnLoad;改为None或者Default应该会有改善。
我试试,O(∩_∩)O谢谢
  • 打赏
  • 举报
回复
引用 1 楼 Libby1984 的回复:
将bitmap.CacheOption = BitmapCacheOption.OnLoad;改为None或者Default应该会有改善。
关于查找图片你可以使用Directory.GetFiles(directory, "*.JPG", SearchOption.AllDirectories);这样就可以查找到文件夹下面所有的jpg图片,包括子目录。
  • 打赏
  • 举报
回复
将bitmap.CacheOption = BitmapCacheOption.OnLoad;改为None或者Default应该会有改善。

8,735

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧