/// キャプチャしたbyte[]をBitmapSource(Freezed)にして返す /// @param request スクリーンキャプチャ設定をまとめたリクエスト /// @return スクリーンキャプチャ結果が格納されたBitmapSource private BitmapSource CaptureByGetDIBits(ScreenCaptureRequest request) { if (request.ClippingWidth <= 0 || request.ClippingHeight <= 0) { // Debug.WriteLine("Invalid clipping size", "ScreenCaptureTimer.CaptureByGetDIBits"); return null; } // GetDIBitsでbyte[]にデータを格納 int dpiX, dpiY; var result = request.ExecuteByGetDIBits(out dpiX, out dpiY); if (result == null) return null; var bitmap = BitmapSource.Create(request.ClippingWidth, request.ClippingHeight, dpiX, dpiY, PixelFormats.Bgr32, null, result, request.Stride); result = null; /// @todo(me) あまり大きな画像をメモリにおいておきたくない。 /// とはいえ、TransformedBitmapはちょっと重過ぎる。 /// メモリよりもCPUリソースを残しておきたいのでこのままでいいかも。 //bitmap = this.Resize(bitmap); // スレッド越しにアクセスされるためFreeze bitmap.Freeze(); return bitmap; }