3

画面に表示する必要がある画像データを含む ushort[] があり、その時点で Windows.System.Drawing.Bitmap を作成し、これを BitmapImage に変換していますが、これは遅くて非効率な方法のように感じます。

ushort[] の BitmapImage を作成する最速の方法は誰ですか?

または、代わりにデータから ImageSource オブジェクトを作成しますか?

ありがとう、

エーモン

4

1 に答える 1

5

BitmapをBitmapImageに変換するための以前の方法は次のとおりです。

MemoryStream ms = new MemoryStream(); 
bitmap.Save(ms, ImageFormat.Png); 
ms.Position = 0; 
BitmapImage bi = new BitmapImage(); 
bi.BeginInit(); 
bi.StreamSource = ms; 
bi.EndInit();

私はそれを使用してそれをスピードアップすることができました

Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), 
                                      IntPtr.Zero, 
                                      Int32Rect.Empty,
                                      System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());

編集:これを使用する人は誰でも、bitmap.GetHbitmapがアンマネージオブジェクトを作成することを知っている必要があります。これはアンマネージであるため、.netガベージコレクターによって取得されず、メモリリークを回避するために削除する必要があります。これを解決するには、次のコードを使用してください:

    [System.Runtime.InteropServices.DllImport("gdi32.dll")]
    public static extern bool DeleteObject(IntPtr hObject);

    IntPtr hBitmap = bitmap.GetHbitmap();
    try
    {
        imageSource = Imaging.CreateBitmapSourceFromHBitmap(hBitmap,
                                                            IntPtr.Zero,
                                                            Int32Rect.Empty,
                                                            System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
    }
    catch (Exception e) { }
    finally
    {
        DeleteObject(hBitmap);
    }

(のようなdllをインポートする必要はあまりありませんが、これはmsdnから取得されたものであり、この問題を回避する唯一の方法のようです-http: //msdn.microsoft.com/en-us/library/1dz311e4.aspx

于 2011-03-21T11:22:08.687 に答える