我正在在WPF使用FreeImage的包装器.NET一个简单的图像查看器(http://freeimage.sourceforge.net/)图像查看器和高RAM使用
下面是代码
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的ram,这是正确的。我的应用程序需要大约100MB(〜30 WPF和70图像),如果我只运行这一部分:
_rawImage = new FreeImageBitmap(path);
但是当完整的代码运行内存峰值约280MB是太多。在生产代码中,我显然可以处理所有未使用的物品,但最初的秒杀太多了。我使用IrfanView进行图像浏览,并使用相同的图像,它只占用77mb的内存。
我想要一些解决方案(如果有的话)摆脱它加载和转换图像为wpf图像可以显示的格式所需的峰值。如果可能的话,可能进一步减少内存使用量我使用大图片,如果它需要3倍内存来加载一张图片,那很糟糕。我对WPF和这个东西都比较陌生,所以可能会有一些我错过的东西。
如果在WPF中没有可能的解决方案,也许是别的?我很乐意提供建议。
我试过搜索,但没有找到任何解决我目前的问题。
非常感谢。
我不知道freeimage是什么,但你不需要WPF中的任何。 WPF拥有自己的一切机制,并不关心GDI或其他蹩脚的恐龙框架。你应该删除它并使用纯WPF的东西来代替。 –
我需要FreeImage,因为它支持很多像raw,hdr和psd等图像格式。 – Edgar
[这里](http://www.codeproject.com/Articles/72002/Displaying-Raw-Images-Using-WPF)是一个使用WPF加载RAW的例子。该freeimage的东西是基于恐龙GDI的东西,这在WPF中效果不佳。 –