按键精灵找图秘籍【原创】(361度 按键精灵找图系列之一)
经常在论坛里看到有人发按键精灵找图求助的帖子,所以特意写了此篇文章(可能算不上文章)。
虽然我以前有抓图的经验,但为了写篇像样的文章,特意做了不少实验。
首先要强调的是设置找图参数问题(不是刚学抓图的人,这点可以不用看)。下面是找图的语句
VBSCall Call FindPic(left,top,right,bottom,filename,similar,x,y)
left处填写找图区域的左边界,top处填写找图区域的上边界,right处填写找图区域的右边界,bottom处填写找图区域的下边界。
设置的找图区域不要出屏幕范围,否则可能会出错(我也不太确定^_^)。如果屏幕分辨率是1024×768,那屏幕范围是0,0,1023,767;如果如果屏幕分辨率是800×600,那屏幕范围是0,0,799,599。因为屏幕坐标是从0开始算的,不是从1开始算的,所以右边界和下边界的值要减1。曾经看到有人找图范围设置成0,0,800,600,就超出了屏幕范围。
filename处填图片文件名的路径,也可以只填文件名,这时墨认图片文件的路径是在script文件夹下,图片文件要是BMP格式的,JPG格式估计不行(没试过^_^),失真大。
similar处填图片的相似度,取值在0.5到1之间(我曾经试过取2,测试结果忘了-_-! 别砸我),取的值越大,相似度越高,找图的速度也越快(这是别人说的)。虽然按键精灵的作者推荐取0.9,但只要图不是透明的,背景设置正确(这是这篇文章的重点),设成1都能找到(再同一台电脑上肯定没问题,换台电脑就不知道了)。
x处填保存找到的图片的横坐标的变量,y处填保存找到的图片的纵坐标的变量。这程序返回的是找到的图片的左上角的坐标。当程序找不到符合的图片时,这2个变量都被置-1。这里要注意,如果脚本中用鼠标的位置来指示找到的图片,如果没有考虑到找不到符号图片的问题,当找不到符合的图片时,虽然鼠标不能移到坐标(-1,-1)处,但鼠标会移到屏幕左上角,也就是坐标(0,0)处。
下面就是这篇文章的重点:(如何处理图片背景)
对于不透明的图片,只要图片的背景处理得正确,找图的成功率是很高的。只要你要找的图不是透明的,且完整地显示再屏幕上,找图的成功率基本是100%(目前还没遇到过意外,为了防止出现意外,这里加了个基本。不过这也不能保证安全,因为我的一个老师写的书也是怕遇到特殊情况,加了个基本上去,被人挑了刺-_-!)。
首先来纠正下部分人的错误观点:
1、白色是程序默认的透明色(注意这里说的是错误观点,大家别弄反了)
任何颜色都可以是背景色,只要程序认定了哪种颜色是背景色,哪种颜色就是透明色(有图为证,见这篇文章所附的图中图16,当桌面上有全蓝图片时,这语句就找不到合适的图片,原因是此图中有块白色区域)。所以这个语句也可以找纯白的图片。
2、(还没想到,等我想到了再补上^_^)
现在开始说处理图片背景的问题:
同一图片的背景色要为同一种颜色(为了防止遇到笨蛋,特加上这句,知道和不知道这点的人都别砸我,现在写篇文章不容易啊,要考虑到不同层次的人)。处理图片背景的时候一定要认真,要把图片设置成最大(我是用画图处理的,放大率调成8倍,还设置成有网格),一定要把原图片的背景都改成同一种,最好是要找的东西的图片上没有的颜色,改的时候一个像素都别漏,一个像素都会决定你的成败。
下面是这篇文章的核心部分——程序如何判断背景色
毕竟电脑不是人,没那么聪明,人不要人教就能判断背景色,而且十分准确。要是程序判断背景色错误,就不能对图片进行准确的识别,所以知道程序判断背景色的方法是非常重要的,既然程序不能适应我们,那我们就去适应它(这程序没救了,还要我们去适应它,一点人性化都没有-_-!)。对按键精灵如何判断背景色,我有3种猜测:
1、以图片四个角的颜色做为背景色;
2、以图片中所占像素最多的颜色作为背景色;
3、采用前面2种方法进行综合判断。
其中第一种方法最容易实现,采用的可能行最大。
为了证明我的猜测我做了很多试验(顺便说下闲话,为什么叫试验呢,而不叫实验,我的老师说:“试验是先前不知道结果的,试是测试下的意思;实验是先前知道结果的,实是实践的意思。”早就知道的人别向我扔鸡蛋,是我以前分不清,我就以为你们也分不清。这里可是真正的试验哦,不是实验。那些科学家做的也是试验,我做的是和他们一个等级的,我又在吹牛了^_^),下面的是实验时所使用的脚本:
VBSCall FindPic(0,0,1023,767,"测试.bmp",1,x,y)
If x>=0 and y>=0
MoveTo x,y
Else
VBSCall MessageBox("没找到图片")
EndIf
我的系统设置为32位色,屏幕分辨率是1024×768,其他的就不说了,和这次测试没关系,这也是个人隐私嘛!
试验时“测试.bmp”文件放在了script文件夹里(这样就不用写路径了,偷下懒)。
这次试验时所用过的“测试.bmp”图片如图“测试”所示(这论坛里图片和文字怎么不能交替地放-_-!)。图“测试”里的图是在画笔里放大8倍后再加网格的结果,每一格就是一个像素,其实那些图片是很小的。测试结果如图“结果”。测试时是用画笔的调色板做为被找的图片。细心的人也许会发现有些“测试”的图片在“结果”里找不到结果,下面来解释下,这里有3种图片在“结果”里是找不到的,一是没必要用图片来表达试验结果的图片,它们结果是弹出个对话框,显示“没找到图片”,这样的试验图片有在图“测试”里的图16和19;第二种是无法用局部图片来表达试验结果的试验,它们的试验结果是鼠标移到了屏幕的左上角,屏幕坐标(0,0)处,这样的试验图片有图“测试”里的图7,9;第三种是不是用来做试验的,是用来给你们看下我处理图片背景的过程,这样的图片有在“测试”里的图18、19、20。
图“测试”里的图1到图9证明了,该程序是优先采用如果图片4个角的颜色相同时,侧取4个角的颜色作为背景色。四个角的颜色不相同时是采用什么方法来识别背景色的就不清楚了。但知道“优先采用如果图片4个角的颜色相同时,侧取4个角的颜色作为背景色。”这点就已经足够了,要想让程序知道什么是背景色,把图片的四个角都填成背景色就可以了。实践的例子如图“测试”里的图18,19,20。图19是把抓来的图片里的原图——图18的背景色都处理成相同的颜色,然后找原图就会弹出“没找到图片”的对话框。原因就是图19里的右下角的颜色和其它3个角的颜色不相同,程序识别背景色错误。此时,把图19的右下角的颜色改成和其它3个角的颜色相同,如图20,再找原图就成功了。
图“测试”里的图7和图9就奇怪了,为什么鼠标会移动屏幕坐标(0,0)处,却没弹出“没找到图片”的对话框,这说明此时城乡返回的坐标是(0,0)。为什么会这样?请按键精灵的作者来解释下。不过大家不用当心,处理背景色的时候4个角都取背景色就不会出现这种情况了。
图“结果”里的第4个和第5个图有人或许会觉得奇怪,鼠标指的不是图片的左上角,而是指到图片外面去了。那是因为测试图片的上面几行和左边几行被系统认为是背景色,也就是作为透明的来处理,透明的就是那些地方是任何颜色都可以,所以调色板里的那些蓝色色块左上角外面的也符合要求。所以鼠标指的还是被找图片的左上角。不信看看图“测试”里的图10和图11的测试结果。
图“结果”里的第2个图大家也不要以为实验出来的结果是找到鼠标所指向的颜色的图片,其实也是蓝色,原因和前面的一样。
图“测试”里的图12是用来测试被其他颜色包围的背景色是不是也被程序认为是透明的,试验结果证明这种情况也被程序认为是透明的。
文章写到这里就基本结束了(一不小心就写了这么多-_-!,让大家看得辛苦了),高手看到这里或许失望了,估计这些你早就知道了(这句不是写给按键精灵的作者看的。要是按键精灵的作者来看了,请继续看后面的,后面有要对你说的话。),但你既然来了,就顺便帮我找找错误,或者补充下我写的东西。
既然我是为了给按键精灵的作者找茬才来这个论坛注册,那就继续给他找茬,省得浪费了我的注册这个论坛会员的时间。按键精灵的作者请看下面:
我对这次的实验的感受啊,要我怎么跟你说呢?你那条找图语句里怎么就不能多加2个输入参数呢?一个是是否使用背景,一个是背景的颜色,或者是背景色在图片中的坐标(让程序在该图中遇到与该点处的颜色相同的像素的就认为是背景),个人认为这里的第2种方法比较好,因为用第1种方法有个缺点:如果这程序在设置为32位色的电脑上能运行通过,那在在设置为16位色的电脑上就不能准确识别背景色。这样大家都明白,你写程序也简单啊。而程序像现在这样,你写判断背景色的部分麻烦,别人又不知道你是如何判断背景色的,弄得找图失败都不知道原因。当然,既然我写了这篇文章你也不用改程序了。^_^
转贴本人的文章请注明原作者和出处(估计没人会转贴这篇文章,写得不好,别人看着都累)。本人一般不会转贴别人的文章(虽然版主允许靠转贴得精),最多给你个链接让你自己去看。毕竟写文章是辛苦的,而转篇文章却只要几秒钟。
按键精灵找图系列之二在这里:http://bbs.vrbrothers.com/viewthread.php?tid=33164&extra=page%3D20(虽然有人在我之前发过类似的贴子,但我这个里面的脚本没有用Goto,对新手养成良好的编程习惯或许有一定的帮助)
------------------------------------------------------------------------------------------
结果