1

WPF キャンバスに表示される外部ソース (umnanaged dll) から多くの画像を取得しました。外部ソースは画像をレンダリングし、ポインター (IntPtr) を umnanaged メモリ、サイズ、ストライドなどに返します。

現在、これらの画像を WriteableBitmap に読み込み、Canvas の OnRender メソッドで表示しています。WriteableBitmap は、このタスクに非常にうまく適合します。

WriteableBitmap temp = new WriteableBitmap(ImageWidth, ImageHeight, 96, 96, PixelFormat, null);
temp.WritePixels(new Int32Rect(0, 0, ImageWidth, ImageHeight), pointerToImageData, ImageHeight * stride, (int)stride);

質問:

  • WritableBitmap は最初にイメージ データを別の場所 (マネージ メモリ内) にコピーしますか?
  • もしそうなら、画像データを画面に直接レンダリングする方法はありますか (たとえば、DirectX を使用しますか?)
  • 私が使用できる他のヒントやコツはありますか?

感謝と最高の願い

ダニエル

編集: Clemens による提案後に試してみました: BitmapSource.Create を使用して、このメソッドを使用すると、メソッドがイメージ全体をコピーし、書き込み可能なビットマップがコピーされない可能性があると思われるポイントまでメモリ消費が増加します。

4

1 に答える 1

0

WPF の Image コントロールには ImageSource が表示されますDrawing.ImageSystem.Windows.Interop.Imagingを使用してイメージを変換します。

画像がアンマネージ メモリにどのように保存されるかはわかりませんが、2 つの方法のいずれかを使用できます。ビットマップとして保存されている場合は、 CreateBitmapSourceFromHBitmapを使用できる場合があります。

または、 CreateBitmapSourceFromMemorySectionを使用する必要がある場合があります。方法は次のとおりです: http://social.msdn.microsoft.com/Forums/vstudio/en-US/a8d86cd0-10cc-4349-aa9c-e62d7d066508/createbitmapsourcefrommemorysection

メモリの割り当てに関しては、イメージをマネージド メモリに変換する必要があることを除けば、常にイメージをコピーする必要があります。UI スレッドは、それが作成したもの以外は操作できません。イメージを表示する前に、UI スレッドを使用してイメージをコピーする必要があります。

于 2013-08-21T06:04:15.623 に答える