我正在使用FreeImage .NET for .NET(http://freeimage.sourceforge.net/)
在WPF中创建一个简单的图像查看器这是代码
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;
}
问题是显示图像时ram尖峰和整体ram使用情况。我用于测试的图像是5000x5000 jpeg。 FreeImage报告它在内存中占用70mb的ram,这是正确的。如果我只运行这部分,我的应用大约需要100mb(WPF约为30,图像为70):
_rawImage = new FreeImageBitmap(path);
但是当完整代码运行时,内存峰值大约为280mb,这太过分了。在生产代码中,我显然可以处理所有未使用的项目,但最初的峰值太多了。我使用IrfanView进行图像浏览,使用相同的图像只占用77mb的内存。
我想要一些解决方案(如果有的话)摆脱加载并将图像转换为wpf Image可以显示的格式所需的峰值。如果可能的话,可能会进一步减少RAM的使我使用大图像,如果它需要3倍内存来加载一个图像,这很糟糕。我对WPF很新,而且整体上都是这样,所以我可能会遗漏一些东西。
如果WPF中没有可能的解决方案,可能还有别的吗?我愿意接受建议。
我尝试过搜索但未找到任何解决我当前问题的方法。
非常感谢。
答案 0 :(得分:1)
这是我的看法:
<Window x:Class="LargeJpeg.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Image x:Name="Image" Stretch="None"/>
</Window>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.None;
bitmap.UriSource = new Uri(@"C:\5x5.jpg", UriKind.Absolute);
bitmap.DecodePixelWidth = (int)Image.ActualWidth;
bitmap.EndInit();
bitmap.Freeze();
Image.Source = bitmap;
}
}
平均内存使用量:5000 x 5000 jpeg上的130 MB。