 |
Pixels[x,y] слишком медленный - Вопросы и ответы, обсуждения - Ваши вопросы по Pascal/Delphi только в данном разделе |
26.08.2012, 13:25
|
#1
|
|
|
|
Разведчик
|
 Регистрация: 14.11.2010
 Сообщений: 24
 Популярность: 289
 Сказал(а) спасибо: 2
Поблагодарили 6 раз(а) в 5 сообщениях
|
Pixels[x,y] слишком медленный
Мне надо подсчитать количество пикселей определённого цвета на экране (например цвета 16777215 - чисто белый). Я у каждого пикселя в области проверяю функцией Pixels[x,y] цвет, но это слишком долго. Например в программе clickermann есть тоже такая функция и она подсчитывает пиксели хоть на всём экране за 1/3 секунды (может и быстрее). Мне вот и нужна такая скорость. А у меня подсчёт происходит оооочень долго (несколько секунд), и это в маленькой области!
Вот мой код для подсчёта по клику кнопки:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
dtc:=TCanvas.Create;
dtc.Handle:=GetDC(Hwnd_Desktop);
xn:=1000; /х начальный
xk:=1050; /х конечный
yn:=300; /у начальный
yk:=350; /у конечный
x:=xn; /сначала идём в первый пиксель, который слева по х
y:=yn; /сначала идём в первый пиксель, который сверху по у
count:=0; /счётчик равен 0
while y<=yk do /пока у меньше у конечного
begin
temp:= dtc.Pixels[x,y]; /считываем цвет и заводим в переменную
if temp=16777215 then /если он белый, то
count:=count+1; /прибавляем к счётчику 1
if x>xk then begin /если х подошёл к конечному, то
y:=y+1; /спускаемся вниз на 1 пиксель по у
x:=xn; /и переходим в начало по х
end;
x:=x+1; /сдвигаемся по х на следующий пиксель
end;
Label1.Caption:=inttostr (count); /выводим в лейбл кол-во найденных пикселей заданного цвета
end;
Вот приведите мне пожалуйста другую функцию, желательно по-проще и с комментариями, как у меня. Ну и чтобы быстрей работало.
Жду ваших ответов и помощи  может я что-то не так сделал.
|
|
|
Пользователь сказал cпасибо:
|
|
26.08.2012, 14:23
|
#2
|
|
|
|
Рыцарь
|
 Регистрация: 12.04.2009
 Сообщений: 394
 Популярность: 47903
 Сказал(а) спасибо: 515
Поблагодарили 1,124 раз(а) в 430 сообщениях
|
Re: Pixels[x,y] слишком медленный
Закиньте скрин экрана в TStream и проверяйте цвета в нем, сравнивая байты.
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
В любом из нас спит гений. И с каждым днем все крепче.
Запомните раз и навсегда:= 'Помочь' <> 'Сделайте за меня';
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
26.08.2012, 18:42
|
#3
|
|
|
|
Разведчик
|
 Регистрация: 14.11.2010
 Сообщений: 24
 Популярность: 289
 Сказал(а) спасибо: 2
