簡體   English   中英

圖像查看器和高RAM使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM