2017-03-22 16 views
0

SlimDX를 사용하여 영역을 캡처하려고합니다. 내가 의미하는 바는 [0,0]에서 [1920,1080]까지 캡처 할 생각이 없다는 것입니다. 바람직하게는 캡처에 필요한 정보가 들어있는 Rectangle 객체를 전달하고 싶습니다.SlimDX로 영역 캡처하기

CopyFromScreen과 같은 대안을 살펴보면 캡처 시간이 크게 향상되므로 SlimDX (DirectX)로이 작업을 수행하고 싶습니다.

나는 100x100 픽셀의 약 30 청크를 캡처해야하며 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