[英]Image viewer and high ram usage
我正在使用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中沒有可能的解決方案,可能還有別的嗎? 我願意接受建議。
我試過搜索,但沒有找到任何解決我當前問題的方法。
非常感謝。
這是我的看法:
<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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.