/// キャプチャしたHBitmapをBitmapSource(Freezed)にして返す /// @param request スクリーンキャプチャ設定をまとめたリクエスト /// @return スクリーンキャプチャ結果が格納されたBitmapSource private BitmapSource Capture(ScreenCaptureRequest request) { if (request.ClippingWidth <= 0 || request.ClippingHeight <= 0) { // Debug.WriteLine("Invalid clipping size", "ScreenCaptureTimer.CaptureByGetDIBits"); return null; } // HBitmapからBitmapSourceを作成 BitmapSource bitmap = null; using (var result = request.Execute()) { if (result == null) return bitmap; // HBitmapからBitmapSourceに変換 bitmap = Imaging.CreateBitmapSourceFromHBitmap( result.Bitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); // Debug.WriteLine(string.Format("Captured: {0:D}x{1:D}", // bitmap.PixelWidth, bitmap.PixelHeight), // "ScreenCapture"); } // Alphaチャンネル情報を削除 bitmap = new FormatConvertedBitmap(bitmap, PixelFormats.Bgr32, null, 0.0); /// @todo(me) あまり大きな画像をメモリにおいておきたくない。 /// とはいえ、TransformedBitmapはちょっと重過ぎる。 /// メモリよりもCPUリソースを残しておきたいのでこのままでいいかも。 //bitmap = this.Resize(bitmap); // スレッド越しにアクセスされるためFreeze bitmap.Freeze(); return bitmap; }