使用 SlimDX 捕获区域
Capturing a region with SlimDX
所以我正在尝试使用 SlimDX 捕获一个区域。我的意思是我不想从 [0,0]
到 [1920,1080]
进行捕获。
我最好传递一个包含捕获所需信息的 Rectangle 对象。
我想用 SlimDX (DirectX) 来做这件事,因为如果我们考虑像 CopyFromScreen
.
这样的替代方案,它会大大缩短捕获时间
我需要捕获大约 30 个 100x100 像素块,我认为使用 DirectX 可能是我最好的选择。所有起始坐标加上 width/height 都存储在整数数组中。
我目前正在使用以下代码:
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);
这段代码存在于迭代 chunks
变量的 foreach 循环中。但是,完成 30 次迭代大约需要 500 毫秒。
正如@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);
});
所以我正在尝试使用 SlimDX 捕获一个区域。我的意思是我不想从 [0,0]
到 [1920,1080]
进行捕获。
我最好传递一个包含捕获所需信息的 Rectangle 对象。
我想用 SlimDX (DirectX) 来做这件事,因为如果我们考虑像 CopyFromScreen
.
我需要捕获大约 30 个 100x100 像素块,我认为使用 DirectX 可能是我最好的选择。所有起始坐标加上 width/height 都存储在整数数组中。
我目前正在使用以下代码:
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);
这段代码存在于迭代 chunks
变量的 foreach 循环中。但是,完成 30 次迭代大约需要 500 毫秒。
正如@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);
});