Быстро определить цвет пиксела

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ghepard
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.01.2015 (Вс) 11:13

Быстро определить цвет пиксела

Сообщение Ghepard » 18.01.2015 (Вс) 11:23

На экране меняется в определенном месте цвет, и нужно моментально среагировать как только цвет будет нужный. Ключевое слово моментально. Можно сделать скриншот всего экрана, проанализировать определенный цвет пиксела и задача решена, но целый экран скринить несколько раз в секунду это очень загрузит комп и "моментально" не получится. Есть ли какой то способ скринить всего 1 пиксел на экране? Если наглядно, то нужно жать на кнопочку как только в выделенной области будет зеленый цвет, скорость очень большая, анализ я так пердпологаю должен быть не меньше 10 раз в секунду http://prntscr.com/5tw65j

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Быстро определить цвет пиксела

Сообщение Хакер » 18.01.2015 (Вс) 15:45

Ну я бы не сказал, что скриншотить экран это долго. Довольно-таки быстрая операция.

А если интересует цвет одной точки, есть API-функция GetPixel.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Ghepard
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.01.2015 (Вс) 11:13

Re: Быстро определить цвет пиксела

Сообщение Ghepard » 05.05.2015 (Вт) 21:25

да уж растянулся мой проектик по времени))) Спасибо, GetPixel это именно то что и нужно было. Теперь вопрос позамароченней. Анализирую несколько точек на экране, на предмет появления зеленого оттенка, как видно из скрина http://prntscr.com/71vuea фон под искомым полупрозрачным изображением неоднороден. Соответственно нужно искать не определенный один цвет, а целый диапазон. Методом сбора статистики за несколько дней конечно можно вычислить все цвета, но наверняка можно искать целый диапазон зеленого. Анализируемый проект грубо говоря это веб страница, и на рабочем столе режим 32 бит. Искомый диапазон, это зеленый, что то примерно такое http://prntscr.com/71vx0h. То есть как записать

Код: Выделить всё
Private Sub Label1_Change()
if Label1.Caption(значение цвета в пикселе, например FFFF00) =(есть в диапазоне) зеленого цвета  then "Ура"
End Sub

вот в вики таблицу цветов посмотрел, вроде бы номера норм, те что надо, но как бы это запрограммировать, совсем не соображу как диапазон для сравнения указать https://ru.wikipedia.org/wiki/%C2%E8%EA ... 5%F2%EE%E2
Последний раз редактировалось Хакер 06.05.2015 (Ср) 20:29, всего редактировалось 1 раз.
Причина: Добалвение тега [code]

Ghepard
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.01.2015 (Вс) 11:13

Re: Быстро определить цвет пиксела

Сообщение Ghepard » 05.05.2015 (Вт) 21:42

есть ли (FFFF00) в диапазоне (YellowGreen#9ACD32 GreenYellow#ADFF2F Chartreuse#7FFF00 LawnGreen#7CFC00 Green#008000 Lime#00FF00 LimeGreen#32CD32 SpringGreen#00FF7F) я думаю это все варианты зеленого?

Ghepard
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.01.2015 (Вс) 11:13

Re: Быстро определить цвет пиксела

Сообщение Ghepard » 05.05.2015 (Вт) 21:44

Код: Выделить всё
if FFFF00 <> 9ACD32-00FF7F then
     end
   else
    msb"УРА!"
end if


как это можно написать?


[Хакер] :: Сообщение отредактировано. Если ты не начнёшь оформлять посты нормально, используя соответствующие теги, то будешь наказан.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Быстро определить цвет пиксела

Сообщение Mikle » 05.05.2015 (Вт) 22:09

Нужно раскладывать на RGB и проверять отдельно. Как-то так:
Код: Выделить всё
  Dim C As Long
  Dim D As Long
  Dim R As Long, G As Long, B As Long
  Dim tR As Long, tG As Long, tB As Long

  'Задаём образец (цвет &H40E040)
  tR = &H40
  tG = &HE0
  tB = &H40

  'Задаём допуск
  D = 25

  'Берём цвет точки
  C = GetPixel()
  R = (C And &HFF0000) \ &H10000
  G = (C And &HFF00&) \ &H100&
  B = C And &HFF&

  If Abs(R - tR) < D And Abs(G - tG) < D And Abs(B - tB) < D Then
    'Цвет в диапазоне
  Else
    'Цвет не в диапазоне
  End If

Ghepard
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.01.2015 (Вс) 11:13

Re: Быстро определить цвет пиксела

Сообщение Ghepard » 06.05.2015 (Ср) 20:05

Спасибо примерно понял. Поставил на рабочем столе 16 бит, чтоб меньше вариантов на картинке было. не совсем понятна запись:
'Берём цвет точки
Код: Выделить всё
  C = GetPixel()
  R = (C And &HFF0000) \ &H10000
  G = (C And &HFF00&) \ &H100&
  B = C And &HFF&


я получаю значение сразу 16-ричным кодом С=Hex(GetPixel()), то есть у нас максимально может быть FFFFFF, где грубо говоря раскладываем число FF FF FF от каждого пляшем +-25 диапазон, это понятно.
Код: Выделить всё
С=FFFFFF=16777215
R= (16777215 And ?) 
"(C And &HFF0000) \ &H10000"
это какой-то приём форматирования записи, отсекаем первые две цифры? не могу понять, не хватает опыта)