Поблагодарили 6 раз(а) в 5 сообщениях
|
Re: Pixels[x,y] слишком медленный
J-Fobos, а по-проще никак нельзя? Или хотя бы приведите примерный код как это сделать, а то я в потоках ещё не разбираюсь =((.
Кстати видел код на эту тему:
Код:
function GetColorXY(Graphic: TGraphic; Color: TColor; var X, Y: Integer): Boolean;
var
Bmp: TBitmap;
i, j: Integer;
Pixel, CmpColor: Cardinal;
Scan: Pointer;
R, G, B: Byte;
begin
Result:=false;
CmpColor:=ColorToRGB(Color);
Bmp:=TBitmap.Create;
try
Bmp.Assign(Graphic);
Bmp.PixelFormat:=pf24bit;
for i:=0 to Bmp.Height - 1 do begin
Scan:=Bmp.ScanLine[i];
for j:=0 to Bmp.Width - 1 do begin
Pixel:=PCardinal(Integer(Scan) + j*3)^;
R:=GetBValue(Pixel);
G:=GetGValue(Pixel);
B:=GetRValue(Pixel);
if RGB(R, G, B) = CmpColor then begin
Result:=true;
X:=j + 1;
Y:=i + 1;
Exit;
end;
end;
end;
finally
Bmp.Free;
end;
end;
Только не очень понимаю, он быстрей работает, или медленней (строк то больше) и вообще это может ли как-нибудь мне помочь.
|
|
|
26.08.2012, 19:38
|
#4
|
|
|
|
Рыцарь
|
 Регистрация: 12.04.2009
 Сообщений: 394
 Популярность: 47903
 Сказал(а) спасибо: 515
Поблагодарили 1,124 раз(а) в 430 сообщениях
|
Re: Pixels[x,y] слишком медленный
Илья333777, зачем по-проще если нужна скорость?
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
В любом из нас спит гений. И с каждым днем все крепче.
Запомните раз и навсегда:= 'Помочь' <> 'Сделайте за меня';
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
26.08.2012, 19:43
|
#5
|
|
|
|
Разведчик
|
 Регистрация: 14.11.2010
 Сообщений: 24
 Популярность: 289
 Сказал(а) спасибо: 2
Поблагодарили 6 раз(а) в 5 сообщениях
|
Re: Pixels[x,y] слишком медленный
Ну я не сильно в таких функциях разбираюсь, а что думаете по второму коду??
|
|
|
26.08.2012, 21:00
|
#6
|
|
|
|
Рыцарь
|
 Регистрация: 12.04.2009
 Сообщений: 394
 Популярность: 47903
 Сказал(а) спасибо: 515
Поблагодарили 1,124 раз(а) в 430 сообщениях
|
Re: Pixels[x,y] слишком медленный
По принципу работы то же что и первый. Только вытягивает значение цвета не из канваса, а из bmp.
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
В любом из нас спит гений. И с каждым днем все крепче.
Запомните раз и навсегда:= 'Помочь' <> 'Сделайте за меня';
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
27.08.2012, 00:16
|
#7
|
|
|
|
Лейтенант-командор
|
 Регистрация: 12.08.2010
 Сообщений: 727
 Популярность: 30569
 Золото Zhyk.Ru: 1
 Сказал(а) спасибо: 57
Поблагодарили 645 раз(а) в 386 сообщениях
|
Re: Pixels[x,y] слишком медленный
Наиболее быстрый вариант это гразвнуть снимок экрана в стрим и побайтово разобрать. Да, это многокода
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Perfect World: PWDatabaseScanner, Client, PWNickRenamer, PWClientRenamer, База логинов PW, Гайд по варУ, Зарабатываем репутацию.
Delphi: Авторизация на сайте с помощью Indy, Загрузка изображений с интернета в TImage с помощью Indy, Автоматическая смена стандартной версии Indy в Delphi на Indy 10.0.76 / 10.1.5, Основы парсинга с помощью Indy, Делаем Updater до программы с помощью Indy.
Other: ShowIP, FFUUU смайлы в QIP, Как играть в Minecraft (видеокурс), Как мы захватили человечество :D, Энергия в Лицемер/TopFace, PasGen.
|
|
|
27.08.2012, 10:11
|
#8
|
|
|
|
Разведчик
|
 Регистрация: 14.11.2010
 Сообщений: 24
 Популярность: 289
 Сказал(а) спасибо: 2
Поблагодарили 6 раз(а) в 5 сообщениях
|
Re: Pixels[x,y] слишком медленный
Хм, кстати, по-моему в clickermann там и делается.
|
|
|
27.08.2012, 11:05
|
#9
|
|
|
|
Разведчик
|
 Регистрация: 01.06.2012
 Сообщений: 25
 Популярность: -242
 Сказал(а) спасибо: 8
Поблагодарили 9 раз(а) в 6 сообщениях
|
Re: Pixels[x,y] слишком медленный
Все, что ты нашел в нете - почти бред.
по-моему, достаточно просто отсканить сверху-вниз слева-направо. Я так понял, если как кликерман, то это для ДО => найденных предметов будет [0; 8] є N. (провернуть это твоим кодом можно за 1сек) - как ускорить, сказали, но найденного кода будет достаточно для нормального продвижения.
|
|
|
29.08.2012, 11:14
|
#10
|
|
|
|
Разведчик
|
 Регистрация: 14.11.2010
 Сообщений: 24
 Популярность: 289
 Сказал(а) спасибо: 2
Поблагодарили 6 раз(а) в 5 сообщениях
|
Re: Pixels[x,y] слишком медленный
Softwarer, в том то и дело, что мой код сканит даже 2500 пикселей за секунд 10 где-то.
Добавлено через 2 минуты
Ну всё-таки может мне кто-нибудь примерный код даст, чтобы в стрим экран загонять и считывать?
Последний раз редактировалось Илья333777; 29.08.2012 в 11:16.
Причина: Добавлено сообщение
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 00:26.
|
 |