如何实现屏幕中心10x10像素区域扫描 检测指定Color颜色是否存在
实现方案
你可以直接一次性捕获10x10的完整区域再遍历像素,相比循环调用单像素捕获的方案性能提升非常明显,具体实现如下:
核心思路
- 仅调用一次
CopyFromScreen捕获屏幕中心10x10的完整区域,避免重复调用API产生性能损耗 - 遍历捕获到的位图所有像素,只要存在任意一个匹配的指定紫色就返回
true,否则返回false
完整代码
using System.Drawing; using System.Windows.Forms; // 方法返回值表示是否检测到目标紫色 bool CheckCenter10x10HasPurple() { Color targetPurple = Color.FromArgb(255, 254, 93, 255); Rectangle screenBounds = Screen.PrimaryScreen.Bounds; // 计算10x10区域的左上角坐标:以中心为基准向左、向上各偏移5像素 int centerX = screenBounds.Width / 2; int centerY = screenBounds.Height / 2; int captureX = Math.Max(0, centerX - 5); int captureY = Math.Max(0, centerY - 5); // 边界兼容:避免区域超出屏幕范围触发异常 int captureWidth = Math.Min(10, screenBounds.Width - captureX); int captureHeight = Math.Min(10, screenBounds.Height - captureY); // 一次性捕获目标区域 using (Bitmap captureBmp = new Bitmap(captureWidth, captureHeight)) { using (Graphics g = Graphics.FromImage(captureBmp)) { g.CopyFromScreen(captureX, captureY, 0, 0, new Size(captureWidth, captureHeight)); } // 遍历所有像素匹配目标色 for (int x = 0; x < captureWidth; x++) { for (int y = 0; y < captureHeight; y++) { if (captureBmp.GetPixel(x, y).Equals(targetPurple)) { return true; } } } } return false; } // 调用示例 if (CheckCenter10x10HasPurple()) { // 存在指定紫色的业务逻辑 }
注意事项
- .NET Core/.NET 5+ 环境需要先安装
System.Drawing.CommonNuGet包即可正常使用 - 10x10的像素量级下直接用
GetPixel完全满足性能需求,无需额外使用LockBits做复杂优化
内容的提问来源于stack exchange,提问作者Triptox
相关产品推荐
相关产品推荐

