solox 发表于 2009-8-19 02:37:15

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

在一个区域内,有多个相同的颜色,我暂时知道的函数是 PixelSearch 函数,但是它只返回区域内第一个匹配的像素的坐标,而我想知道的是整个区域的所有那个颜色的坐标,请问该用什么函数呢?
帮助 & 百度 & 谷歌,均没有找到,请帮忙,谢谢~

这个是我遇到问题的帖子:
http://blog.sina.com.cn/s/blog_4af6d8a60100elgg.html

iftodo 发表于 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 Then
                For $i = 1 To $Result Step +1
                        MouseMove($Result[$i], $Result[$i], 0)
                        Sleep(10)
                Next
        Else
                ConsoleWrite("在指定区域未找到目标颜色. " & @CR)
        EndIf
EndFunc   ;==>test

Func FindAllColor($iLeft, $iTop, $iRight, $iBottom, $iColor)
        Local $Rnum, $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]
                                $Rnum[$s] = $Left
                                $Rnum[$s] = $Top
                        EndIf
                Next
        Next
        $Rnum = $s
        Return $Rnum
EndFunc   ;==>FindAllColor

solox 发表于 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 =
        While 1
                $coord = PixelSearch($coord, $coord, 400, 320, 0xf39990, 2)
                If Not @error Then
                        MsgBox(0, "PixelSearch函数检测", "找到一个匹配坐标: " & $coord & ", " & $coord)
                        $coord = $coord + 1
                Else
                        MsgBox(0, "PixelSearch函数检测", "未找到匹配坐标")
                        Exit
                EndIf
        WEnd
EndFunc

solox 发表于 2009-8-19 22:22:47

随贴再问一个问题,刚才做上面这个实验的时候发现的

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

有没有什么方法解决?

iftodo 发表于 2009-8-20 02:06:16

嗯?   不行么.   我上面帖的那种方法已经是遍历了.也就是说指定区域的每个像素点都对比一次.

找不到的原因无非有两个,一是指定的区域不正确,再就是目标颜色值.   PixelGetColor 函数返回的是十进制的颜色值.

solox 发表于 2009-8-20 21:27:45

嗯?   不行么.   我上面帖的那种方法已经是遍历了.也就是说指定区域的每个像素点都对比一次.

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

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

solox 发表于 2009-8-21 19:59:13

本帖最后由 solox 于 2009-8-21 20:15 编辑

帖子掉得真快,两天过去了,自己努力无果,继续求1楼和4楼的解决方法

solox 发表于 2009-8-24 21:11:59

我现在是用一个笨方法,用 PixelSearch 函数找到一个点后,又再次调用 PixelSearch 函数只扫描一行,把当前那一行都扫描完,直到当前行扫完后再y=$coord+1扫描新区域。。。。
还有没有其他方法呢?

solox 发表于 2009-8-26 02:22:08

又被恶意灌水的推到后面几页去了。。。。

sxd 发表于 2009-9-1 03:58:05

我觉得一行一行找也不错用au3了 就不在乎效率了........囧

至少这样少死脑细胞啊

316428696 发表于 2009-12-25 16:05:05

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

一般的思路呢,先找第一遍,得到当第一个指定颜色的坐 ...
iftodo 发表于 2009-8-19 03:07 http://www.autoitx.com/images/common/back.gif

你的办法是行不通的,因为如果获取的像素点移动了呢?
页: [1]
查看完整版本: 关于区域内有多个相同颜色的搜索问题