我正在使用.NET的FreeImage包装器在WPF中制作一个简单的图像查看器(http://freeimage.sourceforge.net/)
这是代码:
public static void OpenImage(string path)
{
_rawImage = new FreeImageBitmap(path);
BitmapSource bs = Utils.BitmapToBitmapSource(_rawImage.ToBitmap());
mainWindow.imageComponent.Source = bs;
mainWindow.imageComponent.Width = _rawImage.Width;
mainWindow.imageComponent.Height = _rawImage.Height;
}
[System.Runtime.InteropServices.DllImport("gdi32")]
static extern int DeleteObject(IntPtr o);
public static BitmapSource BitmapToBitmapSource(System.Drawing.Bitmap source)
{
IntPtr ip = source.GetHbitmap();
BitmapSource bs = null;
try
{
bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(ip,
IntPtr.Zero, Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}
finally
{
DeleteObject(ip);
}
return bs;
}
问题在于显示图片时内存峰值和总内存使用量会飙升。我用来测试的图片是一张5000x5000的jpeg图片。FreeImage报告称它在内存中占用了70MB,这是正确的。如果运行以下代码片段,我的应用程序将占用约100MB(30MB用于WPF,70MB用于图片):
_rawImage = new FreeImageBitmap(path);
运行完整代码时,内存飙升到约280MB,这太多了。在生产代码中,我可以清除所有未使用的项,但最初的峰值太高了。我使用IrfanView进行图像浏览,对于相同的图像,它只占用77MB的内存。
如果有解决方案,我想要解决加载和将图像转换为WPF Image可以显示的格式所需的峰值。如果可能,进一步减少RAM使用率。我处理大型图像,如果每次加载一个图像需要3倍的内存,那就太可怕了。我对WPF和总体上的这些东西都很陌生,所以可能会有我不知道的东西。
如果在WPF中没有可能的解决方案,还有其他的东西吗?我愿意听取建议。
我尝试过搜索,但未能找到任何解决当前问题的内容。
非常感谢。