更有效的扫描屏幕特定颜色的方法?

时间:2013-09-11 12:03:17

标签: c# pixels

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

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

如果您不想阅读整个代码,我将在此解释该过程: 基本上,程序将截取屏幕截图,并一次分析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;
            }
        }

1 个答案:

答案 0 :(得分:2)

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

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

不幸的是,使用它比GetPixel() 更加繁琐,但它可以非常快。

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