关于区域内有多个相同颜色的搜索问题
在一个区域内,有多个相同的颜色,我暂时知道的函数是 PixelSearch 函数,但是它只返回区域内第一个匹配的像素的坐标,而我想知道的是整个区域的所有那个颜色的坐标,请问该用什么函数呢?帮助 & 百度 & 谷歌,均没有找到,请帮忙,谢谢~
这个是我遇到问题的帖子:
http://blog.sina.com.cn/s/blog_4af6d8a60100elgg.html 本帖最后由 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: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
随贴再问一个问题,刚才做上面这个实验的时候发现的
Windows XP 打开图片用的工具是 "Windows Picture and Fax Viewer",它打开图片并不是刚好显示图片大小的,虽然图片在这个工具窗口里是居中显示的,但是两边都留有很多空白,而且这个空白的大小随着调整窗口大小而不同,所以即使我设定了参数opt ("PixelCoordMode", 0),但只要调整了窗口大小,得到的坐标点也就不同了。
有没有什么方法解决? 嗯? 不行么. 我上面帖的那种方法已经是遍历了.也就是说指定区域的每个像素点都对比一次.
找不到的原因无非有两个,一是指定的区域不正确,再就是目标颜色值. PixelGetColor 函数返回的是十进制的颜色值. 嗯? 不行么. 我上面帖的那种方法已经是遍历了.也就是说指定区域的每个像素点都对比一次.
找不到的原因无非有两个,一是指定的区域不正确,再就是目标颜色值. PixelGetColor 函数返回的是十进制的颜色值.
iftodo 发表于 2009-8-20 02:06 http://www.autoitx.com/images/common/back.gif
你上面说的查找同颜色个数的方法是行的,我说的是下面这个
一般的思路呢,先找第一遍,得到当第一个指定颜色的坐标.再用此坐标和原区域右下角X,Y构成一个新的区域.在这个新的区域里找第二个指定颜色的坐标.. 依次类推,直到遍历完整个区域...
按这个思路我做出来不行 本帖最后由 solox 于 2009-8-21 20:15 编辑
帖子掉得真快,两天过去了,自己努力无果,继续求1楼和4楼的解决方法 我现在是用一个笨方法,用 PixelSearch 函数找到一个点后,又再次调用 PixelSearch 函数只扫描一行,把当前那一行都扫描完,直到当前行扫完后再y=$coord+1扫描新区域。。。。
还有没有其他方法呢? 又被恶意灌水的推到后面几页去了。。。。 我觉得一行一行找也不错用au3了 就不在乎效率了........囧
至少这样少死脑细胞啊 嗯,这个问题在按键精灵论坛里也是个比较热门的话题.
一般的思路呢,先找第一遍,得到当第一个指定颜色的坐 ...
iftodo 发表于 2009-8-19 03:07 http://www.autoitx.com/images/common/back.gif
你的办法是行不通的,因为如果获取的像素点移动了呢?
页:
[1]