![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Вот код, если он как обычная процедура то работает, если как поток то не работает!!! Нужен поток не люблю когда что нибудь тормозит!!!
Код:
procedure TCapth.execute;
var
i,x,y,l,j,iz:integer;
s:integer;
stop:Boolean;
cap:String;
proz,posx,posy,all:Integer;
begin
inherited;
cap:='';
for posx := 3 to 77 do begin
for posy := 3 to 15 do begin
s:=0;
iz:=3;
repeat
iz:=iz+1;
all:=0;
s:=0;
proz:=0;
x:=TImage(Form1.FindComponent('Image'+IntToStr(iz))).Width-1;
y:=TImage(Form1.FindComponent('Image'+IntToStr(iz))).Height-1;
for l := 0 to x do begin
for j := 0 to y do begin
if (TImage(Form1.FindComponent('Image'+IntToStr(iz))).Canvas.Pixels[l,j]<>RGB(255,255,255)) then begin
all:=all+1;
end;
end;
end;
for l := 0 to x do begin
for j := 0 to y do begin
if (TImage(Form1.FindComponent('Image'+IntToStr(iz))).Canvas.Pixels[l,j]=Form1.image2.Canvas.Pixels[l+posx,j+posy])
and (TImage(Form1.FindComponent('Image'+IntToStr(iz))).Canvas.Pixels[l,j]<>RGB(255,255,255)) then
begin
s:=s+1;
end;
end;
end;
proz:=round(s/all*100);
if proz>60 then begin
case iz of
3..7:cap:=cap+'0';
8..12:cap:=cap+'1';
13..17:cap:=cap+'2';
18..22:cap:=cap+'3';
23..27:cap:=cap+'4';
28..32:cap:=cap+'5';
33..37:cap:=cap+'6';
38..42:cap:=cap+'7';
43..47:cap:=cap+'8';
48..52:cap:=cap+'9';
end;
end;
until iz=52;
end;
end;
Form1.sEdit2.Text:=cap;
end;Последний раз редактировалось ProDaNTe, 24.04.2013 в 07:41. |
|
#2
|
||||
|
||||
|
Цитата:
З.Ы. И пжлст, отформатируйте код на предмет переноса строк в рамках редактора, а то на экране он расползается за его пределы, а это не красиво. Последний раз редактировалось Alegun, 23.04.2013 в 22:37. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
ProDaNTe (24.04.2013)
| ||
|
#3
|
|||
|
|||
|
Цитата:
|
|
#4
|
||||
|
||||
|
Зачем с файла если оно и так уже в имидж загружено. Динамически создать, затем присвоить imageN.Picture:= image1.Picture а дальше как обычно, быстрее не будет, просто из потока не желательно к статике обращаться, может быть пересечение с другим/основным потоком, что чревато непредсказуемостью.
Оффтоп: З.Ы. Ещё раз прошу нижайше, пжлст, нажав на правку около первого поста, в районе 34й строки кода не соблаговолите ли вы, млстлвгсдр , где-то около оператора and жимануть на ентер чтоб строчку разбить, ну правда, не красиво. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
ProDaNTe (24.04.2013)
| ||
|
#5
|
|||
|
|||
|
Цитата:
Цитата:
Спасибо заранее, хочется разобраться раз и на всегда!!! Делаю так при создании формы Код:
for I := 3 to 52 do
begin
ImageSrav[i]:=Timage.Create(Form1);
ImageSrav[i].Parent:=Form1;
ImageSrav[i].AutoSize:=true;
ImageSrav[i].Visible:=false;
ImageSrav[i].Picture:=TImage(Form1.FindComponent('Image'+IntToStr(i))).Picture;
ImageSrav[i].Left:=TImage(Form1.FindComponent('Image'+IntToStr(i))).Left+200;
ImageSrav[i].top:=TImage(Form1.FindComponent('Image'+IntToStr(i))).top;
end;Последний раз редактировалось ProDaNTe, 24.04.2013 в 10:32. |
|
#6
|
||||
|
||||
|
Цитата:
Объявление потомка от TThread Код:
...
type
TCapth = class(TThread)
private
MyImage: TImage;
protected
procedure Execute; override; // Выполняется в потоке
procedure ShowResult; // Выводная процедура из потока
// Если в основной поток нужно вернуть разные рисунки, то тогда
// ShowResult задаётся с параметрами
// procedure ShowResult(img: TImage);
end;
...Picture:= Picture это всёравно что a:= b, т.е. передается лишь копия изображения, его Canvas.Pixels не зависят от оригинала и делай с ним что хошь... Код:
procedure TCapth.Execute;
begin
MyImage.Picture:= Form1.Image1{iz} .Picture;
x:= MyImage.Width -1;
y:= MyImage.Height-1;
...
// ну и так далее
...
end;Код:
... Synchronize(ShowResult); ... А вот и сама выводная процедура Код:
...
procedure TCapth.ShowResult;
begin
...
// напр.
Form1.Image1{iz}.Picture:= MyImage.Picture;
...
end;
...Из всего этого такое заключение - с потоками надо правильно обращаться и тогда всё будет работать. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
ProDaNTe (24.04.2013)
| ||
|
#7
|
||||
|
||||
|
Я не понимаю, че за проблема, взять в отдельном потоке набабахать битмап, по завершению через синхронайз махнуть, что мол все готово, забирайте.
И не использовать TImage, а использовать TBitmap (в случае с TImage это как в механический калькулятор засовывать абак). |
| Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
ProDaNTe (24.04.2013)
| ||
|
#8
|
|||
|
|||
|
Цитата:
P.S. Я знаю о работе потока, но не знаю как взаимодействовать с изображениями в потоке, при обращении к картинкам даже созданным динамически они начинают исчезать(( Цитата:
Последний раз редактировалось ProDaNTe, 24.04.2013 в 11:22. |
|
#9
|
|||
|
|||
|
C TBitmap тоже не работает(((, Если не в потоке, а просто процедурой то все ок, а в потоке не в какую ПОЧЕМУ!!!! ИзвИните имоции...
Садись, два Код:
...
type
TCapth = class(TThread)
protected
procedure Execute; override;
end;
...
ImageSrav:array [3..53] of TBitmap;
...
for I := 3 to 52 do
begin
ImageSrav[i]:=TBitmap.Create;
ImageSrav[i]:=TImage(Form1.FindComponent('Image'+IntToStr(i))).Picture.Bitmap;
end;
...
procedure TCapth.execute;
var
i,x,y,l,j,iz:integer;
s:integer;
stop:Boolean;
cap:String;
proz,posx,posy,all:Integer;
begin
inherited;
cap:='';
for posx := 3 to 77 do begin
for posy := 3 to 15 do begin
s:=0;
iz:=2;
repeat
iz:=iz+1;
all:=0;
s:=0;
proz:=0;
x:=ImageSrav[iz].Width-1;
y:=ImageSrav[iz].Height-1;
for l := 0 to x do begin
for j := 0 to y do begin
if ImageSrav[iz].Canvas.Pixels[l,j]<>RGB(255,255,255) then begin
all:=all+1;
end;
end;
end;
for l := 0 to x do begin
for j := 0 to y do begin
if (ImageSrav[iz].Canvas.Pixels[l,j]=ImageSrav[53].Canvas.Pixels[l+posx,j+posy]) and
(ImageSrav[iz].Canvas.Pixels[l,j]<>RGB(255,255,255)) then
begin
s:=s+1;
end;
end;
end;
proz:=round(s/all*100);
if proz>60 then begin
case iz of
3..7:cap:=cap+'0';
8..12:cap:=cap+'1';
13..17:cap:=cap+'2';
18..22:cap:=cap+'3';
23..27:cap:=cap+'4';
28..32:cap:=cap+'5';
33..37:cap:=cap+'6';
38..42:cap:=cap+'7';
43..47:cap:=cap+'8';
48..52:cap:=cap+'9';
end;
end;
until iz=52;
end;
end;
Form1.sEdit2.Text:=cap;
end;Последний раз редактировалось Aristarh Dark, 24.04.2013 в 15:51. |
|
#10
|
||||
|
||||
|
Ты бы написал что тебе нужно-то, а то сидеть и разбираться в коде который не работает, лично мне - не хочется.
|
|
#11
|
|||
|
|||
|
Цитата:
Что там разбирать взлом капчи по шаблону, всё работает если не в потоке, а в потоке отказывается. Так как цифры имеют наклон и наложение друг на друга, то это самый работоспособный код, что у меня созрел, но как запускаю потоком все изображения на форме пропадают, хотя я их в битмапы запихнул и те что на форме в потоке не используются!!! P.S. Заместо орфогрфии лучше бы код хоть глазком взглянул |
|
#12
|
||||
|
||||
|
Цитата:
Не хочу смотреть, потому что в коде даже форматирования нормального нету. Можно же написать: 1. Есть много (сколько?) картинок и еще одна 2. Посчитали сколько не белых точек на этих много картинок 3. Потом чего-то там сравниваем с еще одной картинкой(?) 4. Что-то делаем с результатом(?) Просто ж очень описать действия. |
|
#13
|
|||
|
|||
|
Цитата:
Есть картинка капчи далее ImageSrav[53] Далее есть 50 шаблонов картинок ImageSrav[3..52] Запускаем цикл установки позиции 2 шт по x и y соответственно Код:
for posx := 3 to 77 do begin for posy := 3 to 15 do begin Код:
repeat
iz:=iz+1;
all:=0;
s:=0;
proz:=0;
x:=ImageSrav[iz].Width-1;
y:=ImageSrav[iz].Height-1;Код:
for l := 0 to x do begin for j := 0 to y do begin if ImageSrav[iz].Canvas.Pixels[l,j]<>RGB(255,255,255) then begin all:=all+1; end; end; end; Код:
for l := 0 to x do begin for j := 0 to y do begin if (ImageSrav[iz].Canvas.Pixels[l,j]=ImageSrav[53].Canvas.Pixels[l+posx,j+posy]) and (ImageSrav[iz].Canvas.Pixels[l,j]<>RGB(255,255,255)) then begin s:=s+1; end; end; end; Код:
proz:=round(s/all*100); Код:
if proz>60 then begin case iz of 3..7:cap:=cap+'0'; 8..12:cap:=cap+'1'; 13..17:cap:=cap+'2'; 18..22:cap:=cap+'3'; 23..27:cap:=cap+'4'; 28..32:cap:=cap+'5'; 33..37:cap:=cap+'6'; 38..42:cap:=cap+'7'; 43..47:cap:=cap+'8'; 48..52:cap:=cap+'9'; end; end; |
|
#14
|
||||
|
||||
|
План действий примерно такой:
1. Свести к минимуму обращение к VCL компонентам (в идеале обращение только к Edit'у и уже тем более никаких TImage) 2. Прочитать 1 пункт 50 раз. 3. Не пересчитывать все время количество белых точек. Сделать например так (упрощенно, лучше конечно класс сделать): Код:
type
TTemplate = record
bitmap:TBitmap;
whitecount:integer;
mask:array of array of boolean;
end;4. Загрузить из файла картинку с капчей (тож в TBitmap) и с ней уже производить сравнения. 5. После всего через синхронайз вывести данные на форму. |
|
#15
|
|||
|
|||
|
Так здаесь где VCL компонент ну кроме sEdit2?
Код:
procedure TCapth.execute;
var
i,x,y,l,j,iz:integer;
s:integer;
stop:Boolean;
cap:String;
proz,posx,posy,all:Integer;
begin
inherited;
cap:='';
for posx := 3 to 77 do begin
for posy := 3 to 15 do begin
s:=0;
iz:=2;
repeat
iz:=iz+1;
all:=0;
s:=0;
proz:=0;
x:=ImageSrav[iz].Width-1;
y:=ImageSrav[iz].Height-1;
for l := 0 to x do begin
for j := 0 to y do begin
if ImageSrav[iz].Canvas.Pixels[l,j]<>RGB(255,255,255) then begin
all:=all+1;
end;
end;
end;
for l := 0 to x do begin
for j := 0 to y do begin
if (ImageSrav[iz].Canvas.Pixels[l,j]=ImageSrav[53].Canvas.Pixels[l+posx,j+posy]) and
(ImageSrav[iz].Canvas.Pixels[l,j]<>RGB(255,255,255)) then
begin
s:=s+1;
end;
end;
end;
proz:=round(s/all*100);
if proz>60 then begin
case iz of
3..7:cap:=cap+'0';
8..12:cap:=cap+'1';
13..17:cap:=cap+'2';
18..22:cap:=cap+'3';
23..27:cap:=cap+'4';
28..32:cap:=cap+'5';
33..37:cap:=cap+'6';
38..42:cap:=cap+'7';
43..47:cap:=cap+'8';
48..52:cap:=cap+'9';
end;
end;
until iz=52;
end;
end;
Form1.sEdit2.Text:=cap;
end;Код:
картинки загрузить в bitmap из файлов при инициализации потока |