C# 图像查看器和高ram使用率

C# 图像查看器和高ram使用率,c#,wpf,image,C#,Wpf,Image,我正在使用.NET()的FreeImage包装器在WPF中制作一个简单的图像查看器 这是密码 public static void OpenImage(string path) { _rawImage = new FreeImageBitmap(path); BitmapSource bs = Utils.BitmapToBitmapSource(_rawImage.ToBitmap()); mainWindow.imageComp

我正在使用.NET()的FreeImage包装器在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图像可以显示的格式所需的峰值。如果可能的话,可能会进一步减少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;
    }
}

公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
var bitmap=新的位图();
bitmap.BeginInit();
bitmap.CacheOption=BitmapCacheOption.None;
bitmap.UriSource=新Uri(@“C:\5x5.jpg”,UriKind.Absolute);
bitmap.DecodePixelWidth=(int)Image.ActualWidth;
EndInit();
bitmap.Freeze();
Image.Source=位图;
}
}

平均内存使用率:在5000 x 5000 jpeg上为130 mb

我不知道什么是freeimage,但在WPF中你不需要这些。WPF对一切都有自己的机制,并不关心GDI或其他蹩脚的恐龙框架。我需要FreeImage,因为它支持很多图像格式,比如raw、hdr和psd等等。是一个使用WPF加载原始数据的示例。freeimage是基于恐龙GDI的东西,在WPF中无法正常工作。我猜您正在将图像转换为内存中每像素32位的表示形式。5000*5000*4字节=200 MB。如果IrfanView使用GDI,并且映像位于本地硬盘上,那么它可能利用使用内存映射文件句柄来保持较低的内存需求。似乎证实了我的怀疑。如果图像未加载实际高度,则实际宽度将等于0。最好采用父容器大小。有人知道为什么5000 x 5000 jpeg在WPF中占用近100 MB内存吗?我的应用程序确实存在问题。