![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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 из файлов при инициализации потока  |