none
UWPのイメージクラスをWPFのイメージクラスに変換したい。 RRS feed

  • 質問

  • WPF で UWPのMediaCaptureクラスを使用してカメラを作成しています。
    LowLagPhotoCaptureで撮影した場合にCapturedPhotoが取得できるのですが、UPWのクラスなのでWPFの画面上(Imageコントロール)で表示できません。
    Windows.Media.Capture.CapturedPhoto(UWP) から System.Windows.Media.ImageSource(WPF) に変換できないでしょうか?

    単純に以下のコードでは動きませんでした

    var capturedPhoto = await _lowLagPhotoCapture.CaptureAsync();
    System.Windows.Media.Imaging.BitmapFrame.Create( capturedPhoto.Frame.AsStream() )




    2018年3月9日 10:05

回答

  • 試していませんが、以下の手順でどうでしょうか?

    1. CapturedPhoto.Frame.SoftwareBitmapでSoftwareBitmapオブジェクトを取得する
    2. Windows.Storage.Streams.Bufferをnewし、SoftwareBitmapのCopyToBufferでコピーする
    3. Buffer.ToArray()でbyte[]に変換する(拡張メソッドであり、アセンブリの参照の追加が必要かも
    4. SoftwareBitmapの各プロパティを基に、System.Windows.Media.Imaging.WriteableBitmapをnewする(※たぶんPixelFormatは変換メソッドの類が存在していないので、ご自身で置き換えてください)
    5. WriteableBitmap.Lockでロックし、System.Runtime.InteropServices.Marshal.Copyでbyte[]からWriteableBitmap.BackBufferにコピーして、WriteableBitmap.Unlock
    • 回答としてマーク kitunechan 2018年3月13日 5:56
    2018年3月9日 11:03

すべての返信

  • 試していませんが、以下の手順でどうでしょうか?

    1. CapturedPhoto.Frame.SoftwareBitmapでSoftwareBitmapオブジェクトを取得する
    2. Windows.Storage.Streams.Bufferをnewし、SoftwareBitmapのCopyToBufferでコピーする
    3. Buffer.ToArray()でbyte[]に変換する(拡張メソッドであり、アセンブリの参照の追加が必要かも
    4. SoftwareBitmapの各プロパティを基に、System.Windows.Media.Imaging.WriteableBitmapをnewする(※たぶんPixelFormatは変換メソッドの類が存在していないので、ご自身で置き換えてください)
    5. WriteableBitmap.Lockでロックし、System.Runtime.InteropServices.Marshal.Copyでbyte[]からWriteableBitmap.BackBufferにコピーして、WriteableBitmap.Unlock
    • 回答としてマーク kitunechan 2018年3月13日 5:56
    2018年3月9日 11:03
  • できました。
    ありがとうございます。

    var softwareBitmap = capturedPhoto.Frame.SoftwareBitmap; var buffer = new Windows.Storage.Streams.Buffer( (uint)capturedPhoto.Frame.Size ); softwareBitmap.CopyToBuffer( buffer ); var bufferArray = buffer.ToArray(); var writeableBitmap = new WriteableBitmap( softwareBitmap.PixelWidth, softwareBitmap.PixelHeight, softwareBitmap.DpiX, softwareBitmap.DpiY, PixelFormats.Bgra32, null ); writeableBitmap.Lock(); Marshal.Copy( bufferArray, 0, writeableBitmap.BackBuffer, bufferArray.Length ); writeableBitmap.Unlock(); writeableBitmap.Freeze();

    LowLagPhotoCaptureを生成する時にエンコードを指定する必要がありました。

    _lowLagPhotoCapture = await _mediaCapture.PrepareLowLagPhotoCaptureAsync( ImageEncodingProperties.CreateUncompressed( MediaPixelFormat.Bgra8 ) );


    また、SoftwareBitmapを使用せずにもできました。

    var frame = capturedPhoto.Frame; var buffer = await capturedPhoto.Frame.ReadAsync( new Windows.Storage.Streams.Buffer( (uint)frame.Size ), (uint)frame.Size, InputStreamOptions.None ); var bufferArray = buffer.ToArray(); var writeableBitmap = new WriteableBitmap( (int)frame.Width, (int)frame.Height, 96, 96, PixelFormats.Bgra32, null ); writeableBitmap.Lock(); Marshal.Copy( bufferArray, 0, writeableBitmap.BackBuffer, bufferArray.Length ); writeableBitmap.Unlock(); writeableBitmap.Freeze();


    2018年3月13日 5:56