С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/56: Рейтинг темы: голосов - 56, средняя оценка - 4.54
1 / 1 / 0
Регистрация: 03.01.2010
Сообщений: 27

Поиск изображения на экране

08.03.2013, 17:25. Показов 11115. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно сделать метод, который будет искать на экране определённое изображение. Ни в каком месте, ни размер изображения нам заранее не известны (каждый раз по разному). Я уже сделал такой метод, который находит его по пиксельно , но это очень долго. Есть ли другой способ или как можно оптимизировать мой метод.
Я слышал, что как то можно по байтам определять.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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;
        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.03.2013, 17:25
Ответы с готовыми решениями:

Рисование изображения на экране
Здравствуйте. Я вторую неделю изучаю шарп. Не успел добраться даже до основ .NET. Но есть интерес создать приложение, которое было бы...

Поиск изображения на экране
Нужно сделать метод, который будет искать на экране определённое изображение. Ни в каком месте, ни размер изображения нам заранее не...

Поиск пикселя и поиск изображения на экране
Переписываю код из clickermann для запуска его на C++. Мне нужны две функции которые выполняли бы сканирование экрана и поиск пикселя...

7
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
08.03.2013, 17:39
Вы задаете вопросы и не читаете ответы. Тут, да и в других темах вам несколько человек уже отвечали-вы все равно создаете повторяющиеся. Я там класс выкладывал готовый, замерял скорость и тд, и множество разных вариантов там было упомянуто.
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
08.03.2013, 19:22
но это очень долго
докупите "железа", будет быстрее
Я слышал, что как то можно по байтам определять.
где слышал?
можно оптимизировать след. образом - сверять не попиксельно, а взять из исходного изображения 20-50 пикселей, расположенных в разных местах, в одинаковом расстоянии друг от друга , и сверять. а то я так понял - сейчас идет тупо перебор по всем пикселям? если нашли первый, то сверяем второй, потом третий и тд.?
0
1 / 1 / 0
Регистрация: 03.01.2010
Сообщений: 27
08.03.2013, 19:33  [ТС]
Цитата Сообщение от Winhttp22 Посмотреть сообщение
а то я так понял - сейчас идет тупо перебор по всем пикселям? если нашли первый, то сверяем второй, потом третий и тд.?
Верно.


Цитата Сообщение от Winhttp22 Посмотреть сообщение
докупите "железа", будет быстрее
у мя 4х ядерный 3.3 ггрц , и у меня на это уходит целая секунда. Я представляю что будет на одноядерном 1.6 ггрц
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
08.03.2013, 19:36
чтобы понятней было -
Миниатюры
Поиск изображения на экране  
0
1 / 1 / 0
Регистрация: 03.01.2010
Сообщений: 27
08.03.2013, 19:37  [ТС]
Цитата Сообщение от EvilFromHell Посмотреть сообщение
Вы задаете вопросы и не читаете ответы. Тут, да и в других темах вам несколько человек уже отвечали-вы все равно создаете повторяющиеся. Я там класс выкладывал готовый, замерял скорость и тд, и множество разных вариантов там было упомянуто.
Это было давно, я и не думал, что кто то ответил.
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
08.03.2013, 19:57
кстати - если еще перебирать скажем каждый второй пиксель - время уменьшится в два раза а если каждый третий - в три раза, а если каждый четвертый....

Добавлено через 19 минут
придумал такой интересный алгоритм надо будет попробывать воплотить его в жизнь на досуге
0
 Аватар для AlexAsche
78 / 78 / 15
Регистрация: 27.01.2013
Сообщений: 323
08.03.2013, 20:35
Можете еще попробовать например скопировать в массив байтов и сравнивать их.

Пример как скопировать взято отсюда:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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 );
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.03.2013, 20:35
Помогаю со студенческими работами здесь

Нету изображения на экране
Здравствуйте,столкнулся с такой проблемой: Решил я включить в биосе Intel Quick Synk,в моем биосе он назывался Igp вроде бы. Так...

Помехи изображения на экране
Ноут Nautilus z770 Помогите разобраться в чем проблема... иногда через некоторое время работы ноута, появляются непонятные...

Нет изображения на экране
привет народ у меня мега проблема при включении п.к. не идет изображение на экран пробовал с 2-мя видюхами nvidia geforce 6600gt и zotac...

Нет изображения на экране
Всем привет! У моего нетбука emachines не включается экран, может проблема с видеокартой? Или другие причины?

Подмена изображения на экране
Как написать программу, которая в реальном времени перехватывает изображение на экране и каким-то образом его модифицирует (переворачивает,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru