颜色点击器不准确

本文关键字:不准确 颜色 | 更新日期: 2023-09-27 17:49:21

我正试图编写一个程序,点击它找到的第一个像素,它有一定的颜色。不幸的是,有时我的程序似乎无法检测到屏幕上实际存在的颜色。我正在截图屏幕,然后使用GetPixel()方法来找到每个像素的颜色。

这是我使用的方法:

private static Point FindFirstColor(Color color)
{
    int searchValue = color.ToArgb();
    Point location = Point.Empty;
    using (Bitmap bmp = GetScreenShot())
    {
        for (int x = 0; x < bmp.Width; x++)
        {
            for (int y = 0; y < bmp.Height; y++)
            {
                if (searchValue.Equals(bmp.GetPixel(x, y).ToArgb()))
                {
                    location = new Point(x, y);
                }
            }
        }
    }
    return location;
}

为了截取我的屏幕截图,我使用:

private static Bitmap GetScreenShot()
    {
        Bitmap result = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
        {
            using (Graphics gfx = Graphics.FromImage(result))
            {
                gfx.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
            }
        }
        return result;
    }

即使我使用的颜色我知道是在屏幕上,它仍然返回Point.Empty。这是什么原因呢?

颜色点击器不准确

只是复制了你的方法,并将其用作查找Color.Black的颜色,它没有任何问题。

当前代码中唯一可能不正确的地方是,在找到第一个匹配点后,您没有立即返回。相反,您只需继续遍历所有点,从而导致您将返回最后一次出现的匹配颜色。

为了避免这种情况,你可以将你的代码修改为:
private static Point FindFirstColor(Color color)
{
    int searchValue = color.ToArgb();
    using (Bitmap bmp = GetScreenShot())
    {
        for (int x = 0; x < bmp.Width; x++)
        {
            for (int y = 0; y < bmp.Height; y++)
            {
                if (searchValue.Equals(bmp.GetPixel(x, y).ToArgb()))
                {
                    return new Point(x, y);
                }
            }
        }
    }
    return Point.Empty;
}