2013-06-04 55 views
3

我正在在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中沒有可能的解決方案,也許是別的?我很樂意提供建議。

我試過搜索,但沒有找到任何解決我目前的問題。

非常感謝。

+1

我不知道freeimage是什麼,但你不需要WPF中的任何。 WPF擁有自己的一切機制,並不關心GDI或其他蹩腳的恐龍框架。你應該刪除它並使用純WPF的東西來代替。 –

+0

我需要FreeImage,因爲它支持很多像raw,hdr和psd等圖像格式。 – Edgar

+0

[這裏](http://www.codeproject.com/Articles/72002/Displaying-Raw-Images-Using-WPF)是一個使用WPF加載RAW的例子。該freeimage的東西是基於恐龍GDI的東西,這在WPF中效果不佳。 –

回答

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; 
    } 
} 

平均內存使用:130 MB在5000 X 5000的JPEG。

+0

如果image沒有載入,ActualHeight和ActualWidth將等於0.更好的是採用父容器大小。 – Evgeny

+0

有人有答案爲什麼5000 x 5000 jpeg需要WPF中幾乎100 MB的內存?我遇到了與我的應用程序確切的問題。 – deathrace