我正在使用以下代码在屏幕上扫描按钮单击。
我传递了两个位图,一个是按钮的图片,另一个是屏幕截图。
反正我可以加快这种基本方法的速度吗?
private PositionToClick IsInCapture(Bitmap searchFor, Bitmap searchIn)
{
for (int x = 0; x < searchIn.Width; x++)
{
for (int y = 0; y < searchIn.Height; y++)
{
bool invalid = false;
int k = x, l = y;
for (int a = 0; a < searchFor.Width; a++)
{
l = y;
for (int b = 0; b < searchFor.Height; b++)
{
if (searchFor.GetPixel(a, b) != searchIn.GetPixel(k, l))
{
invalid = true;
break;
}
else
l++;
}
if (invalid)
break;
else
k++;
}
if (!invalid)
return new PositionToClick() { X = x, Y = y, found = true };
}
}
return new PositionToClick();
}
答案 0 :(得分:1)
您可以先将位图转换为字节数组,然后再比较这些数组。 另外,您可以通过减去要搜索的图像的宽度和高度来限制搜索范围。 我没有测试下面的代码,这只是我的意思的说明。
private PositionToClick IsInCapture(Bitmap searchFor, Bitmap searchIn)
{
var searchForArray = ImageToByte2(searchFor);
var searchInArray = ImageToByte2(searchIn);
for (int x = 0; x <= searchIn.Width - searchFor.Width; x++)
{
for (int y = 0; y <= searchIn.Height - searchFor.Height; y++)
{
bool invalid = false;
int k = x, l = y;
for (int a = 0; a < searchFor.Width; a++)
{
l = y;
for (int b = 0; b < searchFor.Height; b++)
{
var pixelFor = searchForArray[a * searchFor.Width + b];
var pixelIn = searchInArray[k + searchIn.Width + l];
if (pixelIn != pixelFor)
{
invalid = true;
break;
}
else
l++;
}
if (invalid)
break;
else
k++;
}
if (!invalid)
return new PositionToClick() { X = x, Y = y, found = true };
}
}
return new PositionToClick();
}
public static byte[] ImageToByte2(Image img)
{
using (var stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
return stream.ToArray();
}
}