3

我目前有以下代码,它将截取屏幕截图并一次检查每个像素,如果它与我指定的颜色匹配。如果匹配,则它将鼠标移动到特定的像素位置。

如果有人能够提供帮助,我目前正在寻找一种更好更快的方法。

如果您不想阅读整个代码,我将在此处解释该过程:基本上,该程序将截取屏幕截图,并一次分析 1 个像素,并将其与所需颜色进行比较。它将从左上角的像素开始,一次水平向下移动一行,如果找不到像素,它将重新启动。这段代码也只适用于对我来说很好的 1080p 屏幕。

现在代码可以工作了,我只是在寻找一种比扫描 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;
            }
        }
4

1 回答 1

3

您实际上无法避免线性搜索,但您可以使用Bitmap.LockBits().

Bitmap.LockBits()将让您将位图的复制区域阻止到本地数组中,您可以更快地搜索目标颜色。

不幸的是,这比使用起来要复杂得多GetPixel() ,但它可以快得多。

另请参阅此处的示例: http: //www.codeproject.com/Tips/240428/Work-with-bitmap-faster-with-Csharp

于 2013-09-11T12:21:05.513 回答