Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2016, 13:21   #1
Brown1993
Новичок
Джуниор
 
Регистрация: 06.04.2016
Сообщений: 1
По умолчанию Не находит пиксель по цвету

Всем доброго времени суток! Уже битый день пытаюсь найти в чем же ошибка и почему алгоритм работает не до конца хорошо. Реализовал считывание скриншота в буфер через BitBlt, далее прохожу по пикселям через цикл, и если найдет нужный пиксель (по цвету) клик по нему. Проблема заключается в том что он находит этот пиксель только если он в первой половине экрана (имхо). если середине или другой половине вообще не находит. Весь инет обрыл, грешил что цикл корявый не все перебирает, потом на то что памяти в буфере не хватает. Вообщем направьте люди добрые в правильную сторону. Код под текстом)

Код:
flag:=false;
p:=rgb(79,91,84);
bit:=TBitmap.Create;
bit.Width := Screen.Width;
bit.Height := Screen.Height;
//bit.Width := 1366;
//bit.Height := 768;
BitBlt(bit.Canvas.Handle, 0, 0, Width, Height, GetDC(GetDesktopWindow), 0, 0, SRCCOPY);
 
for i:=0 to bit.Width - 1 do begin
  for j:=0 to bit.Height - 1 do
    if bit.Canvas.Pixels[i,j]=p then begin
       flag:=true;
       break;
    end;
if flag then
  break;
end;
 
if flag then begin
SetCursorPos(i,j);
mouse_event(MOUSEEVENTF_LEFTDOWN,i,j,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,i,j,0,0);
end;
 
FreeAndNil(bit);

Последний раз редактировалось Аватар; 06.04.2016 в 13:53.
Brown1993 вне форума Ответить с цитированием
Старый 06.04.2016, 14:08   #2
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 161
По умолчанию

я-бы сделал так:
Код:
function check(r,g,b:Byte):Boolean;
const
   admit:byte=5; //порог допуска, если 0 то точное совпадение
var prgb: array[word] of PRGBTriple;
    bmp:TBitmap;
    x,y:integer;
    dc:hdc;
begin
   result:=False;
   bmp:=TBitmap.Create;
   bmp.PixelFormat:=pf24bit;
   dc:=GetDC(0);
   BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, dc, 0, 0, SRCCOPY);
   ReleaseDC(0,dc);
   for y := 0 to bmp.Height-1 do
     begin
      prgb:=bmp.ScanLine[y];
        for x:=0 to bmp.Width-1 do
             if (abs(prgb[x].rgbtBlue-b)<=admit) and
                (abs(prgb[x].rgbtGreen=g)<=admit) and
                (abs(prgb[x].rgbtRed=r)<=admit)  then
                 begin
                    SetCursorPos(x,y);
                    mouse_event(MOUSEEVENTF_LEFTDOWN,x, y,0,0);
                    mouse_event(MOUSEEVENTF_LEFTUP,x,y, 0,0);
                    Result:=True;
                    Break;
                 end;
      end;
   FreeAndNil(bmp);
end;


...
//и где-нибудь
 if check(79,91,84) then else showmessage('Не судьба');
ибо работая c pixels можно вздремнуть неплохо.

а ошибка банальна:

Код:
BitBlt(bit.Canvas.Handle, 0, 0, Width, Height, GetDC(GetDesktopWindow), 0, 0, SRCCOPY);
Width и Height у тебя тут - это размеры формы, нужно bit.width bit.height.
DIONISKA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где расположить пиксель? Dimka-novitsek Общие вопросы Delphi 32 05.06.2014 20:43
Пиксель с экрана serres Visual C++ 1 30.12.2013 00:12
Тексел и Пиксель? VintProg Свободное общение 3 21.05.2011 13:07
Пиксель арт MaRKer.nsk Фриланс 2 17.08.2010 13:37
Вывести пиксель egoreus Общие вопросы C/C++ 1 16.01.2010 14:50