3

.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 に可能な解決策がない場合は、何か別の方法がありますか? 私は提案を受け付けています。

検索してみましたが、現在の問題を解決するものは見つかりませんでした。

どうもありがとう。

4

1 に答える 1

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;
    }
}

平均メモリ使用量: 5000 x 5000 jpeg で 130 mb。

于 2013-06-04T18:36:51.733 に答える