我目前有以下代码,如果它与我指定的颜色匹配,它将截取每个像素一次。如果匹配则将鼠标移动到特定的像素位置。
如果有人能够提供帮助,我目前正在寻找更好,更快的方法。
如果您不想阅读整个代码,我将在此解释该过程: 基本上,程序将截取屏幕截图,并一次分析1个像素,将其与所需颜色进行比较。它将从左上角的像素开始,一次水平向下移动一行,如果无法找到像素,它将重新启动。此代码也适用于1080p屏幕,对我来说很好。
现在代码WORKS我只是在寻找一种比扫描200万像素更有效的方法。
Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height);
Graphics graphics = Graphics.FromImage(bitmap as Image);
graphics.CopyFromScreen(0, 0, 0, 0, bitmap.Size);
bool found = false;
bool one = true;
bool two = false;
int x = 0;
int y = 0;
Bitmap myBitmap = bitmap;
while (found != true)
{
Color pixelColor = myBitmap.GetPixel(x, y);
if (pixelColor == Color.FromArgb(0, 0, 0))
{
Cursor.Position = new Point(x, y);
found = true;
}
if (one == true)
{
x = x + 1;
if (x >= 1920)
{
one = false;
two = true;
x = 0;
}
}
else if (two == true)
{
y = y + 1;
if (y >= 1080)
{
y = 0;
}
one = true;
two = false;
}
}
答案 0 :(得分:2)
您实际上无法避免线性搜索,但使用Bitmap.LockBits()
可以使速度更快。
Bitmap.LockBits()
可以阻止位图的复制区域进入本地数组,您可以更快速地搜索目标颜色。
不幸的是,使用它比GetPixel()
更加繁琐,但它可以非常快。
另请参阅此处的示例:http://www.codeproject.com/Tips/240428/Work-with-bitmap-faster-with-Csharp