2013-06-04 57 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