Поиск изображения на экране - C#
Формулировка задачи:
Нужно сделать метод, который будет искать на экране определённое изображение. Ни в каком месте, ни размер изображения нам заранее не известны (каждый раз по разному). Я уже сделал такой метод, который находит его по пиксельно , но это очень долго. Есть ли другой способ или как можно оптимизировать мой метод.
Я слышал, что как то можно по байтам определять.
public static Boolean Picture_In(Bitmap pic)
{
int a = 0;
Boolean bol = false;
Pixel p = new Pixel();
Point point = new Point(0, 0);
Bitmap screen = p.GetScreen();
while (a++ < (SystemInformation.PrimaryMonitorSize.Width - (pic.Width - 1)) * (SystemInformation.PrimaryMonitorSize.Height - (pic.Height - 1)))
{
point = Pixel_In(0, point.Y, SystemInformation.PrimaryMonitorSize.Width - pic.Width, SystemInformation.PrimaryMonitorSize.Height - pic.Height, pic.GetPixel(0, 0));
if (point != new Point(0, 0))
{
bol = true;
for (int i = 0; i < pic.Height; i++)
{
for (int n = 0; n < pic.Width; n++)
{
if (screen.GetPixel(point.X + n, point.Y + i) == pic.GetPixel(n, i))
{
bol &= true;
}
else
{
bol = false;
screen.SetPixel(point.X, point.Y, Color.Blue);
break;
}
}
if (!bol) break;
}
}
if (point == new Point(0, 0)) break;
if (bol) return bol;
}
return bol;
}Решение задачи: «Поиск изображения на экране»
textual
Листинг программы
using System;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Imaging;
...
static void CopyExample ( ) {
using ( var bmp = new Bitmap( 100, 100 ) ) {
// Фиксируем изображение в памяти
var bd = bmp.LockBits(
new Rectangle( 0, 0, 100, 100 ),
ImageLockMode.ReadWrite,
bmp.PixelFormat
);
// Буфер под размер изображения
var buffer = new byte[bd.Stride * bd.Height];
// Копируем байтовое представление изображения
// в выделенный буфер
Marshal.Copy( bd.Scan0, buffer, 0, buffer.Length );
/*
* Выполнение некоторых модификаций над буфером
*/
// Копируем буфер обратно по адресу расположения
// изображения в памяти
Marshal.Copy( buffer, 0, bd.Scan0, buffer.Length );
// Разблокируем изображение
bmp.UnlockBits( bd );
}
}