2017-03-22 22 views
0

SlimDXを使用して領域をキャプチャしようとしています。私が意味することは、[0,0]から[1920,1080]にキャプチャするつもりはないということです。 好ましくは、キャプチャに必要な情報を保持するRectangleオブジェクトを渡します。SlimDXで領域をキャプチャする

CopyFromScreenのような代替案を見ると、キャプチャ時間が大幅に短縮されるため、SlimDX(DirectX)でこれを行いたいと思います。

私は約100x100ピクセルのチャンクをキャプチャする必要があります。私はDirectXを使用することが私の最善の策かもしれないと思います。すべての始点座標と幅/高さは整数配列で格納されます。

私は現在、次のコードを使用しています:

Rectangle rect = new Rectangle(chunk[0], chunk[1], chunk[2], chunk[3]); 
 
Bitmap temp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb); 
 
Graphics g2 = Graphics.FromImage(temp); 
 
g2.CopyFromScreen(rect.Left, rect.Top, 0, 0, temp.Size, CopyPixelOperation.SourceCopy);

このコードは、foreachループで生活しているchunks変数に対して反復。しかし、これは30回の反復で約500msかかる。

+0

ビットマップとグラフィックスは再利用できますか?すべての反復でそれらを作成して破棄する必要はありません。 –

+0

すべての反復で「座標」が異なるため、これが必要です。それとも別のことを意味していますか? – Arjan

+0

あなたはそれが常に100x100ピクセルになると言いました。 –

答えて

1

@Nicoが指摘しているように、一度コピーしてから分割すると、多くの小さなコピーよりも高速です。ここに例があります

 var rects = Enumerable.Range(1, 30) 
      .Select(x => new Rectangle(x, x, x + 100, x + 100)); 

     var bounds = Screen.PrimaryScreen.Bounds; 
     Bitmap bigBmp = new Bitmap(bounds.Width, bounds.Height, PixelFormat.Format32bppArgb); 
     Graphics g2 = Graphics.FromImage(bigBmp); 
     g2.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy); 

     var bmps = rects.Select(rect => 
      { 
       return bigBmp.Clone(rect, PixelFormat.Format32bppArgb); 
      }); 
+0

あなたの例をありがとう。私はあなたの実装をかなり使用していませんが、私はクローニングの部分をしました。とても感謝しています。 32チャンクで500ms〜32チャンクで平均25.7msになりました! – Arjan

関連する問題