我正在完成一个图片浏览的功能, 但在开发中遇到了关于加载图片占用内存大的问题, 经过反复调试确认了问题出在读取图片时令内存暴增, 最初我是使用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中如何優化圖像處理的呢?
你得分清楚两个问题,是缩放让内存暴涨,还是显示缩放后的图片让内存暴涨?
图片在进行初始化加载的时候内存会暴涨 这和图片的大小有关 感觉好像是WPF里面的一个bug 我也没有好的办法解决
为什么不直接用Image控件数据绑定实现呢?我之前开发过类似的软件,在ListView中显示1000多张500万象素的图速度都很快,不过有一个细节就是Listview不可以使用WrapPanel,否则基本上程序就动不了
用 ListBox 加上 WrapPanel 也是一样的效果