- UID
- 4699
- 精华
- 积分
- 525
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
楼主 |
发表于 2019-2-25 10:05:09
|
显示全部楼层
4、颜色的查找识别
考虑到不同的电脑分辨率大小就会有所不同,需要找的目标(颜色)出现的位置可能会不一样,我们并不知道它在屏幕上是在具体的哪个位置,如果要想找到它,可以通过对屏幕上的颜色数据进行一一遍历和判断,这样就能知道所要找的目标颜色在屏幕上的位置是哪个坐标值,进而找到它。
下面举个例子,如何利用颜色找到电脑桌面上的“计算机”图标?
(Win7)计算机
首先,打开鱼鱼抓色工具,勾选或按热键【Alt+~】启动取色功能,把鼠标移动到“我的电脑”图标的淡绿色点上(其实选择其它任意颜色点也是可以的)。
启动取色功能
然后,按下热键【Alt+~】停止取色。这样,就完成了“计算机”图标的颜色获取。
抓取到颜色值
接下来,就能够在屏幕区域(左边:0, 上边:0, 右边:1919, 下边:1079)范围内使用16进制的颜色值“00FF6B”进行查找,最终返回找到的颜色在屏幕上的具体坐标值。
需要特别注意的是,要查找的颜色必须在指定的区域范围内。
在屏幕上的具体坐标值
颜色查找方向
在指定区域范围内查找颜色时,一般默认的情况下是从左上到右下的方式进行遍历,如果你要找的颜色刚好在右下角时,还用这种方向进行遍历就会浪费很多时间,这个时候你就可以对查找方向的参数进行设置,使其为从右下到左上的方式进行遍历。以下提供了8种遍历方式。
颜色查找方向
问题:
如何进行多个颜色(红、黄、蓝)查找识别,并返回每个颜色的坐标?
(作业)多个颜色查找
VB6代码:
- 调用例子:
- Dim FoundX As Long, FoundY As Long, 颜色 As String
- 颜色 = "0000FF"
- Call 查找_屏幕区域找单色(0, 0, 1024, 768, 颜色, 0, 1, FoundX, FoundY)
- Debug.Print FoundX, FoundY '输出找到的坐标
- 封装函数:
- 'Call 查找_屏幕区域找单色(
- ' 区域左边:长整数,
- ' 区域上边:长整数,
- ' 区域右边:长整数,
- ' 区域下边:长整数,
- ' 查找颜色:字符串,
- ' 查找方向:整数[0-从左上往右下;1-从左下往右上;2-从右上往左下;3-从右下往左上,4-从上左往下右;5-从上右往下左;6-从下左往上右;7-从下右往上左],
- ' 颜色相似度:单精度[0.5到1之间;1为精确匹配],
- ' 输出找到的x坐标:整型变量,
- ' 输出找到的y坐标:整型变量
- ' )
- Public Sub 查找_屏幕区域找单色(左 As Long, 上 As Long, 右 As Long, 下 As Long, 颜色值 As String, 查找方向 As Integer, 相似度 As Single, FoundX As Long, FoundY As Long)
- Dim 结果x As Long, 结果y As Long
- 结果x = -1
- 结果y = -1
- 'On Error GoTo 结束
- '1.截取屏幕图片信息
- Dim 屏幕像素数据() As Byte
- Call 来源_获取屏幕像素(左, 上, 右, 下, 屏幕像素数据)
- '2.相似度计算
- Dim 颜色相似度 As Long, flag As Boolean
- 颜色相似度 = (1 - 相似度) * 255
- '3.拆解颜色值分量
- Dim 颜色 As Long, Red As Byte, Green As Byte, Blue As Byte
- 颜色 = CLng("&H" & 颜色值)
- Red = 颜色 Mod 256: Green = (颜色 \ 256) Mod 256: Blue = 颜色 \ 256 \ 256
- '4.颜色的查找识别
- Dim x As Long, y As Long, 宽 As Long, 高 As Long
- 宽 = 右 - 左 - 1
- 高 = 下 - 上 - 1
- flag = False
- Select Case 查找方向
- Case 0 '从左到右,从上到下.顺序
- For y = 0 To 高: For x = 0 To 宽
- If 颜色相似度 = 0 Then
- If 屏幕像素数据(2, x, y) = Red And 屏幕像素数据(1, x, y) = Green And 屏幕像素数据(0, x, y) = Blue Then
- flag = True: GoTo 结束
- End If
- Else
- If 颜色相似度判断(屏幕像素数据(2, x, y), 屏幕像素数据(1, x, y), 屏幕像素数据(0, x, y), _
- Red, Green, Blue, 颜色相似度) = True Then
- flag = True: GoTo 结束
- End If
- End If
- Next: Next
- Case 1 '从左到右,从下到上.顺序
- For y = 高 To 0 Step -1: For x = 0 To 宽
- If 颜色相似度 = 0 Then
- If 屏幕像素数据(2, x, y) = Red And 屏幕像素数据(1, x, y) = Green And 屏幕像素数据(0, x, y) = Blue Then
- flag = True: GoTo 结束
- End If
- Else
- If 颜色相似度判断(屏幕像素数据(2, x, y), 屏幕像素数据(1, x, y), 屏幕像素数据(0, x, y), _
- Red, Green, Blue, 颜色相似度) = True Then
- flag = True: GoTo 结束
- End If
- End If
- Next: Next
- Case 2 '从右到左,从上到下.顺序
- For y = 0 To 高: For x = 宽 To 0 Step -1
- If 颜色相似度 = 0 Then
- If 屏幕像素数据(2, x, y) = Red And 屏幕像素数据(1, x, y) = Green And 屏幕像素数据(0, x, y) = Blue Then
- flag = True: GoTo 结束
- End If
- Else
- If 颜色相似度判断(屏幕像素数据(2, x, y), 屏幕像素数据(1, x, y), 屏幕像素数据(0, x, y), _
- Red, Green, Blue, 颜色相似度) = True Then
- flag = True: GoTo 结束
- End If
- End If
- Next: Next
- Case 3 '从右到左,从下到上.顺序
- For y = 高 To 0 Step -1: For x = 宽 To 0 Step -1
- If 颜色相似度 = 0 Then
- If 屏幕像素数据(2, x, y) = Red And 屏幕像素数据(1, x, y) = Green And 屏幕像素数据(0, x, y) = Blue Then
- flag = True: GoTo 结束
- End If
- Else
- If 颜色相似度判断(屏幕像素数据(2, x, y), 屏幕像素数据(1, x, y), 屏幕像素数据(0, x, y), _
- Red, Green, Blue, 颜色相似度) = True Then
- flag = True: GoTo 结束
- End If
- End If
- Next: Next
- Case 4 '从上到下,从左到右.顺序
- For x = 0 To 宽: For y = 0 To 高
- If 颜色相似度 = 0 Then
- If 屏幕像素数据(2, x, y) = Red And 屏幕像素数据(1, x, y) = Green And 屏幕像素数据(0, x, y) = Blue Then
- flag = True: GoTo 结束
- End If
- Else
- If 颜色相似度判断(屏幕像素数据(2, x, y), 屏幕像素数据(1, x, y), 屏幕像素数据(0, x, y), _
- Red, Green, Blue, 颜色相似度) = True Then
- flag = True: GoTo 结束
- End If
- End If
- Next: Next
- Case 5 '从上到下,从右到左.顺序
- For x = 宽 To 0 Step -1: For y = 0 To 高
- If 颜色相似度 = 0 Then
- If 屏幕像素数据(2, x, y) = Red And 屏幕像素数据(1, x, y) = Green And 屏幕像素数据(0, x, y) = Blue Then
- flag = True: GoTo 结束
- End If
- Else
- If 颜色相似度判断(屏幕像素数据(2, x, y), 屏幕像素数据(1, x, y), 屏幕像素数据(0, x, y), _
- Red, Green, Blue, 颜色相似度) = True Then
- flag = True: GoTo 结束
- End If
- End If
- Next: Next
- Case 6 '从下到上,从左到右.顺序
- For x = 0 To 宽: For y = 高 To 0 Step -1
- If 颜色相似度 = 0 Then
- If 屏幕像素数据(2, x, y) = Red And 屏幕像素数据(1, x, y) = Green And 屏幕像素数据(0, x, y) = Blue Then
- flag = True: GoTo 结束
- End If
- Else
- If 颜色相似度判断(屏幕像素数据(2, x, y), 屏幕像素数据(1, x, y), 屏幕像素数据(0, x, y), _
- Red, Green, Blue, 颜色相似度) = True Then
- flag = True: GoTo 结束
- End If
- End If
- Next: Next
- Case 7 '从下到上,从右到左.顺序
- For x = 宽 To 0 Step -1: For y = 高 To 0 Step -1
- If 颜色相似度 = 0 Then
- If 屏幕像素数据(2, x, y) = Red And 屏幕像素数据(1, x, y) = Green And 屏幕像素数据(0, x, y) = Blue Then
- flag = True: GoTo 结束
- End If
- Else
- If 颜色相似度判断(屏幕像素数据(2, x, y), 屏幕像素数据(1, x, y), 屏幕像素数据(0, x, y), _
- Red, Green, Blue, 颜色相似度) = True Then
- flag = True: GoTo 结束
- End If
- End If
- Next: Next
- End Select
- 结束:
- If flag = True Then
- 结果x = x + 左
- 结果y = y + 上
- End If
- FoundX = 结果x
- FoundY = 结果y
- End Sub
- Private Function 颜色相似度判断(屏幕R As Byte, 屏幕G As Byte, 屏幕B As Byte, _
- 图片R As Byte, 图片G As Byte, 图片B As Byte, 阈值 As Long) As Boolean
- If _
- Abs(CLng(屏幕R) - 图片R) <= 阈值 And _
- Abs(CLng(屏幕G) - 图片G) <= 阈值 And _
- Abs(CLng(屏幕B) - 图片B) <= 阈值 Then
- 颜色相似度判断 = True
- Else
- 颜色相似度判断 = False
- End If
- End Function
复制代码
按键精灵2014脚本:
- 调用例子:
- Dim x, y, 颜色
- 颜色 = "0000FF"
- Call Plugin.TULING.FindColor(0, 0, 1024, 768, 颜色, 0, 1, x, y)
- TracePrint x & "," & y //输出找到的坐标
复制代码
|
|