не могу понять почему при поиске маленькой картинки в большой с помощью ScanLine, по первому пикселу всегда 100% совпадение, то-есть всегда находит то что нужно, но это касается только первого пикселя, НО при сравнении остальных пикселей найденной картинки с эталоном практически постоянно выдает отрицательный результат.
п.с почему заморочился с сравнением, есть ситуации когда искомая картинка меняется, а поиск этого не замечает...
вот как я делаю поиск и сравнение, застрял на сравнении:
Код:
function TForm1.FndIMG(Name:string; var ClikX,ClikY: Integer): Boolean;
type
TRGB = record
b, g, r: byte;
end;
ARGB = array[0..2] of TRGB;
PARGB = ^ARGB;
PRGB = ^TRGB;
var
x,y,xx,yy,q,w,range,indikator : integer;
Stop: Boolean;
//A,B:TBitmap; // Bm это картинка в которую скриню окно игры с помощью BitBlt
Aout,Bout,AAout,BBout {}: PARGB; // AAout,BBout : PByteArray;
begin
Result:=False; Stop:= False;
range:=0; //SetLength(Aout,byte(A.Height-1));
//B:=TBitmap.Create; // маленькая (искомая) часть
//A.:=TBitmap.Create;; // большая картинка
A.Picture.Bitmap.Width:=Bm.Width;
A.Picture.Bitmap.Height:=Bm.Height;
Timer1.Enabled:= False;
A.Canvas.CopyRect(Rect(0,0,Bm.Width,Bm.Height),Bm.Canvas,Bm.Canvas.ClipRect);
//img3.Picture.Bitmap:=A;
B.Picture.Bitmap.LoadFromFile(Name);
A.Picture.Bitmap.PixelFormat:=pf24bit;
B.Picture.Bitmap.PixelFormat:=pf24bit;
Bout:=B.Picture.Bitmap.ScanLine[0];
for y:=0 to A.Height-1 do begin
Aout:=A.Picture.Bitmap.ScanLine[y];
for x:=0 to A.Width-1 do begin
if(Bout[0].r = Aout[x].r) and
(Bout[0].g = Aout[x].g) and
(Bout[0].b = Aout[x].b)
then begin
// mmo1.Lines.Add('начало перебора');
// xx:=0; yy:=0; q:=0; w:=x;
// while q < (x + b.Width-1) do begin
// if Bout[xx].r = Aout[w].r then mmo1.Lines.Add('да') else mmo1.Lines.Add('нет');
// if Bout[xx].g = Aout[w].g then mmo1.Lines.Add('да') else mmo1.Lines.Add('нет');
// if Bout[xx].b = Aout[w].b then mmo1.Lines.Add('да') else mmo1.Lines.Add('нет');
// Inc(xx); Inc(w); Inc(q);
// end;
// mmo1.Lines.Add('Конец перебора');
// Exit;
for yy := 0 to B.Height-1 do begin
AAout:=A.Picture.Bitmap.ScanLine[y+yy];
BBout:=B.Picture.Bitmap.ScanLine[yy];
for xx := 0 to B.Width-1 do begin
// mmo1.Lines.Add('RGB- '+IntToStr(BBout[xx].r)+'/'+IntToStr(BBout[xx].g)+'/'+IntToStr(BBout[xx].b)+
// ' -/- RGB- '+IntToStr(AAout[x+xx].r)+'/'+IntToStr(AAout[x+xx].g)+'/'+IntToStr(AAout[x+xx].b));
// Application.ProcessMessages;
if(BBout[xx].r = AAout[x+xx].r) and
(BBout[xx].g = AAout[x+xx].g) and
(BBout[xx].b = AAout[x+xx].b)
then begin
end else begin
Inc(indikator);
mmo1.Lines.Add('ошибка '+ indikator.ToString);
end;
//If Stop then begin Break; end;
if yy = B.Height-1
then begin
// Timer1.Enabled:= False;
// img1.Canvas.Ellipse(x,y,x+B.Width,y+B.Height);
ClikX:=x+(B.Width div 2);
ClikY:=y+(B.Height div 2);
mmo1.Lines.Add('НАЙДЕНА - '+Name+' - '+ IntToStr(xx)+' - '+ IntToStr(yy)+' / '+ IntToStr(x)+' - '+ IntToStr(y));
FreeAndNil(A);
FreeAndNil(B);
Result:=True; Timer1.Enabled:= True;
Exit;
end;
end;
//If Stop then begin Break; Stop := False; end;
end;
end;
end;
end;
if B <> nil then begin FreeAndNil(A); end;
if B <> nil then begin FreeAndNil(B); end;
mmo1.Lines.Add('НЕ НАЙДЕНА'+'-'+Name); Timer1.Enabled:= True;
end;