图色绝招——让你轻松识别放大后的图片
高大上的等比例多点找色
本文由按键学院提供技术支持
按键学院交流群(1群已满):376122403零基础学按键精灵群(2群):372671254
小编最近接到一个新手童鞋关于找图的问题,写了找图的代码,但是总也找不到图。小编检查了代码上完全没问题,最后发现,原来是想要找的图和游戏中的图片大小比例不对!!小编心里是一万只羊驼奔腾而过……图片的比例都不一致当然是找不到的啦。
当小编乐呵呵的和工程师07大大说起这个事情的时候,07大大以45度角仰天抬头,沉思了一会说道:不同比例大小的图是不能直接通过找图找到的,但是……也并非没办法实现
{:4_115:}
原理分析
按键精灵使用找图命令是判断图片的每个像素点的颜色是否一致来实现的,如果图片大小比例不一致的话,两张图之间的像素点的比例还有颜色可能就会不相同,所以使用找图的命令是无法通过小图找到大图的。
{:4_99:}
但是呢,想要实现通过小图来找大图也并非完全没办法的。 童鞋们可以仔细观察下一张图放大和缩小的画面,其实图片的放大和缩小都是按照一定的比例进行的,放大图片其实就是里面的像素按照一定的比例给放大了。
所以可以得出一个思路————只要把找小图的命令里的相关数值也按照一定比例去放大就可以找到大图了!!
当然,这样的话就不能使用找图的命令了,因为找图命令并没有明确的数值可以去设置,所以就需要使用到多点找色的命令来实现。
比例换算
先介绍下多点找色的命令
命令名称 FindMultiColor
命令功能 范围区域内查找多点颜色
命令参数 参数1 整数型,屏幕左上角X坐标参数2 整数型,屏幕左上角Y坐标
参数3 整数型,屏幕右下角X坐标
参数4 整数型,屏幕右下角Y坐标
参数5 字符串型,第一点16进制颜色值
参数6 字符串型,符合偏移点颜色组(相对第一点位置偏移X坐标|相对第一点位置偏移Y坐标|16进制颜色)
参数7 整数型,相似度
返回值: 字符串型,左上角第一点颜色位置坐标
范例:XY = Plugin.Color.FindMultiColor(0, 0, 1024, 768, "FFFFFF", "2|0|FFFFFF,-6|1|FFFFFF”,1)
通过上面的代码可以发现,这个找色命令的关键部分是 "FFFFFF", "2|0|FFFFFF,-6|1|FFFFFF” 这段。它是根据第一个坐标进行偏移指定的像素点。
根据上面的原理来看,我们就可以得出这样的算法
大图偏移值 = 小图偏移值 * 图片缩放比例
我们可以把他编写成一个函数,方便之后的转换:
Function 比例换算(数组, 比例)
Dim str
arr = 数组
arr1 = Split(arr(1), ",")//把多点偏移部分提取出来分割
str = ""
For i = 0 To UBound(arr1)
arr2 = Split(arr1(i), "|")//把偏移值分割出来
str = str & arr2(0) * 比例 & "|" & arr2(1) * 比例 & "|" & arr2(2) & ","//偏移值分别乘以比例,然后连接起来赋值给变量str
Next
arr(1) = Left(str,Len(str)-1)// 这行代码是为了把str变量中结尾多出来的逗号去掉
比例换算1 = arr //把最终换算好的数组传递给函数作为返回值
End Function
//下面是范例,第一个参数是数组,第二个是图片缩放的比例
多点 = 比例换算1(Array("BDBDBD", "0|-3|5A6373,0|-7|39394A,2|-5|BDBDBD"), 1)
实际应用
看了上面的代码,有童鞋会有疑问,如果事先不知道图片缩放的比例该怎么办?
这个问题其实很好解决:
对于事先不知道缩放比例的图,我们可以用一个循环一直遍历不同的比例,找到对应的图片后就退出循环。
这里就先拿一个游戏的截图来举例:
这个是正常大小的图片,我们先从这个图片中进行多点找色,这里我们找的是”水“这个字
这个是图片放大之后,我们就是好要利用下面的遍历的方法去在里面找到这个”水“
Do
//先把多点找色的偏移值进行换算,把比例参数设置成变量,每次循环递增一点
多点 = 比例换算1(Array("80F0F8","0|2|70E8F8,0|5|50D8F8,0|8|30C8F8,0|11|18B8F8,-2|11|18B8F8,-5|10|20BXF8,-4|9|28C0F8,-3|8|30C8F8,-2|8|606020,3|8|30C8F8,4|9|28C0F8,5|10|20BXF8,5|11|606020"), z)
TracePrint 多点(0) &"*"& 多点(1)
//把结果带入到多点找色的命令里。
XY=Plugin.Color.FindMutiColor(0,0,1900,900,多点(0),多点(1),0.8)
MyArray = Split(XY, "|")
X = CInt(MyArray(0)) : Y = CInt(MyArray(1))
If x >= 0 Then
TracePrint z
MoveTo x, y
Exit Do
End If
//这里设定比例每次循环递增0.1 的量,具体的递增的量可以自行修改,建议在1以内
z = z + 0.1
Delay 500
TracePrint z
Loop注意要点:
1、这里编写出的函数是只针对等比例缩放的图片,即是长和宽的缩放比例是一致的。如果长和宽缩放的比例不一致的话是无法直接使用上面的换算函数。
2、使用等比例换算来找色,对于放大后的图片是有一定要求的,放大后的图片不能和原图差太多,因为图片被放大过多的话,那图片中的像素点可能会出现失真模糊的情况,那找色也是无法找到的。
童鞋们在平时的使用中要多注意哦 不知道说些什么了,太鸡冻了 就不告诉你,就不告诉你,就不~告诉你! 回复一下 证明我来过 支持楼主,绝对顶你...谢谢! 支持楼主,绝对顶你...谢谢!{:smile:} 诶呀诶呀,真的满需要的~哈哈! 楼主加油,我们都看好你
页:
[1]