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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2010, 10:34   #1
eldalex
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 52
По умолчанию быстрое чтение пикселей с экрана

добрый день! у меня такой вопрос некоторые из вас знают игру линейку и тамошнюю рыбалку.
задался интересом написать миниатюрную авторыбалку в свободное от работы время пару лет назад я даже написал её, однако время убило мой винт а с ним и то что я написал. пишу заново
так вот, проблема в следующем. не могу вспомнить как быстро получить серию пикселей с экрана. раньше кажется я делал это так:
Код:
function DesktopColor(const X, Y: Integer): TColor;
 var
   c: TCanvas;
 begin
   c := TCanvas.Create;
   try
     c.Handle := GetWindowDC(GetDesktopWindow);
     Result   := GetPixel(c.Handle, X, Y);
   finally
     c.Free;
   end;
 end;

 procedure TForm1.Timer1Timer(Sender: TObject);
 var
   col:tcolor;
   x,y,i:intrger;
 begin
   x:=panel1.left;// x и y задаются в другом месте
   y:=panel1.top;// сюда просто для понятности, кто они и откуда.
   for i:=1 to panel1.width do //panel1.width равно примерно 223 пикселя
   Col := DesktopColor(X,Y);
// Col := GetPixel(c.Handle, X, Y); такой вариант тож длится долго.

//тут дальше считаем пиксели определенного цвета и соответственно 
//эмулируем нажатие кнопок.
 end;
в чем суть, я мышкой тащил панельку на синюю полосу жизней рыбы и жмакал старт, прога вдоль панельки считывала пиксели, смотрела изменилось ли количество синих и соответственно реагировала на обстановку.

так вот, раньше это делалось каждые 100 милисекунд по таймеру, сейчас же даже 1 прогон (считывание 223 пикселей) занимает примерно 4 секунды. вроде делал то же самое, но видимо как то по другому... так же возможно проблема в семёрке, раньше стояла XP... никто не подскажет как быстро получить и сосчитать серию пикселей?
может есть способ ускорить эту процедуру asm'ом?
eldalex вне форума Ответить с цитированием
Старый 25.09.2010, 10:09   #2
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

я извиняюсь... не проще написать мини-бота? Для меня лично - проще... либо использовать L2PacketHack от http://coderx.ru (там на форуме кстати был скриптик для рыбалки даже хорооший)
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 25.09.2010, 10:57   #3
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,572
По умолчанию

У TBitMap есть метод ScanLine.
Его как раз и можно использовать для быстрого обращения к пикселям.
Arigato вне форума Ответить с цитированием
Старый 26.09.2010, 21:23   #4
z3xix13
 
Регистрация: 25.09.2010
Сообщений: 3
По умолчанию

eldalex , Доброго времени суток. Я смотрю вы написали программу которая идентична той , что очень мне нужна.Есть возможность с вами как-то связаться (icq,skype,msn,e-mail лучше всего skype)?Очень буду благодарен получить ваши советы и помощь в замен заплачу либо дам все идии насчет того что хочу сделать.

Контакты связи можете плз отправить на z3xix13@gmail.com либо начирикайте здесь


Спасибо за ранее.
z3xix13 вне форума Ответить с цитированием
Старый 27.09.2010, 14:40   #5
eldalex
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 52
По умолчанию

Цитата:
Сообщение от Johnson Посмотреть сообщение
я извиняюсь... не проще написать мини-бота? Для меня лично - проще... либо использовать L2PacketHack от http://coderx.ru (там на форуме кстати был скриптик для рыбалки даже хорооший)
неее, в том то и дело, что пакетного бота спалить проще простого а такого как у меня можно заглушить лишь правкой клиента, на отсеивание программных эмуляций нажатия клавиш. но такое в принципе не каждый сервер решается сделать, ибо если такое вводят то проблемы возникают не только у мелких эмуляторов но и у многих игроков использующих игровые клавы/мыши/прочуюхрень потому что последние просто перестают работать и начинаются возмущения народа) такое было на астериосе) дошло до того что маги не могли больше пользовать скилы просто зажав кнопку, приходилось постоянно перенажимать) щас может уже все наладилось и админы продумали защиту получше, не знаю, не играю там давно...

Цитата:
Сообщение от Arigato Посмотреть сообщение
У TBitMap есть метод ScanLine.
Его как раз и можно использовать для быстрого обращения к пикселям.
хмм... т.е. нужно сделать небольшой скрин области экрана а потом считать с него? или я неправильно понял?

