大家好,我是公众号3分钟学堂的郭立员~

前言

半透明还是白色的图标,想要查找它的位置是很难的,我想了半天好像也没有现成的命令处理这个问题,于是就想尝试自己做一个解决这个问题。

一、半透明还是白色图标的特征

按键精灵如何确定某一位置的坐标(半透明白色图标怎么获取位置坐标)(1)

以这个刷新图片的图标为例,图标本身是一个白色旋转的箭头,箭头周围都是透明镂空的,可以看到底图。

这类图标的特征有三个:

①图标本身只有白色

②图标所在区域是存在镂空透明的

③背景图不是固定图,而是随机变化的

二、为啥白色镂空透明的图标,不适合常用的图色命令识别位置

获取屏幕上某个图像的坐标,我个人常用的是两个命令,找图命令和多点找色命令。

但是对于白色镂空透明的图标,两个命令都不太适合。

①找图命令不适合的原因

找图命令用到的截图有两种截图方式:一是直接截取图标所在的整个区域,由于镂空会看到下面不同的背景,每个背景图对应的截图都是不一样的,从而使得找图命令失败。

按键精灵如何确定某一位置的坐标(半透明白色图标怎么获取位置坐标)(2)

二是只截取图标的一部分,不截取到背景图,由于图标是白色的,那么截图的像素点就全部是白色,对于按键来说,只要是截图四个角是一样的颜色,就会把这个颜色视为透明色,由于这个截图全部像素都是白色,那么整个截图就会看做是透明图,在按键中透明图可以匹配任何颜色,那么肯定会找到一个错误的坐标位置。

按键精灵如何确定某一位置的坐标(半透明白色图标怎么获取位置坐标)(3)

综上所述找图命令不能使用。

②多点找色命令为啥也不能用

多点找色是要在屏幕中找到由多个像素组成的颜色集合,如果屏幕有和颜色集合全部一样的像素就是我们多点找色的返回坐标,颜色集合分为基础色和比对色,代码如下:

"FFFFFF", "-21|-5|FBFBFC,-31|12|FFFFFF,-14|29|FFFFFF,0|23|FAFAFA,1|11|A59B9C"

基础色就是指定的一个颜色值,一般就是抓抓中获取的第一个值

比对色是由相对坐标和颜色值组成的,相对坐标是指该像素点与基础色的位置关系,颜色值就是该像素点的颜色值。

按键精灵如何确定某一位置的坐标(半透明白色图标怎么获取位置坐标)(4)

多点找色的原理是先找到基础色,然后逐个判断“比对色”的相对坐标和颜色值是不是和写的参数一样,如果所有比对色都比对正常,那么就认定基础色的坐标就是我们要找的坐标位置。

为啥多点找色不适合找白色镂空透明的图标,看下图:

按键精灵如何确定某一位置的坐标(半透明白色图标怎么获取位置坐标)(5)

如果屏幕中有较大区域的白色,多点找色的颜色比对也是成立的,那么就会形成干扰。

三、怎么找到白色镂空透明的图标

我个人的想法是在多点找色的基础上,加上一个“非白色像素点”的判断,目的是排除纯白色区域的干扰。

按键精灵如何确定某一位置的坐标(半透明白色图标怎么获取位置坐标)(6)

如上图,我们在多点找色中加入一个在镂空位置像素点的颜色判断,点①是非白色、点②是白色,通过这个点是不是白色就可以排除掉纯白区域了。

四、“重构”多点找色

由于我们没有修改命令的权限,只能是自己造一个“多点找色”,为了填写方便还是沿用多点找色的参数格式,这样参数可以直接在抓抓中复制。

"FFFFFF","-28|0|FFFFFF,-18|-7|F4F8F9,-26|23|FFFFFF,-10|27|FAFBFC,-24|18|126469"

按键精灵如何确定某一位置的坐标(半透明白色图标怎么获取位置坐标)(7)

“重构”多点找色具体思路如下:

①全屏(指定区域)遍历基础色

KeepCapture For j = 471 To 724 For i = 471 To 715 If CmpColor(i, j, 颜色值, 0.95) = 0 Then End If Next Next ReleaseCapture

②根据基础色在遍历“比对色”

按键精灵如何确定某一位置的坐标(半透明白色图标怎么获取位置坐标)(8)

抓抓的颜色记录中2-6都是比对色,在填写参数是会用到相对坐标,如下所示,注意最后一个颜色值不是白色。

dim 比对颜色="-28|0|FFFFFF,-18|-7|F4F8F9,-26|23|FFFFFF,-10|27|FAFBFC,-24|18|126469"

把对比色中的相对坐标和颜色值拆分,然后用基础色的坐标 相对坐标来得到比对色的坐标,之后看这个坐标的像素点颜色值是不是我们填写的,如果测试没问题,就比对下一个相对位置,一直比对到最后一个颜色点,这个点的比对是我们加上去的,要比对它是“非白色”才是符合要求的点,目的是排除大面积白色的情况。

dim x=656 dim y=570 dim 比对颜色="-28|0|FFFFFF,-18|-7|F4F8F9,-26|23|FFFFFF,-10|27|FAFBFC,-24|18|126469" dim 颜色信息 dim 颜色信息数组=split(比对颜色,",") For i = 0 To UBOUND(颜色信息数组) If i = UBOUND(颜色信息数组) Then 颜色信息=split(颜色信息数组(i),"|") If CmpColor(x 颜色信息(0), y 颜色信息(1), "FFFFFF", 0.9) = -1 Then Else Exit For End If Else 颜色信息=split(颜色信息数组(i),"|") If CmpColor(x 颜色信息(0), y 颜色信息(1), 颜色信息(2), 0.9) = 0 Then Else Exit For End If End If If i = UBOUND(颜色信息数组) Then TracePrint "颜色符合" End If Next

五、会有多个点符合要求的情况。

按键精灵如何确定某一位置的坐标(半透明白色图标怎么获取位置坐标)(9)

看到返回结果中有多个坐标值,这些坐标值都非常接近,这个原因是这样的。

按键精灵如何确定某一位置的坐标(半透明白色图标怎么获取位置坐标)(10)

在图中我连接了基础色和比对色的几个点,组成了一条线,图中有3条线,每条线上的拐点都是符合要求的,为啥有多条符合的呢,因为图标的线条是有厚度的,稍微移动一两个像素也是在图标内部,所以就出现多组符合要求的点。

由于这些点比较接近,其实我们选择其中一个点作为我们多点找色的结果就行。

=正文完=

,