[Хакер] :: Сообщение отредактировано. Если ты не начнёшь оформлять посты нормально, используя соответствующие теги, то будешь наказан.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Быстро определить цвет пиксела

Сообщение Хакер » 06.05.2015 (Ср) 20:39

Ghepard писал(а):я получаю значение сразу 16-ричным кодом С=Hex(GetPixel())

Глупость.

Компьютер работает с двоичным представлением чисел и только. Поскольку никаких других представлений чисел он не понимает, обычно даже не упоминают двоичную систему счисления, а просто говорят, что компьютер работает с числами.

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


Когда ты пользуешься функцией Hex, ты из числа, кодирующего цвет — лёгкого и удобного для обработки, получаешь строку, которая является последовательностью чисел, где каждое число кодирует символ, отождествляющий цифру шестнадцатеричной системы счисления, и где все символы выстроены так, что их можно интерпретировать как шестнадцатеричное представление исходно числа.

Вывод: осмысленным применением функции Hex может быть только получение строки из числа в том случае, если число нужно показать пользователю в удобном для него виде (в том случае, если удобным видом является 16-ричная запись). Для обработки делать из числа строку — вред.

Ghepard писал(а):это какой-то приём форматирования записи, отсекаем первые две цифры? не могу понять, не хватает опыта)

Это не приём форматирование, это извлечение требуемых битов из 32-битного числа.

Оператор And с помощью нужной маски зануляет все лишние биты, после его применения в числе остаются только нужные биты.
Целочисленное деление на 2 сдвигает число на один бит вправо. Целочисленное деление на 4 — на два бита вправо. Деление на 8 — на 3 бита. Деление на 2n — на n битов вправо. В данном случае производится сдвиг на 16 бит.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Ghepard
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.01.2015 (Вс) 11:13

Re: Быстро определить цвет пиксела

Сообщение Ghepard » 06.05.2015 (Ср) 22:11

спасибо разобрался, всё работает

Ghepard
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.01.2015 (Вс) 11:13

Re: Быстро определить цвет пиксела

Сообщение Ghepard » 14.06.2015 (Вс) 17:15

столкнулся с новой проблемой.... на основной машине все замечательно работает, на виртуальной, программа как бы видит сквозь игру на движке юнити, показывает цвет рабочего стола а не игры, принтскрин тоже фотает пустое окошко игры.
пользовался этими средствами VB:
Код: Выделить всё
Private Declare Function CreateDC& Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, lpInitData As Any)
screendc = CreateDC("DISPLAY", "", "", 0&)
x0y0cvet.BackColor = GetPixel(screendc, x0.Text, y0.Text)

Что может помочь в моей ситуации?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Быстро определить цвет пиксела

Сообщение Хакер » 14.06.2015 (Вс) 18:52

