Показать сообщение отдельно
  #11  
Старый 14.02.2012, 16:59
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

особенность: при поиске использует только первую полоску, т.е. what должна но не обязана быть высотой в 1px
Цитата:
function Find(what, where: tBitmap; center: boolean = true): tPoint; overload;
CONST
PixelCountMax = 32768;
TYPE
pRGBArray = ^TRGBArray;
TRGBArray = ARRAY[0..PixelCountMax-1] OF TRGBTriple;
var
ax, ay, x, y, wa, ha, wx, wy: Integer;
xfrom, yfrom: Integer; // c: TControl;
o, p: pRGBArray;

function cc(o, p: TRGBTriple): boolean;
begin
if (o.rgbtBlue <> p.rgbtBlue) or (o.rgbtGreen <> p.rgbtGreen) or (o.rgbtRed <> p.rgbtRed) then
result := false
else
result := true;
end;

label
vso, next;
begin wa := what.Width; ha := what.Height;
{dx := 0; dy := 0;} ay := 0; ax := 0; wx := where.Width;
xfrom := -1; yfrom := -1; wy := where.Height;
o := what.ScanLine[ay];

for y := 0 to wy - 1 do
begin
p := where.ScanLine[y];
for x := 0 to wx-wa - 1 do
if cc(p[x], o[ax]) then
begin
while (ax < wa-1) and (x+ax < wx - 1) do
begin
if not cc(p[x+ax], o[ax]) then
begin
ax := 0;
goto next;
end;
inc(ax);
end;
xfrom := x;
yfrom := y;
goto vso;
next:
end;
end;
result := point(-1, -1);
exit;

vso:
if not center then
result := point(xfrom, yfrom)
else
result := point(xfrom +wa div 2, yfrom +ha div 2);
// result := point(xfrom+ wx div 2, yfrom + wy div 2);
end;
ps магически, но работает
Ответить с цитированием