C# 图像查看器和高ram使用率
我正在使用.NET()的FreeImage包装器在WPF中制作一个简单的图像查看器 这是密码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
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内存吗?我的应用程序确实存在问题。