|
|
Регистрация | << Правила форума >> | 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 это как в механический калькулятор засовывать абак). — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо 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 из файлов при инициализации потока |