Вверх ↑
Этот топик читают: Гость
Ответов: 202
Рейтинг: 7
#16: 2017-05-24 20:54:25 ЛС | профиль | цитата
Добренький всем вечерочек

В ожидании встречи с человеком, у которого возникнет желание повозиться с моим заказом, я начал пытаться сам вникнуть в инлайн-код компонента, который, наверно ещё в прошлом году, я скачал здесь, на форуме, в теме о поиске изображения.

Всё, пока, идёт нормально. Но, при попытке узнать поподробнее об PBitmap, я упёрся в косяк, что поиск в Гугле выдаёт страницы о применении этого объекта (типа или что это такое ващще)... и ничего с его описанием

Может кто подскажет хороший ресурс, где такие вещи были бы хорошо описаны?..

Спасибо заранее
карма: 1

0
Ответов: 758
Рейтинг: 112
#17: 2017-05-25 08:26:35 ЛС | профиль | цитата
Сделал маску

Add(ScreenShort,10756950,203,91)
{
link(onCapture,16345822:doCopy,[])
}
Add(Img_Copy,16345822,245,91)
{
@Hint=#17:Обрезка скриншота|
X=50
Y=50
Width=100
Height=100
Point(Result)
Point(Width)
Point(Height)
AddHint(-40,47,117,13,@Hint)
}
Add(MainForm,10552383,504,196)
{
Width=563
Height=433
Position=1
Point(onChar)
Point(doPicture)
}
Add(Image,3103349,210,196)
{
Width=160
Height=155
AutoSize=0
ViewStyle=4
Picture=[ZIPE658000078DAED9C3F6853411CC75F717775702916C4415711040B0DC221B869E9A8DD830E3738485D9C040533BFC5C5C54530E0F81691D0B169110A253625A5FFD2A48A88B4F5E7FD2EF93D5F2EF79286264DD37EBF8F23F7EEDF7BBFCFFDEE77475A32757F7D26B0BA69D23593A64D9A32692C18B7E51F4DFD978B8D242208822008822008822008822008822008822008822068202A140A480348755C47BAC06A34B8560FAAB4F567CB7E826BFF9896EB655ADE58A6B5BDB573CDB65F5CD77E6C58A6C1C41CCD7F9BA785D202ADECAC9E5BB6FDE0BAB35FB5FEC94C835B5FED6761B160D996EBDDFD361BD589FFF54B5231CCD8F23C7179362ECF98542FE5E2BA8CA9937BF72A725F958BFBE654D02C6D1F37AF83AECF3B69AECC2C667AE7375D7D4C144C6EB6B0FD5E2BA7B2CD8445CAF2FB5BAB5A79B9EC7225BECF78EBDC2BD0F916967C2FFC72661EA59FF0E7B974C714CEF5287BA25C770EAB54F959B10CAF4C13CDBE229A794934FEC8B0BD5D8CD92EAE2EDA76B5BFB596FE3E369DB80A03B6B313576E97E176893A9E932CCF4973FEDCB965E6BE313BF51B1457F64166F7E603C5E9DE0BA2CBCCF5EE3A0537DEDBFAA5F292771FF3BD732FFE9A5CB3693EDF690E65CC80C74C992BDF1C0D9AEBB3B79F1BEBBF999EBF23BAFE94E8C2436A29D7AF3FD9B397EBAF6C534E65E2B5CA7E938C6BBDB0E3BEB2EE8FC235197F659DA7719535328CF380F8EDC413A2B1070DAE76DFDAABA4F6E9B6C65C3B797F4BEE316E2C4CF3735F3DCF97EC8F9D7CFAB4709D9C23BA34DBE0BAB2BD42EBBF3653FB747BE75ED8F5C295E727B9A775E23A8CF8CAD7F6FEAE3726C8DAAF1EEC76EC9F8C99F1B94BE7AD1DBEF82A361E270EB8ACF8BE1EE552CF03B24686C1F53897EC1DEE59D38DAF6E2CECE56CEB8B296EDCF63DCF8D1527C575F7B0866F59F07D16B8822BAE3E70C5DF4C0693A0A3AB52A90002B8822BB80202B8822BB802C229E61A96888240C5DF05858A7F5EA3441171B9A652A86C3BBE57E6DE14B4E5B91D45DA5B2EE3463AF03E53F1CF7998F6256EAFC2F8F9EE334789AB8EC8DAC64C923653F49F8BD89DC655990EA1611F699DDA4698097B9907799E0E5493A2A9332FE59BCB51E19AB4D527B12964C65A7999954C5EF318A644191E11734EE1AAB89DC9BB1C85A5BC0767936B66D4B8FAECF371659BD8EE28D26DCC7418C6EBDBF2307E961607D2FCD3E5CAA59AC730B951E51A2A15C7B24E5C6D5E3157D5C2552915DB6C7D52876D6D249F64E5C601E9138FD3F4EDB3EEAF2C8EA3C958CB6C927B4C5A1B773FF4ED95C95824F149EA64BCB3125F71CE3AFE19CB771E0057EA8BDFFAD62BB842E00AAEE00A812BB8822B340CAEFF00557C49CC]
}
Add(Button,3884042,133,259)
{
Left=170
Top=5
link(onClick,8282293:doStart,[])
}
Add(Image,5758247,385,182)
{
Left=120
Top=120
Width=40
Height=40
AutoSize=0
ViewStyle=4
Picture=[ZIP5E05000078DACD54B111C2300C34050D053523A4A06600DCA46105367097495C670CF72918210364056F109E3CD1E964438E8E9C75E79365E9F57AE77ABBEFDDF25D600DEC0C3BC076EEB4F81B9C3F8EB4F5CB73FE9315862CA8C6DEC3936678023D1E50A748A777817BBD4604B791C1B1455FA3C9903AF7292797EFC7F02224E92ABA5C9CB0F7C6A997EB9294C69E15E390194984684D5F279E3C84B2B52A0626417C15034E3D4E57270007005E3AD26D0298B92E91E6CA260F4266499DC92000701DDC972D087804C4D69346A095496D964330F9FF82417452E55CE8AD5267E2A15811951E68C998F1033E155EA54830C8E60B866AB94D0C402E42AD62D0EDCBB8DFEFB48333193D30F8A75998127988E5BB20BD5A36FA816B3DE8816EFE34CC10B5A24C4E19D313DDC38EAD]
Point(doTop)
Point(doLeft)
Point(onMouseDown)
Point(Handle)
Point(onMove)
Point(Left)
Point(Top)
link(onMouseDown,16176673:doMove,[(424,195)(424,265)])
link(onMove,12620521:doString,[])
}
Add(InlineCode,2366711,238,259)
{
WorkPoints=#12:doFindBitmap|
EventPoints=#8:onResult|8:SumError|
DataPoints=#6:Bitmap|9:subBitmap|4:mask|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|4:type|40: TByteArray = array [0..32767] of Byte;|27: PByteArray = ^TByteArray;|35: TBuf = array of array of integer;|15: FRes = record|19: found: boolean;|17: x,y: integer;|17: percent:real;|6: end;|14: WH2 = record|43: Width1,Height1,Width2,Height2: integer;|6: end;|2: |28: THiAsmClass = class(TDebug)|10: private|0:|9: public|12: Bitmap,|15: subBitmap,|10: mask,|35: onResult, SumError: THI_Event;|57: procedure doFindBitmap(var _Data:TData; Index:word);|65: function CompareIMG(var buf1:TBuf; buf2:TBuf; WH:WH2): FRes;|5: end;|0:|14:implementation|0:|40:function LoagIMG(var Bmp:PBitmap) :TBuf;|3:var|17: x,y,c: integer;|16: p: pByteArray;|15: buffer: TBuf;|5:begin|36: Bmp.PixelFormat:=pf24Bit;//pf8Bit;|43: SetLength(buffer, Bmp.Height, Bmp.Width);|35: for y:=0 to Bmp.Height-1 do begin|23: p:=Bmp.ScanLine[y];|36: for x:=0 to Bmp.Width-1 do begin|52: c:=((p[x*3+0] shl 8+p[x*3+1]) shl 8)+p[x*3+2];|21: buffer[y,x]:=c;|8: end;|6: end;|19: Result := buffer;|4:end;|0:|72:function THiAsmClass.CompareIMG(var buf1:TBuf; buf2:TBuf; WH:WH2): FRes;|3:var|29: y, x, yy, xx, err: integer;|23: sumerr, sum: LongInt;|5:begin|58: //maxerr:=200; //максимальная ошибка = в диапазоне 0-726|21: sum:=High(LongInt);|22: Result.found:=false;|7: y:=0;|8: repeat|9: x:=0;|10: repeat|25: Result.found:=true;|16: sumerr:=0;|12: yy:=0;|12: repeat|14: xx:=0;|14: repeat|44: if Not buf2[yy,xx] = -1 then begin|59: //Result.found:=buf1[y+yy, x+xx]=buf2[yy,xx];|75: err:=abs(byte(buf1[y+yy, x+xx]) - (buf2[yy,xx] and $0000ff))+|95: abs((buf1[y+yy, x+xx] and $00ff00 shr 8) - (buf2[yy,xx] and $00ff00 shr 8))+|97: abs((buf1[y+yy, x+xx] and $ff0000 shr 16) - (buf2[yy,xx] and $ff0000 shr 16));|55: //if err>maxerr then Result.found:=false;|33: sumerr:=sumerr+err;|53: if sumerr>sum then Result.found:=false;|14: end;|18: inc(xx);|52: until (xx>=WH.Width2) or (Not Result.found);|16: inc(yy);|51: until (yy>=WH.Height2) or (Not Result.found);|30: if sumerr<sum then begin|21: sum:=sumerr;|21: Result.x:=x;|21: Result.y:=y;|59: Result.percent:=sumerr/(726*WH.Width2*WH.Height2);|10: end;|13: inc(x);|34: until (x>WH.Width1-WH.Width2);|11: inc(y);|34: until (y>WH.Height1-WH.Height2);|21: Result.found:=true;|30: //if Result.found then begin|20: //Result.x:=x-1;|20: //Result.y:=y-1;|8: //end;|4:end;|0:|35:procedure THiAsmClass.doFindBitmap;|3:var|30: Bmp, subbmp, mbmp:PBitmap;|21: FindResult: FRes;|27: buf1, buf2, buf3: TBuf;|18: y, x: integer;|12: WH: WH2;|16: dt,di:TData;|5:begin|36: Bmp := ReadBitmap(_Data,Bitmap);|42: if (Bmp = nil) or Bmp.Empty then exit;|42: subbmp := ReadBitmap(_Data,subBitmap);|48: if (subbmp = nil) or subbmp.Empty then exit;|35: mbmp := ReadBitmap(_Data,mask);|73: if (Bmp.Width<subbmp.Width) or (Bmp.Height<subbmp.Height) then exit;|77: if (mbmp.Width<>subbmp.Width) or (mbmp.Height<>subbmp.Height) then exit;|4: |25: buf1 := LoagIMG(Bmp);|25: WH.Width1:=Bmp.Width;|27: WH.Height1:=Bmp.Height;|15: //Bmp.Free;|4: |28: buf2 := LoagIMG(subbmp);|28: WH.Width2:=subbmp.Width;|30: WH.Height2:=subbmp.Height;|18: //subbmp.Free;|4: |26: buf3 := LoagIMG(mbmp);|39: //_hi_onEvent(SumError, buf3[0,2]);|40: for y:=0 to subbmp.Height-1 do begin|43: for x:=0 to subbmp.Width-1 do begin|43: if Not buf3[y,x] = 0 then begin|34: buf2[y,x] := -1; |16: end;|12: end;|12: end; |4: |43: FindResult:=CompareIMG(buf1, buf2, WH);|4: |15: dtNull(dt);|15: dtNull(di);|34: if FindResult.found then begin|57: dtInteger(dt,FindResult.x);//+(WH.width2 div 2));|58: dtInteger(di,FindResult.y);//+(WH.height2 div 2));|24: dt.ldata := @di;|34: _hi_onEvent(onResult, dt);|50: _hi_onEvent(SumError, FindResult.percent);|8: end;|4:end;|4:end.|
link(onResult,13902867:doEvent1,[])
link(SumError,4467059:doCalc,[(284,272)(284,307)])
link(Bitmap,3103349:ImageBitmap,[(244,236)(216,236)])
link(subBitmap,5758247:ImageBitmap,[(251,250)(391,250)])
link(mask,2131107:Bitmap,[])
}
Add(MT_Part,15868768,336,196)
{
link(onSplit,5758247:doTop,[])
link(onPart,5758247:doLeft,[])
}
Add(MoveWindow,16176673,448,259)
{
link(Handle,5758247:Handle,[(454,250)(398,250)])
}
Add(Label,7469250,427,301)
{
Left=230
Top=10
Width=115
}
Add(FormatStr,8296708,385,301)
{
DataCount=1
Mask="Минимальная ошибка - %1 %"
link(onFString,7469250:doText,[])
}
Add(Hub,13902867,294,259)
{
link(onEvent1,8282293:doStop,[(317,265)(317,243)(179,243)(179,272)])
link(onEvent2,15868768:doSplit,[(326,272)(326,202)])
}
Add(TimeCounter,8282293,189,259)
{
link(onStart,2366711:doFindBitmap,[])
link(onStop,6823186:doString,[(228,272)(228,328)])
}
Add(Label,15385577,294,322)
{
Left=230
Top=35
}
Add(FormatStr,6823186,245,322)
{
DataCount=1
Mask="Время поиска - %1 Millisecond"
link(onFString,15385577:doText,[])
}
Add(MathParse,4467059,336,301)
{
DataCount=1
MathStr="round(%1*100,0.01)"
link(onResult,8296708:doString,[])
}
Add(FormatStr,12620521,448,196)
{
Mask="x = %1, y = %2"
link(onFString,10552383:doCaption,[])
link(Str1,6079462:Wire1,[])
link(Str2,6079462:Wire2,[])
}
Add(CableData,1772919,399,224)
{
link(Wire1,5758247:Left,[])
link(Wire2,5758247:Top,[])
}
Add(CableVar,6079462,448,168)
{
link(Cable,1772919:Cable,[(454,159)(440,159)(440,271)(405,271)])
}
Add(Bitmap,2131107,252,196)
{
Picture=[ZIPEE05000078DA6594775CCE5F14C7DF514AEA9191A828B310854A122A1212B2A210196D231491BD2B2AA3B2295B111A1495521945091929A332237BC4F7D74FF13C0FE7F53AF7DC7BCEE77E3EE7DC3FAEA56D851CBFCC581674ABA35EB52B56BB0C0ABFF28932902EAAF1EAE41F939191A14E9D3AD4AD5B17595959E4E4E4A857AF1EF2F2F228282850BF7E7D14151569D0A0014A4A4A282B2B23128968D8B0212A2A2A346AD488C68D1BD3A449139A366D8AAAAA2ACD9A35434D4D8DE6CD9BD3A2450BD4D5D5D1D0D040535393962D5BD2AA552BB4B4B4D0D6D6A675EBD6B469D386B66DDBD2AE5D3BDAB76F4F870E1DD0D1D1415757978E1D3BD2A953273A77EE8C9E9E1E5DBA74A16BD7AEE8EBEB63606040B76EDDE8DEBD3B3D7AF4C0D0D0102323238C8D8DE9D9B327262626F4EAD50B5353537AF7EE8D9999197DFAF4A16FDFBEF4EBD70F7373732C2C2CB0B4B4A47FFFFE0C1830002B2B2B060E1C88B5B53583060D62F0E0C10C1932041B1B1B860E1D8AADAD2DC3860D63F8F0E18C1831023B3B3B468E1CC9A851A3183D7A3463C68C61ECD8B1D8DBDB336EDC38C68F1F8F8383038E8E8E4C9830818913273269D2249C9C9C983C793253A64CC1D9D999A953A7326DDA34A64F9FCE8C1933707171C1D5D515373737DCDDDDF1F0F0C0D3D3132F2F2F66CE9CC9AC59B3983D7B3673E6CCC1DBDB9BB973E7326FDE3CE6CF9F8F8F8F0FBEBEBE2C58B080850B17E2E7E7C7A2458B58BC7831FEFEFE2C59B284A54B97B26CD932962F5FCE8A152B58B97225AB56AD62F5EAD5AC59B386B56BD7B26EDD3AD6AF5FCF860D1B08080820303090A0A020366EDCC8A64D9B080E0E26242484D0D050366FDECC962D5BD8BA752BDBB66D232C2C8CF0F070222222D8BE7D3B3B76EC60E7CE9DECDAB58BDDBB77B367CF1EF6EEDDCBBE7DFBD8BF7F3F91919144454571E0C0010E1E3CC8A14387387CF830478E1CE1E8D1A31C3B768CE3C78F131D1D4D4C4C0C274E9CE0E4C993C4C6C672EAD4294E9F3ECD993367888B8B233E3E9E848404121313397BF62CE7CE9D23292989E4E464CE9F3FCF850B1748494921353595B4B4342E5EBC487A7A3A1919195CBA7489CCCC4CB2B2B2C8CECEE6F2E5CB5CB97285AB57AF72EDDA35727272C8CDCDE5FAF5EBDCB87183BCBC3CF2F3F3B979F326050505DCBA758BDBB76F73E7CE1D0A0B0BB97BF72EF7EEDDE3FEFDFB3C78F080A2A2221E3E7C487171312525253C7AF488C78F1FF3E4C9139E3E7D4A696929656565949797F3ECD9339E3F7FCE8B172F78F9F225AF5EBDE2F5EBD7545454F0E6CD1BDEBE7D4B656525EFDEBDE3FDFBF77CF8F0818F1F3FF2E9D3273E7FFECC972F5FF8FAF52BDFBE7DE3FBF7EF545555F1E3C70F7EFEFC89200894D67C0182A826D49C44B5B10C491354FEAF0BB535410C172477E29AF0BB24881142CD22D4120962D8BFD8DF09B1D8AF8B7F614192180902E11F650936295EFEF0FEE94E2C2939A0F449AA5F0955A9EE2500C25F13D50A4900A51F55BA43E961FF037C57F793]
}

