delphi之模糊找图

AutoHotkey的源码,模糊找图和精确找图思路一样,也是用笨方法。原来的C代码比较难看懂,这里的delphi代码,很容易弄明白。

以下是模糊的找图。如果需要,可以再做优化处理。注意我这里去掉了透明处理,需要的自己加上吧。

因为用到了iif函数,别忘了uses IdGlobal;

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

// 其中nV是R,G,B的偏差值,0..255

function BmpCmpEx(bmpBig,bmp:TBitmap;x,y:integer;nV:byte):boolean;

var                                  

  i,j:integer;

  row1, row2:pRGBTripArray;

  p1,p2:TRGBTriple;

  pLow,pHigh: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];

      // uses IdGlobal, 如果使用IfThen代替iif, Uses Math

         pLow.rgbtRed  := iif(nV > p2.rgbtRed,  0 , p2.rgbtRed - nV);

         pLow.rgbtGreen := iif(nV > p2.rgbtGreen, 0 , p2.rgbtGreen - nV);

         pLow.rgbtBlue  := iif(nV > p2.rgbtBlue , 0 , p2.rgbtBlue - nV);

         pHigh.rgbtRed  := iif((nV > $FF - p2.rgbtRed) , $FF , p2.rgbtRed + nV);

         pHigh.rgbtGreen := iif((nV > $FF - p2.rgbtGreen) , $FF , p2.rgbtGreen + nV);

         pHigh.rgbtBlue  := iif((nV > $FF - p2.rgbtBlue) , $FF , p2.rgbtBlue + nV);

      if not ((p1.rgbtRed>=pLow.rgbtRed) and (p1.rgbtRed<=pHigh.rgbtRed)

        and (p1.rgbtGreen>=pLow.rgbtGreen) and (p1.rgbtGreen<=pHigh.rgbtGreen)

        and (p1.rgbtBlue>=pLow.rgbtBlue) and (p1.rgbtBlue<=pHigh.rgbtBlue)) then

                begin

        result:=false;

        exit;

      end;

    end;

  end;

end;

 

以下是模糊找图, 调用模糊判断

// 模糊找图,在大图里的(x1,y1)和(x2,y2)中找出小图来?

// 其中nV是R,G,B的偏差值,0..255

// 当返回true时,以下变量存放找到的位置

//    bmpFindX:integer;

//    bmpFindY:integer;

function BmpFindEx(bmpBig,bmp:TBitmap;x1,y1,x2,y2:integer;nV:byte):Boolean;

var

  x,y:integer;

begin

  if x1+y1+x2+y2=0 then

  begin

    x1:=0;

    y1:=0;

    x2:=bmpBig.Width-1;

    y2:=bmpBig.Height-1;

  end;

  for y:=y1 to y2-1 do //行

  begin

    if bmp.Height>y2-y then //高度不够,失败了

      break;

    for x:=x1 to x2-1 do //列

    begin

      if (bmp.Width>x2-x) then //宽度不够,本行完成检查了

        break;

      begin

        if BmpCmpEx(bmpBig,bmp,x,y,nV) 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/devlyn/archive/2010/08/30/1812350.html

完整的函数:CreateImageButton HWND Options Margins 0 有三个需要输入的参数 第一个是按钮的句柄值 必填 第二个是个数组 必填 第三个是按钮的边界宽度 可填值 0 1 2 3 4 值越高边框越宽 不填的话默认为0 ;这是一个简单事例: ;创建一个普通的按钮 对比用: Gui Add Button w200 Button 0 ; 再创造出实验的按钮: { hwndHBT1 貌似是取得该按键的句柄 hwnd是固定的 就像 g v 值存在变量HBT1里} Gui Add Button w200 hwndHBT1 Button 1 ; 编写出函数的第二个参数: BT1Options : [{BC: "A00000|FF00FF" TC: "White" 3D: 0 G: 1}] ;这个代表普通状态下 按钮的样式 BT1Options[2] : {BC: "600000" TC: "Lime" 3D: 0 G: 0} ;这个代表鼠标悬在按钮上方状态下 按钮的样式 ;是个数组 下边是具体含义 格式直接按照他这样来 ;1 数组序号 也就是 BT1Options[2] 里边的 2 的含义: ; 1 代表普通状态下 ; 2 代表鼠标悬停在按钮上 不按下 ; 3 代表鼠标按住按钮 ; 4 代表按钮在 disable 状态下 按钮无效化 ; 5 代表按钮在 Default 状态下 按钮默认 ; 6 估计用不上 直接上老外的原文吧:< used only on tablet computers ; 其中数组的第一个必须有 也就是上边的BT1Options 后边的根据需要添加 ; ;2 BC是Background Color的缩写 就是代表按钮的颜色 ; 使用的是RBG色 例如:00FF00 或者HTML色 例如"Red" ; "|" 前边的 也就是上边的"A00000" 外围颜色 后边的是中心颜色 ; 也可以里外用一种颜色直接 像这样 BC: "600000" ; ;3 TC是Text Color的缩写 也就是按钮上边文字的颜色 ; 参照背景颜色BC ; ;4 3D表示的是按钮的样式 大家自己改改看就知道了: ; 0 普通 ; 1 中间鼓起 ; 2 垂直纹理 ; 3 水平纹理 ; 9 老外写的背景片 大家自己试试吧 原文:BC contains the picture"s path or HBITMAP handle ; 默认为 0 ; ;5 G代表Gamma Correction 像灰度矫正 这个太专业 我也不懂 大家自己试试吧 ; 0 表示否 ; 1 代表是 ; 默认为 0 ;解释完毕 ; ;调用函数 参数依次填入 这里的第三个函数"边界宽度"就缺省了 默认0 CreateImageButton HBT1 BT1Options ">完整的函数:CreateImageButton HWND Options Margins 0 有三个需要输入的参数 第一个是按钮的句柄值 必填 第二个是个数组 必填 第三个是按钮的边界宽度 可填值 0 1 2 3 4 值越高边框越宽 不填的话默认为0 ;这是一个简单事 [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值