Я использую эти функции ниже, чтобы сделать снимок экрана с экрана пользователя и сравнить этот снимок экрана с изображением bmpTest, который находится в ресурсах. Если находит что-то совместимое с , bmpTest возвращает его местоположение.Снимок экрана и сравнение изображений
Моя проблема: этот алгоритм используется немного медленно и занимает около 10-15 секунд интерпретировать изображение и дать результат. Кто-нибудь из вас знает другой метод, который делает то же самое, но быстрее? И, может быть, некоторые% сходства? Я просто не мог найти в Интернете.
private Bitmap Screenshot()
{
// this is where we will store a snapshot of the screen
Bitmap bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
// creates a graphics object so we can draw the screen in the bitmap (bmpScreenshot)
Graphics g = Graphics.FromImage(bmpScreenshot);
// copy from screen into the bitmap we created
g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size);
//g.CopyFromScreen(205, 179, 660, 241, new Size(455, 62));
// return the screenshot
return bmpScreenshot;
}
private bool FindBitmap(Bitmap bmpNeedle, Bitmap bmpHaystack, out Point location)
{
for (int outerX = 0; outerX < bmpHaystack.Width - bmpNeedle.Width; outerX++)
{
for (int outerY = 0; outerY < bmpHaystack.Height - bmpNeedle.Height; outerY++)
{
for (int innerX = 0; innerX < bmpNeedle.Width; innerX++)
{
for (int innerY = 0; innerY < bmpNeedle.Height; innerY++)
{
Color cNeedle = bmpNeedle.GetPixel(innerX, innerY);
Color cHaystack = bmpHaystack.GetPixel(innerX + outerX, innerY + outerY);
if (cNeedle.R != cHaystack.R || cNeedle.G != cHaystack.G || cNeedle.B != cHaystack.B)
{
goto notFound;
}
}
}
location = new Point(outerX, outerY);
return true;
notFound:
continue;
}
}
location = Point.Empty;
return false;
}
private void button8_Click_1(object sender, EventArgs e)
{
// takes a snapshot of the screen
Bitmap bmpScreenshot = Screenshot();
// find the login button and check if it exists
Point location;
bool success = FindBitmap(Properties.Resources.bmpTest, bmpScreenshot, out location);
// check if it found the bitmap
if (success == false)
{
MessageBox.Show("Not Found");
return;
}
else
{
MessageBox.Show("Image Found");
}
}
Вместо Get-SetPixel вы должны использовать LockBits для такого анализа. См. [Здесь] (http://stackoverflow.com/questions/26224095/how-to-find-the-difference-between-two-images/26225153?s=8|0.3123#26225153) для примера. – TaW