delphi之精确找图

以前一直以为找图比较难,后来看了AutoHotkey的源码,原来也就是笨方法。

以下是精确的找图。因为已经很快,没再做优化处理。注意我这里去掉了透明处理,需要的自己加上吧。

// 精确判断,在大图里的(x,y)位置上是不是小图?

function  BmpCmp(bmpBig,bmp:TBitmap;x,y:integer):boolean;
var
  i,j:integer;
  row1, row2:pRGBTripArray;
  p1,p2:TRGBTriple;
begin
  result:
= true;
  
for  j: = 0   to  bmp.Height - 1   do
  
begin
    row1:
= bmpBig.ScanLine[y + j];
    row2:
= bmp.ScanLine[j];
    
for  i: =   0   to  bmp.Width - 1   do
    
begin
      p1:
= row1[x + i];
      p2:
= row2[i];
      
if  (p1.rgbtBlue <> p2.rgbtBlue)  or  (p1.rgbtGreen <> p2.rgbtGreen)
        
or  (p1.rgbtRed <> p2.rgbtRed)  then
      
begin
        result:
= false;
        exit;
      
end ;
    
end ;
  
end ;
end ;

以下是精确找图, 调用精确判断

//  精确找图,在大图里的(x1,y1)和(x2,y2)中找出小图来?
//  当返回true时,以下变量存放找到的位置
//  bmpFindX:integer;
//  bmpFindY:integer;
function  BmpFind(bmpBig, bmp: TBitmap; x1, y1, x2, y2: integer): Boolean;
var
  i, j, x, y: integer;
  row, row1, row2: pRGBTripArray;
  p0, p, p1, p2: TRGBTriple;
begin
  
if  x1  +  y1  +  x2  +  y2  =   0   then
  
begin
    x1 :
=   0 ;
    y1 :
=   0 ;
    x2 :
=  bmpBig.Width  -   1 ;
    y2 :
=  bmpBig.Height  -   1 ;
  
end ;
  row :
=  bmp.ScanLine[ 0 ];
  p0 :
=  row[ 0 ];
  
for  y : =  y1  to  y2  -   1   do
  
begin
    row :
=  bmpBig.ScanLine[y];
    
for  x : =  x1  to  x2  -   1   do
    
begin
      p :
=  row[x];
      
if  (bmp.Width  <=  x2  -  x)  and  (bmp.Height  <=  y2  -  y)
        
and  (p.rgbtBlue  =  p0.rgbtBlue)  and  (p.rgbtGreen  =  p0.rgbtGreen)
        
and  (p.rgbtRed  =  p0.rgbtRed)  then
      
begin
        
if  BmpCmp(bmpBig, bmp, x, y)  then
        
begin
          result :
=  true;
          bmpFindX :
=  x;
          bmpFindY :
=  y;
          exit;
        
end ;
      
end //   end   if
    
end //   end   for  x
  
end //   end   for  y
  result :
=  false;
end ;

转载于:https://www.cnblogs.com/rogee/archive/2010/09/15/1827238.html

猜你喜欢

转载自blog.csdn.net/weixin_33989780/article/details/94681045