карма: 1

0
Ответов: 202
Рейтинг: 7
#18: 2017-05-25 09:42:39 ЛС | профиль | цитата
miver писал(а):
Сделал маску


Спасииибо!

Крутяяяяк!..
Пойду смотреть

--- Добавлено в 2017-05-25 10:29:44

2 miver

Класс!

В принципе, я получил тот участок кода, который сам делать опасался (обработка маски).

И теперь, возможно два направления развития наших деловых отношений:
- первое, Вы, уважаемый miver, больше не тратите на меня время; называете сумму Вашего вознаграждения; и я сам делаю себе на компоненте нужные точки сверху... и реализую свой способ определения степени совпадения изображений (вычисляю разницу между эталонным и проверяемым пикселем... и, если она не превышает допустимой, увеличиваю на один "счётчик удовлетворительный пикселей" А в конце, проверяю, чтобы процент этих "удовлетворительных пикселей" оказался не меньше указанного);

- и второе, Вы не против более высокого вознаграждения... и берёте сам допилить компонент до "товарного вида"

Меня устраивает любой Ваш выбор. Слово - за Вами

Редактировалось 1 раз(а), последний 2017-05-25 10:29:44
карма: 1

0
Ответов: 758
Рейтинг: 112
#19: 2017-05-25 16:41:36 ЛС | профиль | цитата
Я же писал:
miver писал(а):
Если у меня получится, то переведете деньги в донат HiAsm!

Переведите хотя бы 1000 р., а может и больше, если есть возможность

Я выбираю первый вариант. Попробуйте сделать сами, а если будут вопросы - поможим

--- Добавлено в 2017-05-25 16:43:12

Благодарность разработчикам программы

Редактировалось 1 раз(а), последний 2017-05-25 16:43:12
карма: 1

0
Ответов: 202
Рейтинг: 7
#20: 2017-05-25 17:39:01 ЛС | профиль | цитата
Большое Вам спасибо

Всё понятно... Всем удачи
карма: 1

0
Ответов: 202
Рейтинг: 7
#21: 2017-05-25 22:20:57 ЛС | профиль | цитата
Готово

Действительно, через QIWI даже из-за границы удобно всё получилось
карма: 1

0
21
Сообщение
...
Прикрепленные файлы
(файлы не залиты)