Цитата:
Сообщение от z3xix13 Посмотреть сообщение
eldalex , Доброго времени суток. Я смотрю вы написали программу которая идентична той , что очень мне нужна...
в том то и проблема) программа была сделана пару лет назад, но погибла вместе с винтом) остался старый exe'шник, с горой элементов на форме 90% которых не участвуют в процессе работы, а просто нужны были для отладки и проверки некоторых результатов, к сожалению я не предусмотрел вариант смены заголовка окна, а определил текущий и привязал к нему. новую пока не написал времени все нет) но как напишу, то поделюсь обязательно))

Последний раз редактировалось eldalex; 27.09.2010 в 14:48.
eldalex вне форума Ответить с цитированием
Старый 27.09.2010, 22:53   #6
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
function DesktopColor(const X, Y: Integer): TColor;
var
c: TCanvas;
begin
c := TCanvas.Create;
try
c.Handle := GetWindowDC(GetDesktopWindow);
Result := GetPixel(c.Handle, X, Y);
finally
c.Free;
end;
end;
О, ужас....... Я ж теперь не усну... х___х


Просто делайте скриншот... При помощи апи-функций... Для простоты возможно в битмап (с диб-секцией), а потом через указатели доступ к нужным пикселям (вполне пойдёт как предлагал Arigato)... И не надо делать отдельный скриншот для каждого пикселя... %))
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 28.09.2010, 07:50   #7
eldalex
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 52
По умолчанию

Цитата:
Сообщение от DomiNick Посмотреть сообщение
О, ужас....... Я ж теперь не усну... х___х...
... И не надо делать отдельный скриншот для каждого пикселя... %))
сочувствою по поводу сна я реально никого не хотел пугать
эту функцию я взял с dw =)

GetPixel(c.Handle, X, Y); разве эта функция делает скриншот пикселя? пардон, не знал) тогда понятно почему долго) как же я в прошлый раз то делал?
eldalex вне форума Ответить с цитированием
Старый 06.10.2010, 13:14   #8
eldalex
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 52
По умолчанию

засада... все дело действительно в 7ке( на хп даже GetPixel(c.Handle, X, Y) рабоатет шустренько...
eldalex вне форума Ответить с цитированием
Старый 06.10.2010, 13:48   #9
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

Код:
 procedure TForm1.Button1Click(Sender: TObject);
var bmp:TBitmap;
begin
    bmp := TBitmap.Create;
    bmp.Width := Screen.Width;
    bmp.Height := Screen.Height;
    BitBlt(bmp.Canvas.Handle, 0,0, Screen.Width, Screen.Height,
           GetDC(0), 0,0,SRCCOPY);
    Image1.Width := Screen.Width;
    Image1.Height := Screen.Height;
    Image1.Picture.Assign(bmp);
    bmp.Free;
end;
Остальное доделаешь? Про ScanLine правильно подсказали. Быстрее дело пойдет.
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Старый 07.10.2010, 09:13   #10
eldalex
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 52
По умолчанию

Все, спасибо всем! Шикарно получается) реагирует мгновенно!
делаю так, если кому нужно а кому то выше было нужно

Код:
type
 TRGB=record
  B,G,R,T:byte;
end;

PRGBLine = ^TRGBLine
TRGBLine = array[1..65635]  of TRGB;
далее на formcreate
Код:
    bmp := TBitmap.Create;
    bmp.Width := panel4.width;
    bmp.Height := panel4.Height;
    Image1.Width := panel4.Width;
    Image1.Height := panel4.Height;
    DC:=GetDC(0);
и теперь по таймеру
Код:
bitblt(bmp.Canvas.Handle,0,0,panel4.Width,panel4.Height,DC,panel4.left,panel4.top+22,SRCCOPY);
image1.Picture.Assign(bmp); // этот шаг необязательный, так лишь, чтоб смотреть как изменяется битмап.

dest:=bmp.ScanLine[panel4.Height div 2];
for i:=1 to panel4.Width do
begin
if dest^[i].R <10 then
nnw:=nnw+1;
end;
  if nnw>npr then
    begin
    memo1.Lines.Add('ползем вверх');   //тут соответственно надо прописать реакцию.
    end
  else
    begin
    memo1.Lines.Add('стоим или ползем вниз');  //и тут тоже:)
    end;
 npr:=nnw;
 nnw:=0;
end;
если заметите лишние телодвижения то покритикуйте, я подумаю над правкой

вот как бы и все новый велосипед изобретён!
всем спасибо!
eldalex вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка пикселей Obey177 Общие вопросы Delphi 0 04.09.2010 10:05
Чтение области экрана АлМазСофт Помощь студентам 5 28.01.2010 12:52
Изменение пикселей Antitime Мультимедиа в Delphi 2 27.08.2009 17:37
Чтение с экрана. Пaвeл Помощь студентам 2 05.05.2009 19:29
Таблица пикселей bl0w Мультимедиа в Delphi 1 19.01.2009 00:32