我正在尝试编写一个程序,点击它找到的具有特定颜色的第一个像素。不幸的是,有时我的程序似乎无法检测到屏幕上确实存在颜色。我正在截取屏幕截图,然后使用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。这是什么原因?
答案 0 :(得分:1)
刚刚复制了您的方法并将其用作查找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;
}