摘要: 前言 最近有好几个朋友都在问我找图找色的问题,奇怪?于是乎写了一个专门用于找图找色的单元文件“BitmapData.pas”。在这个单元文件中我实现了从文件中导入位图、屏幕截图、鼠标指针截图、在图片上查找子图、在图片上查找颜色等功能。在查找过程中可以设定颜色变化范围、可以从左到右从上到下查找、也可以从指定点向四周查找。关于这个文件的下载和使用,可以参考本文的第四节。下面详细说说这些功能的实现。一、数据提取 位图其实可以看成是一个由象素组成的矩阵,找图找色可以看成是象素值的比对。很多新手在设计这类的程序时喜欢使用TBitmap.Canvas.Pixels属性,这个属性其实是对API函数Get.. 阅读全文
posted @ 2013-05-29 16:49 Max Woods 阅读(658) 评论(0) 推荐(0) 编辑
摘要: AutoHotkey的源码,模糊找图和精确找图思路一样,也是用笨方法。原来的C代码比较难看懂,这里的delphi代码,很容易弄明白。以下是模糊的找图。如果需要,可以再做优化处理。注意我这里去掉了透明处理,需要的自己加上吧。因为用到了iif函数,别忘了uses IdGlobal;// 模糊判断,在大图里的(x,y)位置上是不是小图?// 其中nV是R,G,B的偏差值,0..255function BmpCmpEx(bmpBig,bmp:TBitmap;x,y:integer;nV:byte):boolean;var i,j:integer; row1, row2:pRGBTripArray; p 阅读全文
posted @ 2013-05-29 16:47 Max Woods 阅读(466) 评论(0) 推荐(0) 编辑
摘要: 以前一直以为找图比较难,后来看了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.ScanLi 阅读全文
posted @ 2013-05-29 16:46 Max Woods 阅读(808) 评论(0) 推荐(0) 编辑
摘要: 找色和色块,是模拟的重要基础。有时候,需要确定某点是否出现某种颜色,有时候需要判断色块是否出现在某位置有时候,需要看范围内是否出现色块。function IsColor(bmp:TBitmap; x,y:integer; c:TColor):boolean;var row:pRGBTripArray; p:TRGBTriple;begin row:=bmp.ScanLine[y]; p:=row[x]; result:=(p.rgbtBlue=GetBValue(c)) and (p.rgbtGreen=GetGValue(c)) and (p.rgbtRed=GetRValue(c));en 阅读全文
posted @ 2013-05-29 16:44 Max Woods 阅读(377) 评论(0) 推荐(1) 编辑
摘要: 模拟需要找色,找图等等功能,我们先要熟悉有关的知识。我们的目的是为了找色和找图,所以只用考虑只需要处理24B颜色(PF24BIT)。TColor值是以十六进制进行存储的,低三位分别表示红、绿、蓝三种基色的饱和度。var C:Tcolor R,G,B:Byte;TColor转换成RGB的值 R:=GetRValue(C); G:=GetGValue(C); B::=GetBValue(C);或 R:=C and $FF; G:=(C and $FF00) shr 8; B:=(C and $FF0000) shr 16;RGB转换成TColor的值 C:=StrToInt(IntToHex(B, 阅读全文
posted @ 2013-05-29 16:43 Max Woods 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 查找游戏窗口procedure FindGameWindow;var h:THandle; buf:array[0..255] of char;begin FillChar(buf,sizeof(buf),0); h := GetForegroundWindow(); while (h<>0) do begin GetWindowText(h, buf, 255); if (AnsiContainsStr(buf, '游戏标题名称')) then begin // 找到一个游戏窗口句柄,做记录或其他处理 end; h:=GetNextWindow(h,2); end 阅读全文
posted @ 2013-05-29 16:42 Max Woods 阅读(331) 评论(0) 推荐(0) 编辑
摘要: 网上有很多的关于模拟按键的例子,经过实验,我选如下一组函数procedure SendShift(H: HWnd; Down: Boolean);var vKey, ScanCode: Word; lParam: longint;begin vKey:= $10; ScanCode:= MapVirtualKey(vKey, 0); lParam:= longint(ScanCode) shl 16 or 1; if not(Down) then lParam:= lParam or $C0000000; SendMessage(H,WM_KEYDOWN, vKey, lParam);end; 阅读全文
posted @ 2013-05-29 16:40 Max Woods 阅读(879) 评论(0) 推荐(0) 编辑
摘要: 以下的抓图,来源于网上。function dlGetDesktopRect(nLeft,nTop,nWidth,nHeight:integer;pixel:TPixelFormat):TBitmap;var dcDesk:hdc; bmp:TBitmap;begin bmp:=TBitmap.Create; bmp.PixelFormat := pixel; bmp.Width:=nWidth; bmp.Height:=nHeigth; dcDesk:=GetDC(GetDesktopWindow); BitBlt(bmp.Canvas.Handle,0,0,nWidth,nHeigth,dc 阅读全文
posted @ 2013-05-29 16:39 Max Woods 阅读(508) 评论(0) 推荐(0) 编辑
摘要: 现在有些蛋疼坑爹的游戏,会检测显卡的名称,如果其中有“Vmware”这类的字眼,就会提示程序在虚拟机中运行而拒绝执行(太不科学了嘛,我要是把我的实机驱动名称也改成VMware GTX560的话,也运行不了)大家可以上X宝找找,这些虚拟机还要卖8-30元一个,我日,太坑爹了……在我自己找到方法之后,我后来又在网上找到个改显卡名称的教程,而且的确有用。虽然原理上是一样的,不过过程不一样,我下面就分享一下我的做法吧首先:安装好VMware Tools工具(这个就不多说了,包括怎么安装虚拟机系统)然后装个驱动精灵--点击显卡备份将压缩文件里的 VMware SVGA II 文件夹解压出去,然后打开Oe 阅读全文
posted @ 2013-05-29 14:53 Max Woods 阅读(951) 评论(0) 推荐(0) 编辑