tiff 查看器 wpf 应用程序内存不足
tiff viewer wpf application out of memory
我正在处理一个 Tiff 查看器项目,该项目处理大型 24 位彩色 tif 文件(>70MB)。
这是我如何加载 tif 文件的代码:
TiffBitmapDecoder tbd = new TiffBitmapDecoder(new Uri(_strTiffPath),BitmapCreateOptions.DelayCreation, BitmapCacheOption.Default);
_frames = tbd.Frames;
我使用默认缓存选项来防止将整个文件加载到内存中。
我的应用程序有一个侧面缩略图视图(带图像的垂直 StackPanel)和一个查看所选缩略图的页面视图。
我通过这段代码只加载可见的缩略图:
internal static BitmapSource GetThumbAt(int i)
{
try
{
if (i >= _frames.Count)
return null;
BitmapFrame bf = _frames[i];
bf.Freeze();
return bf;
}
catch (Exception ex)
{
return null;
}
}
我的问题是当我向下滚动缩略图视图以加载新的可见页面时,内存负载增加并且我 运行 内存不足!
我尝试卸载不可见页面(已加载),但这没有帮助!
img.Source = null
谢谢你帮我解决这个问题。
我明白了!
正如我之前的评论中提到的,this article 对我帮助很大。
我只是将它改编为我的代码,现在内存正在正确卸载。
以下是我对代码所做的修改:
internal static BitmapSource GetThumbAt(int i)
{
try
{
if (i >= _frames.Count)
return null;
BitmapFrame bf = _frames[i];
BitmapSource bs = bf.Clone() as BitmapSource; //make a copy of the original because bf is frozen and can't take any new property
BitmapUtility.AddMemoryPressure(bs);
return bs;
}
catch (Exception ex)
{
return null;
}
}
我正在处理一个 Tiff 查看器项目,该项目处理大型 24 位彩色 tif 文件(>70MB)。 这是我如何加载 tif 文件的代码:
TiffBitmapDecoder tbd = new TiffBitmapDecoder(new Uri(_strTiffPath),BitmapCreateOptions.DelayCreation, BitmapCacheOption.Default);
_frames = tbd.Frames;
我使用默认缓存选项来防止将整个文件加载到内存中。
我的应用程序有一个侧面缩略图视图(带图像的垂直 StackPanel)和一个查看所选缩略图的页面视图。
我通过这段代码只加载可见的缩略图:
internal static BitmapSource GetThumbAt(int i)
{
try
{
if (i >= _frames.Count)
return null;
BitmapFrame bf = _frames[i];
bf.Freeze();
return bf;
}
catch (Exception ex)
{
return null;
}
}
我的问题是当我向下滚动缩略图视图以加载新的可见页面时,内存负载增加并且我 运行 内存不足!
我尝试卸载不可见页面(已加载),但这没有帮助!
img.Source = null
谢谢你帮我解决这个问题。
我明白了! 正如我之前的评论中提到的,this article 对我帮助很大。 我只是将它改编为我的代码,现在内存正在正确卸载。 以下是我对代码所做的修改:
internal static BitmapSource GetThumbAt(int i)
{
try
{
if (i >= _frames.Count)
return null;
BitmapFrame bf = _frames[i];
BitmapSource bs = bf.Clone() as BitmapSource; //make a copy of the original because bf is frozen and can't take any new property
BitmapUtility.AddMemoryPressure(bs);
return bs;
}
catch (Exception ex)
{
return null;
}
}