找回密码
 加入
搜索
查看: 3410|回复: 10

关于区域内有多个相同颜色的搜索问题

[复制链接]
发表于 2009-8-19 02:37:15 | 显示全部楼层 |阅读模式
在一个区域内,有多个相同的颜色,我暂时知道的函数是 PixelSearch 函数,但是它只返回区域内第一个匹配的像素的坐标,而我想知道的是整个区域的所有那个颜色的坐标,请问该用什么函数呢?
帮助 & 百度 & 谷歌,均没有找到,请帮忙,谢谢~

这个是我遇到问题的帖子:
http://blog.sina.com.cn/s/blog_4af6d8a60100elgg.html
发表于 2009-8-19 03:07:31 | 显示全部楼层
本帖最后由 iftodo 于 2009-8-19 03:55 编辑

嗯,这个问题在按键精灵论坛里也是个比较热门的话题.

一般的思路呢,先找第一遍,得到当第一个指定颜色的坐标.  再用此坐标和原区域右下角X,Y构成一个新的区域.  在这个新的区域里找第二个指定颜色的坐标..   依次类推,直到遍历完整个区域...  

还有一种就是把整个区域的颜色值保存到一个数组里,然后跟目标颜色依次对比.   

下面我写了一段.   可以返回找到的数量,找到的每个点的坐标
HotKeySet("{F9}", "test")
While True
        Sleep(10)
WEnd

Func test()
        Local $Result
        $Result = FindAllColor(517, 241, 548, 254, "16777215")
        If $Result[0][0] <> 0 Then
                For $i = 1 To $Result[0][0] Step +1
                        MouseMove($Result[$i][0], $Result[$i][1], 0)
                        Sleep(10)
                Next
        Else
                ConsoleWrite("在指定区域未找到目标颜色. " & @CR)
        EndIf
EndFunc   ;==>test

Func FindAllColor($iLeft, $iTop, $iRight, $iBottom, $iColor)
        Local $Rnum[1][1], $s = 0
        For $Top = $iTop To $iBottom Step +1
                For $Left = $iLeft To $iRight Step +1
                        $Color = PixelGetColor($Left, $Top)
                        ConsoleWrite($Color & @CR)
                        If $Color = $iColor Then
                                $s += 1
                                ReDim $Rnum[$s + 1][2]
                                $Rnum[$s][0] = $Left
                                $Rnum[$s][1] = $Top
                        EndIf
                Next
        Next
        $Rnum[0][0] = $s
        Return $Rnum
EndFunc   ;==>FindAllColor

评分

参与人数 1金钱 +5 收起 理由
solox + 5 感谢

查看全部评分

 楼主| 发表于 2009-8-19 22:04:33 | 显示全部楼层
本帖最后由 solox 于 2009-8-19 22:09 编辑

感谢楼上的方法分享

另外

一般的思路呢,先找第一遍,得到当第一个指定颜色的坐标.  再用此坐标和原区域右下角X,Y构成一个新的区域.  在这个新的区域里找第二个指定颜色的坐标..   依次类推,直到遍历完整个区域...


这个方法似乎不行哦,不知道是不是我理解错误

帮助里说,PixelSearch 的搜索动作将从左到右,从上到下执行

下面是我做实验的原图、分析图和源程序,3个点,只找到2个点
原图:


分析图:
opt ("PixelCoordMode", 0)
WinActivate("01.jpg")
WinWaitActive("01.jpg")
HotKeySet("{F9}", "_PixelSearchTest")
While 1
        Sleep(10)
WEnd

Func _PixelSearchTest()
        Local $coord[2] = [0, 0]
        While 1
                $coord = PixelSearch($coord[0], $coord[1], 400, 320, 0xf39990, 2)
                If Not @error Then
                        MsgBox(0, "PixelSearch函数检测", "找到一个匹配坐标: " & $coord[0] & ", " & $coord[1])
                        $coord[1] = $coord[1] + 1
                Else
                        MsgBox(0, "PixelSearch函数检测", "未找到匹配坐标")
                        Exit
                EndIf
        WEnd
EndFunc

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2009-8-19 22:22:47 | 显示全部楼层
随贴再问一个问题,刚才做上面这个实验的时候发现的

Windows XP 打开图片用的工具是 "Windows Picture and Fax Viewer",它打开图片并不是刚好显示图片大小的,虽然图片在这个工具窗口里是居中显示的,但是两边都留有很多空白,而且这个空白的大小随着调整窗口大小而不同,所以即使我设定了参数opt ("PixelCoordMode", 0),但只要调整了窗口大小,得到的坐标点也就不同了。

有没有什么方法解决?
发表于 2009-8-20 02:06:16 | 显示全部楼层
嗯?   不行么.   我上面帖的那种方法已经是遍历了.  也就是说指定区域的每个像素点都对比一次.

找不到的原因无非有两个,一是指定的区域不正确,再就是目标颜色值.   PixelGetColor 函数返回的是十进制的颜色值.
 楼主| 发表于 2009-8-20 21:27:45 | 显示全部楼层
嗯?   不行么.   我上面帖的那种方法已经是遍历了.  也就是说指定区域的每个像素点都对比一次.

找不到的原因无非有两个,一是指定的区域不正确,再就是目标颜色值.   PixelGetColor 函数返回的是十进制的颜色值.
iftodo 发表于 2009-8-20 02:06


你上面说的查找同颜色个数的方法是行的,我说的是下面这个
一般的思路呢,先找第一遍,得到当第一个指定颜色的坐标.  再用此坐标和原区域右下角X,Y构成一个新的区域.  在这个新的区域里找第二个指定颜色的坐标..   依次类推,直到遍历完整个区域...  

按这个思路我做出来不行
 楼主| 发表于 2009-8-21 19:59:13 | 显示全部楼层
本帖最后由 solox 于 2009-8-21 20:15 编辑

帖子掉得真快,两天过去了,自己努力无果,继续求1楼和4楼的解决方法
 楼主| 发表于 2009-8-24 21:11:59 | 显示全部楼层
我现在是用一个笨方法,用 PixelSearch 函数找到一个点后,又再次调用 PixelSearch 函数只扫描一行,把当前那一行都扫描完,直到当前行扫完后再y=$coord[1]+1扫描新区域。。。。
还有没有其他方法呢?
 楼主| 发表于 2009-8-26 02:22:08 | 显示全部楼层
又被恶意灌水的推到后面几页去了。。。。
发表于 2009-9-1 03:58:05 | 显示全部楼层
我觉得一行一行找也不错  用au3了 就不在乎效率了........囧

至少这样少死脑细胞啊
发表于 2009-12-25 16:05:05 | 显示全部楼层
嗯,这个问题在按键精灵论坛里也是个比较热门的话题.

一般的思路呢,先找第一遍,得到当第一个指定颜色的坐 ...
iftodo 发表于 2009-8-19 03:07


你的办法是行不通的,因为如果获取的像素点移动了呢?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-22 15:36 , Processed in 0.083015 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表