.NET ( http://freeimage.sourceforge.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 は、メモリ内で 70 MB の RAM を消費すると報告していますが、これは正しいことです。この部分だけを実行すると、私のアプリは約100MB(WPFの場合は約30、イメージの場合は70)かかります:
_rawImage = new FreeImageBitmap(path);
しかし、完全なコードを実行すると、メモリが約 280 MB に急増します。これは多すぎます。実稼働コードでは、使用されていないすべてのアイテムを明らかに処分できますが、最初のスパイクが多すぎます。私は画像の閲覧に IrfanView を使用していますが、同じ画像でわずか 77 MB のメモリしか消費しません。
画像をロードしてwpf Imageが表示できる形式に変換するのにかかるスパイクを取り除くための解決策(ある場合)が欲しいです。可能であれば、RAM の使用量をさらに減らしてください。私は大きな画像を扱っていますが、1 つの画像をロードするのに 3 倍のメモリが必要になるとしたら最悪です。私はWPFとこのようなもの全体にかなり慣れていないので、欠けているものがあるかもしれません.
WPF に可能な解決策がない場合は、何か別の方法がありますか? 私は提案を受け付けています。
検索してみましたが、現在の問題を解決するものは見つかりませんでした。
どうもありがとう。