Ghepard писал(а):Что может помочь в моей ситуации?

Сидеть и разбираться, на каком принципе основан, скажем, Fraps. Если, конечно, он твою игру берёт.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Ghepard
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.01.2015 (Вс) 11:13

Re: Быстро определить цвет пиксела

Сообщение Ghepard » 14.06.2015 (Вс) 18:53

читаю с переводчиком по этой теме, может тут кто из спецов тоже почитает и найдется решение https://forums.virtualbox.org/viewtopic ... en#p231493

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Быстро определить цвет пиксела

Сообщение Хакер » 14.06.2015 (Вс) 19:01

А, так дело в виртуализации. Тогда, возможно, простейшим способом для тебя будет снимать скриншоты на хосте.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Быстро определить цвет пиксела

Сообщение The trick » 14.06.2015 (Вс) 19:05

Насколько помню Fraps внедряется в процесс и перехватывает вывод DirectX.
UA6527P

Ghepard
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.01.2015 (Вс) 11:13

Re: Быстро определить цвет пиксела

Сообщение Ghepard » 14.06.2015 (Вс) 19:19

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Быстро определить цвет пиксела

Сообщение Хакер » 14.06.2015 (Вс) 19:20

Хакер писал(а):Тогда, возможно, простейшим способом для тебя будет снимать скриншоты на хосте.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Ghepard
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.01.2015 (Вс) 11:13

Re: Быстро определить цвет пиксела

Сообщение Ghepard » 14.06.2015 (Вс) 19:52

не совсем понял) делать скриншоты для виртуальной машины из хостовой? поясню задачу подробнее:
на хосте запушен один аккаунт, на виртуалке в фоновом режиме работает другой аккаунт
поскольку вариант с виртуальной машиной отпадает, то как вариант, запускать 2 аккаунта на хосте, один через клиент программы, другой через браузер , но с указанием прокси-сервера, чтобы отличались ip
появляется задача, захват приложения в браузере, и выполнения там автоматических действий, типа считывания цвета и кликов мышки, и все это в фоновом режиме, чтобы не блокировать мышку для других задач.
вот ищу на форуме что-то типа про захват приложения, подскажите правильно ли ищу?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Быстро определить цвет пиксела

Сообщение Хакер » 14.06.2015 (Вс) 19:53

Ghepard писал(а):не совсем понял) делать скриншоты для виртуальной машины из хостовой?

Да, ты правильно понял. Дальнейшее пояснение малополезно — оно никак не влияет на актуальность этого совета.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Ghepard
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.01.2015 (Вс) 11:13

Re: Быстро определить цвет пиксела

Сообщение Ghepard » 20.06.2015 (Сб) 22:46

установил Fraps99, проверил и на хостовой и на виртуальной, захватывает норм скриншот. Попробовал свернуть игру(есть такая функция у Fraps99) и заскринить, игра вылетает. Остается вернуться к варианту с виртуальной машиной. Т.е. написать Fraps на Vb. У кого нибудь может есть пример?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Быстро определить цвет пиксела

Сообщение Mikle » 21.06.2015 (Вс) 12:24

Игры, как правило, работают в полноэкранном режиме. Это плохо сочетается с понятием "свернуть", то есть игры, как правило, поддерживают сворачивание, но становятся на паузу. На DirectX до девятого включительно это, кроме того, чревато потерей устройства рендера и всех Unmanaged ресурсов, как там обстоят дела в OpenGL - я не в курсе.
Я так понял - ты пишешь игрового бота. Чтобы не сворачивать игру, и при этом выводить какую-то свою информация, можно переключить игру в оконный режим, большинство игр это поддерживает, в этом режиме так же больше шансов, что будут корректно срабатывать API функции, типа GetPixel(). Если оконного режима нет, можно попробовать вывод на второй монитор.

Ghepard
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.01.2015 (Вс) 11:13

Re: Быстро определить цвет пиксела

Сообщение Ghepard » 02.09.2015 (Ср) 8:11

в свернутом как пишут для uopilot не будет работать, оконный есть, можно сдвинуть за край экрана, чтобы не мешало


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

    TopList