2017-03-22 36 views
0

所以我试图用SlimDX捕获区域。我的意思是,我不想从[0,0][1920,1080]。 最好我想传递一个Rectangle对象来保存捕获所需的信息。用SlimDX捕获区域

我想用SlimDX(DirectX)来做到这一点,因为如果我们看一下像CopyFromScreen这样的替代品,它将极大地提高捕获时间。

我需要捕获大约30块100x100像素,我认为使用DirectX可能是我最好的选择。所有开始的coördinates加上宽度/高度都存储在整数数组中。

我目前使用下面的代码:

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变量进行迭代。但是,这需要大约500毫秒才能完成30次迭代。

+0

是否有可能重用位图和图形?无需在每次迭代时创建并丢弃它们。 –

+0

这是必要的,因为每次迭代的“坐标”都不相同。或者你的意思是别的吗? – Arjan

+0

我看到你提到它将始终是100x100像素 –

回答

1

as @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块大约500毫秒到32块块的平均25.7毫秒! – Arjan