Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка цвета определенного пикселя 
:(
    Опции темы
Tokagero
Дата 17.8.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Суть в том чтоб делать скриншот раз в секунду гдето и проверять, если пиксель НЕ такого-то цвета тогда имитировать нажатие ф1 ... Создание для онлайн-игры програмки для автоматического использования зелий (проверка строки жизни)... Как проверить является ли пиксель нужного цвета?
PM MAIL   Вверх
Mikh@il
Дата 17.8.2007, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Пиксель состоит из трех-каналов(для RGB-палитры), получи значения красного, зеленого и синего.
Значения цвета канала от 0 до 255.

Вот те пример
Код



 Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
  for y:=0 to Image1.Picture.Bitmap.Height-1 do
   begin
    P:=Image1.Picture.Bitmap.ScanLine[y];                             // ТУТ P - это массив P:PbyteArray;
     for x:=3 to 3*Image1.Picture.Bitmap.Width do
        if x mod 3=0 then
         begin
          p[x-3]:= ---- это синий;
          p[x-2]:= ---- это зеленый;
          p[x-1]:= ---- это красный;
         end;







  А вообще как я понял суть твоей проблемы тебе надо сравнивать твою картинку(полоску жизней) с полной полоской жизни (100%-здоровье), так есть решение проще, берешь считаешь к-во пикселей в твоей полоске (это делаешь один единственный раз), после чего когда твои жизни уменьшаются твои действия следующие:

1. Предположим в полоске уровень жизни обозначен красным цветом
2. Считаешь к-во красных пикселей
3. Полученный результат  делишь на к-во пикселей во всей полоске (результат больше единицы быть не может, если еще и на 100% умножить то получишь процент здоровья, если он меньше 100 - то вливаешь в себе бутыль пива и закусываешь рыбкой и у тя опять 100% здоровья)

Добавлено через 2 минуты и 44 секунды
Пиксель состоит из трех-каналов(для RGB-палитры), получи значения красного, зеленого и синего.
Значения цвета канала от 0 до 255.

Вот те пример
Код



 Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
  for y:=0 to Image1.Picture.Bitmap.Height-1 do
   begin
    P:=Image1.Picture.Bitmap.ScanLine[y];                             // ТУТ P - это массив P:PbyteArray;
     for x:=3 to 3*Image1.Picture.Bitmap.Width do
        if x mod 3=0 then
         begin
          p[x-3]:= ---- это синий;
          p[x-2]:= ---- это зеленый;
          p[x-1]:= ---- это красный;
         end;







  А вообще как я понял суть твоей проблемы тебе надо сравнивать твою картинку(полоску жизней) с полной полоской жизни (100%-здоровье), так есть решение проще, берешь считаешь к-во пикселей в твоей п

Добавлено через 2 минуты и 57 секунд
Пиксель состоит из трех-каналов(для RGB-палитры), получи значения красного, зеленого и синего.
Значения цвета канала от 0 до 255.

Вот те пример
Код



 Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
  for y:=0 to Image1.Picture.Bitmap.Height-1 do
   begin
    P:=Image1.Picture.Bitmap.ScanLine[y];                             // ТУТ P - это массив P:PbyteArray;
     for x:=3 to 3*Image1.Picture.Bitmap.Width do
        if x mod 3=0 then
         begin
          p[x-3]:= ---- это синий;
          p[x-2]:= ---- это зеленый;
          p[x-1]:= ---- это красный;
         end;







  А вообще как я понял суть твоей проблемы тебе надо сравнивать твою картинку(полоску жизней) с полной полоской жизни (100%-здоровье), так есть решение проще, берешь считаешь к-во пикселей в твоей п
PM MAIL   Вверх
Tokagero
Дата 18.8.2007, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Mikh@il, Большое спасибо но моя идея немного другая...

Я проверяю только один  пиксель полоски.  Допустим, всего 100 жизней. А зелья восполняют 25. Я беру примерно 70-75ый пиксель и проверяю Если он такого-то (светлокрасного) цвета то ничего, а если она НЕ этого (темнокрасного, типа пустое) то тогда имитировать F1 (зелье)... 
Еще одна проблема - на скриншоте наверно цвета будут... не очень качественные и часто пиксели будут изза качества изображения иметь искаженный цвет

Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  123.jpg 25,24 Kb
PM MAIL   Вверх
Mikh@il
Дата 18.8.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Tokagero - у тя на картинке очень красивые цифорки жизней, белые и ровненькие, я бы распозновал их. 
1. Проведи бинаризацию, все что не белое будет черные, а все что белое останется белым, после чего выдели границы цифорок по вертикали (по горизонтали не надо, т.к. у тя цифры в одну строку), и сравни с эталоном (В эталон нарежь цифры из этой же картинки их всего будет - 10)
Работать будет быстро, а погрешности никакой.
PM MAIL   Вверх
Tokagero
Дата 18.8.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Mikh@il, заманчиво но звучит сложно. Есть примеры?
PM MAIL   Вверх
Mikh@il
Дата 19.8.2007, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Если распознать сложно делай по пикселам.

1. Для простоты преобразуешь изо-ение в оттенки серого:
Преобразование к оттенкам серого заключается в получении яркости каждой точки по известной формуле (Y:=0.3*R+0.59*G+0.11*B) и последующем копировании полученного значения во все три канала (R=G=B:=Y). 

Код

  Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
  for y:=0 to Image1.Picture.Bitmap.Height-1 do
   begin
    P:=Image1.Picture.Bitmap.ScanLine[y];
     for x:=3 to 3*Image1.Picture.Bitmap.Width do
        if x mod 3=0 then
         begin
          p[x-3]:=Round(0.11*P[x-3]+0.59*p[x-2]+0.3*p[x-1]);
          p[x-2]:=p[x-3];
          p[x-1]:=p[x-2];
         end;
   end;



2. Проверяешь пикселы
 
Берешь первую строку сканируешь и заносишь в массив 
Код

  
 Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
   P:=Image1.Picture.Bitmap.ScanLine[0];                             // ТУТ P - это массив P:PbyteArray;
     for x:=3 to 3*Image1.Picture.Bitmap.Width do
        if x mod 3=0 then
         begin
         if p[x-3]<>'Нужному значению яркости пиксела' then ТУТ КОД Эмуляции нажатия F1 для принятия зелья ;
         end;




Вот и все!

Добавлено через 2 минуты и 45 секунд
Если распознать сложно делай по пикселам.

1. Для простоты преобразуешь изо-ение в оттенки серого:
Преобразование к оттенкам серого заключается в получении яркости каждой точки по известной формуле (Y:=0.3*R+0.59*G+0.11*B) и последующем копировании полученного значения во все три канала (R=G=B:=Y). 

Код

  Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
  for y:=0 to Image1.Picture.Bitmap.Height-1 do
   begin
    P:=Image1.Picture.Bitmap.ScanLine[y];
     for x:=3 to 3*Image1.Picture.Bitmap.Width do
        if x mod 3=0 then
         begin
          p[x-3]:=Round(0.11*P[x-3]+0.59*p[x-2]+0.3*p[x-1]);
          p[x-2]:=p[x-3];
          p[x-1]:=p[x-2];
         end;
   end;



2. Проверяешь пикселы
 
Берешь первую строку сканируешь и заносишь в массив 
[code=delphi]
  
 Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
   P:=Image1.Picture.Bitmap.ScanLine[0];

Добавлено через 2 минуты и 57 секунд
Если распознать сложно делай по пикселам.

1. Для простоты преобразуешь изо-ение в оттенки серого:
Преобразование к оттенкам серого заключается в получении яркости каждой точки по известной формуле (Y:=0.3*R+0.59*G+0.11*B) и последующем копировании полученного значения во все три канала (R=G=B:=Y). 

Код

  Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
  for y:=0 to Image1.Picture.Bitmap.Height-1 do
   begin
    P:=Image1.Picture.Bitmap.ScanLine[y];
     for x:=3 to 3*Image1.Picture.Bitmap.Width do
        if x mod 3=0 then
         begin
          p[x-3]:=Round(0.11*P[x-3]+0.59*p[x-2]+0.3*p[x-1]);
          p[x-2]:=p[x-3];
          p[x-1]:=p[x-2];
         end;
   end;



2. Проверяешь пикселы
 
Берешь первую строку сканируешь и заносишь в массив 
[code=delphi]
  
 Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
   P:=Image1.Picture.Bitmap.ScanLine[0];
PM MAIL   Вверх
pseud
Дата 21.8.2007, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: нет
Всего: 40



Цитата(Tokagero @  17.8.2007,  14:30 Найти цитируемый пост)
Как проверить является ли пиксель нужного цвета?


у компонента TCanvas есть такая пропертя:
Код

property Pixels[X, Y: Integer]: TColor;


вот и делай

Код

var 
  cnv: Tcanvas;
begin
  cnv := ...
  if cnv.Pixels[100, 10] = clGreen then
    Хайль гитлер




Это сообщение отредактировал(а) pseud - 21.8.2007, 10:11


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.