Поиск изображения на экране - 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 );
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы