首页 新闻 会员 周边

关于WPF图像处理的问题, 望高手进来指点

0
悬赏园豆:50 [待解决问题]

我正在完成一个图片浏览的功能, 但在开发中遇到了关于加载图片占用内存大的问题, 经过反复调试确认了问题出在读取图片时令内存暴增, 最初我是使用BitmapFrame的Thumbnail属性获取图片的缩略图的...但这个属性不能满足需求, 因很多图片是获取不到缩略图的, 并且出来的图像失真过于明显, 这些图还需要进行排版设计. 所以我使用了一个方法将图片缩放. 但未与理想, 视乎进行缩放再显示未能有效的降低内存. 经过调试我在缩放后马上保存缩放好的图片到本地, 图片的确是变的好小了...但是为什么在软件里显示时还是非常占用内存呢. 测试方法: 1, 一个装有2.64 GB(506张)图片的文件夹 (软件将加载此文件夹的图片, 图片大多是高清的..所有比较大一张) 2,加载图片前开始计算内存的占用率, 加载并缩放完此文件夹的图片并显示, 软件内存增加636M左右 (以反复确认) 3,缩放完图片后即时保存到本地, 2.64 GB(506张) -> 6.31 MB(506张) 经过反复测试, 问题代码出现于获取缩放图片然后显示;

img_Photo.Source = ImageManager.GetScaleBitmapSource(str_FullName, 300);


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


public static BitmapSource GetScaleBitmapSource(string str_Path, double zoom)
{
BitmapFrame bit
= null;
try
{
bit
= BitmapFrame.Create(new Uri(str_Path), BitmapCreateOptions.DelayCreation, BitmapCacheOption.None);

return GetScaleBitmapSource(bit, zoom);
}
catch{}
finally
{
if (null != bit)
{
bit
= null;
}
}
return null;
}

/// <summary>
/// 縮放圖片
/// </summary>
/// <param name="str_Path"></param>
/// <param name="zoom"></param>
/// <returns></returns>
public static BitmapSource GetScaleBitmapSource(BitmapFrame bit, double zoom)
{
try
{
double scale = 1;
if (bit.PixelWidth > bit.PixelHeight)
scale
= (double)zoom / (double)bit.PixelWidth;
else
scale
= (double)zoom / (double)bit.PixelHeight;
var scare
= new ScaleTransform(scale, scale);
return new TransformedBitmap(bit, scare);
}
catch{}
finally
{
if (null != bit)
{
bit
= null;
}
}
return null;
}
============================================================================

 

我在winform中使用gdi+ 同樣對圖片進行縮放然後加載到PictureBox中, 程序的內存并沒暴漲, 請問在WPF中如何優化圖像處理的呢?

quanhugo的主页 quanhugo | 初学一级 | 园豆:150
提问于:2010-11-12 14:08
< >
分享
所有回答(4)
0

你得分清楚两个问题,是缩放让内存暴涨,还是显示缩放后的图片让内存暴涨?

Launcher | 园豆:45045 (高人七级) | 2010-11-12 17:02
应该是缩放让内存暴涨的...如果不缩放.. 程序一下就挂了..所以我觉得是我的这个缩放过程没完成好, 这里的缩放的确让内存降低, 但是内存还是远远超出我在winform中使用GDI+创建的图片, 在winform加载完这些缩略图后程序只占90多M左右, 而这里缩放确占用了600多M, 所以不明白为什么
支持(0) 反对(0) quanhugo | 园豆:150 (初学一级) | 2010-11-12 17:51
0

图片在进行初始化加载的时候内存会暴涨 这和图片的大小有关   感觉好像是WPF里面的一个bug  我也没有好的办法解决

菜鸟老了 | 园豆:145 (初学一级) | 2011-01-26 14:59
0

为什么不直接用Image控件数据绑定实现呢?我之前开发过类似的软件,在ListView中显示1000多张500万象素的图速度都很快,不过有一个细节就是Listview不可以使用WrapPanel,否则基本上程序就动不了

max_meng_198727 | 园豆:202 (菜鸟二级) | 2012-06-28 22:41
0

用 ListBox 加上 WrapPanel 也是一样的效果

守护之翼 | 园豆:204 (菜鸟二级) | 2012-10-16 10:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册