ifcolors() 屏幕坐标点颜色判断函数

许多实用脚本和封装函数, 可以让您编写脚本更加便捷高效

Moderators: tmplinshi, arcticir

Ghost_jack_00
Posts: 4
Joined: 28 Jun 2023, 01:01

ifcolors() 屏幕坐标点颜色判断函数

15 Nov 2023, 22:31

ifcolors()
这个是我自己用的 屏幕坐标点颜色判断函数
他是用 v1 版的 可变参数函数 实现的。
中间包涵 PixelGetColor PixelSearch 的多点,多范围,多颜色的各种逻辑的判断。

函数注释中,举例了各种用法。

也不知道论坛中有没有人发过,欢迎大佬们指点~

Code: Select all


IfColors(Params*) {
/*------------------------------------------------	
判断颜色 1.1
作者: Ghost_jack_00
返回值: 0-false  1-true 

		示例用法  1.0版本
		
		1、ifColors("100,200,0xFFFFFF")
		 => PixelGetColor, pc, 100,200,RGB
		 => InStr(0xFFFFFF,pc)
			单点判断单颜色真假
			
		2、ifColors("100,200,0xFFFFFF|0x00000")
			=> PixelGetColor, pc, 100,200,RGB
			=> InStr(0xFFFFFF|0x00000,pc)
			单点判断多颜色真假,颜色分隔符不能是逗号
			
		3、ifColors("100,200,0xFFFFFF","300,400,0x000000")
			多点判断多颜色同时成立的真假,多点用引号分开
			
		4、ifColors("100,200,0xFFFFFF,or","300,400,0x000000")
			多点判断多颜色任一成立的真假,  第4参数为or ||,默认不设置为 and
		
		5、ifColors("100,200,0xFFFFFF|0x000000,||","300,400,0x000000","500,600,0x888888")
			a => ifColors("100,200,0xFFFFFF|0x000000")
			b => ifColors("300,400,0x000000")
			c => ifColors("500,600,0x888888")
		复杂逻辑的组合:解释从左往右,  (a or b)and c
		
		
		示例用法  1.1版本
		兼容1.0,区分为 坐标数字,是否存在 ~|-_ 分隔符
		
		1、ifColors("100~200,300,0xFFFFFF")
			=>   PixelSearch,X, Y, 100, 300, 200, 300, 0xFFFFFF, 0 , Fast RGB
			范围判断单颜色真假
			
		2、ifColors("100,300~200,0xFFFFFF|0x000000")
			a=>  PixelSearch,X, Y, 100, 300, 100, 200, 0xFFFFFF, 0 , Fast RGB
			b=>  PixelSearch,X, Y, 100, 300, 100, 200, 0x000000, 0 , Fast RGB
			  a or b
			判断范围,是否存在多颜色中的任意一个颜色 ,颜色分隔符不能是逗号
			
		3、ifColors("100~200,300~400,0xFFFFFF","300,400,0x000000")
			a=> PixelSearch,X, Y, 100, 300, 200, 400, 0xFFFFFF, 0 , Fast RGB
			b=> ifColors("300,400,0x000000")
				a and b
			范围判断+ 单点判断,同时成立
			
		4、ifColors("100~200,300~400,0xFFFFFF,or","300,400,0x000000")
			a=> PixelSearch,X, Y, 100, 300, 200, 400, 0xFFFFFF, 0 , Fast RGB
			b=> ifColors("300,400,0x000000")
				a or b
			范围判断 + 单点判断,任一成立    (第4参数为or ||,默认不设置为 and)
		
		5、ifColors("100~200,200,0xFFFFFF|0x000000,||","300,400,0x000000","500~600,700,0x888888")
		
			a=> PixelSearch,X, Y, 100, 200, 100, 300, 0xFFFFFF, 0 , Fast RGB
					PixelSearch,X, Y, 100, 200, 100, 300, 0x000000, 0 , Fast RGB
			b=> ifColors("300,400,0x000000")
			c=> PixelSearch,X, Y, 500, 700, 600, 700, 0xFFFFFF, 0 , Fast RGB

		复杂逻辑的组合:解释从左往右,  (a or b)and c
*/ ;--------------------------------------------

	for index,param in params	
	{
		xyc:= StrSplit(StrReplace(param, A_Space),","),x:=xyc[1],y:=xyc[2],cs:=xyc[3]
		a_o:=InStr("or||",xyc[4]=""?"&":xyc[4])
		if RegExMatch(x . y , "([-~|&_]+)", R)
		{
			x_c := StrSplit(x,R),x1:=x_c[1],x2:=x_c[2]=""?x1:x_c[2]
			y_c := StrSplit(y,R),y1:=y_c[1],y2:=y_c[2]=""?y1:y_c[2]
			Loop, Parse, cs, -~|&_
			{
				PixelSearch,OutX, OutY, %x1%, %y1%, %x2%, %y2%,%A_LoopField%, 0 , Fast RGB	
				IF t_f:=!ErrorLevel
					break
			}
		} else {
			PixelGetColor, pc, x,y,RGB
			t_f:= InStr(cs,pc)
		}	
			if !t_f and !a_o
				return false
			if t_f and a_o
				return true
	}
return	t_f?true:false	
}

Ghost_jack_00
Posts: 4
Joined: 28 Jun 2023, 01:01

Re: ifcolors() 屏幕坐标点颜色判断函数

16 Nov 2023, 07:00

考虑到坐标缺省值,可以更方便使用,改了这个 1.2 版本

Code: Select all

IfColors(Params*) {
/*--------------------------------------------------------------	
判断颜色 1.2
(功能灵活,可多点,可单点,可多色,可单色)
作者: Ghost_jack
返回值: 0-false  1-true 

示例用法  1.0版本 (PixelGetColor 第四参数 多点)

		
		1、ifColors("100,200,0xFFFFFF")
		 => PixelGetColor, pc, 100,200,RGB
		 => InStr(0xFFFFFF,pc)
			单点判断单颜色真假
			
		2、ifColors("100,200,0xFFFFFF|0x00000")
			=> PixelGetColor, pc, 100,200,RGB
			=> InStr(0xFFFFFF|0x00000,pc)
			单点判断多颜色真假,颜色分隔符不能是逗号
			
		3、ifColors("100,200,0xFFFFFF","300,400,0x000000")
			多点判断多颜色同时成立的真假,多点用引号分开
			
		4、ifColors("100,200,0xFFFFFF,or","300,400,0x000000")
			多点判断多颜色任一成立的真假,  第4参数为or ||,默认不设置为 and
		
		5、ifColors("100,200,0xFFFFFF|0x000000,||","300,400,0x000000","500,600,0x888888")
			a => ifColors("100,200,0xFFFFFF|0x000000")
			b => ifColors("300,400,0x000000")
			c => ifColors("500,600,0x888888")
		复杂逻辑的组合:解释从左往右,  (a or b)and c
		
/*------------------------------------------------------------	
示例用法  1.1版本 (PixelSearch 多色)
		兼容1.0,区分为 坐标数字,区分为是否存在 ~|-_ 分隔符
		
		1、ifColors("100~200,300,0xFFFFFF")
			=>   PixelSearch,X, Y, 100, 300, 200, 300, 0xFFFFFF, 0 , Fast RGB
			范围判断单颜色真假
			
		2、ifColors("100,300~200,0xFFFFFF|0x000000")
			a=>  PixelSearch,X, Y, 100, 300, 100, 200, 0xFFFFFF, 0 , Fast RGB
			b=>  PixelSearch,X, Y, 100, 300, 100, 200, 0x000000, 0 , Fast RGB
			  a or b
			判断范围,是否存在多颜色中的任意一个颜色 ,颜色分隔符不能是逗号
			
		3、ifColors("100~200,300~400,0xFFFFFF","300,400,0x000000")
			a=> PixelSearch,X, Y, 100, 300, 200, 400, 0xFFFFFF, 0 , Fast RGB
			b=> ifColors("300,400,0x000000")
				a and b
			范围判断+ 单点判断,同时成立
			
		4、ifColors("100~200,300~400,0xFFFFFF,or","300,400,0x000000")
			a=> PixelSearch,X, Y, 100, 300, 200, 400, 0xFFFFFF, 0 , Fast RGB
			b=> ifColors("300,400,0x000000")
				a or b
			范围判断 + 单点判断,任一成立    (第4参数为or ||,默认不设置为 and)
		
		5、ifColors("100~200,200,0xFFFFFF|0x000000,||","300,400,0x000000","500~600,700,0x888888")
		
			a=> PixelSearch,X, Y, 100, 200, 100, 300, 0xFFFFFF, 0 , Fast RGB
					PixelSearch,X, Y, 100, 200, 100, 300, 0x000000, 0 , Fast RGB
			b=> ifColors("300,400,0x000000")
			c=> PixelSearch,X, Y, 500, 700, 600, 700, 0xFFFFFF, 0 , Fast RGB

		复杂的组合:解释从左往右,  (a or b)and c

/*--------------------------------------------------------------
示例用法  1.2版本 (坐标缺省值设置,可反转)

		兼容1.0,1.1, 区分为 坐标数字缺省值表达方式 分隔符  ~_&<>.|
		没有分隔符   =  全屏幕坐标
		有分隔符,缺省数值 = 自动屏幕坐标值   > 分隔符表示反转
		
		1、缺省值
		=>  ifcolors(100~,~300,0xFFFFFF)
		=>  PixelSearch,X, Y, 100,A_ScreenHeight, A_ScreenWidth,300 , 0xFFFFFF, 0 , Fast RGB
		
		2、缺省值表达 全屏搜索,下列表达是一个效果

		=>  ifcolors(,,0xFFFFFF)
		=>  ifcolors( , ,0xFFFFFF)
		=>  ifcolors(~, ,0xFFFFFF)
		=>  ifcolors(~,|,0xFFFFFF)
		=>  ifcolors(0~,0<,0xFFFFFF)
		=>  PixelSearch,X, Y, 0, 0, A_ScreenWidth, A_ScreenHeight, 0xFFFFFF, 0 , Fast RGB
		
		3、缺省坐标表达式   反转分隔符  >
		=>  ifcolors(>, ,0xFFFFFF)
		=>  PixelSearch,X, Y, A_ScreenWidth, 0,  0, A_ScreenHeight, 0xFFFFFF, 0 , Fast RGB
		
		
		
*/ ;--------------------------------------------

	for index,param in params	
	{
		xyc:= StrSplit(StrReplace(param, A_Space),","),x:=xyc[1],y:=xyc[2],cs:=xyc[3]
		a_o:=InStr("or||",xyc[4]=""?"&":xyc[4])
		
		x_r:=RegExMatch(x, "([~_&<>\.\|])", xr)
    y_r:=RegExMatch(y, "([~&_<>\.\|])", yr)
		if  % (x_r+y_r) or !StrLen(x . y)
		{
		x_c:= StrSplit(x,xr)
     x1:=StrLen(x)?x_r?x_c[1]=""?!InStr(x,">")?0:A_ScreenWidth:x_c[1]:x:0
     x2:=StrLen(x)?x_r?x_c[2]=""?!InStr(x,">")?A_ScreenWidth:0:x_c[2]:x:A_ScreenWidth
 
		y_c:= StrSplit(y,yr)
     y1:=StrLen(y)?y_r?y_c[1]=""?!InStr(y,">")?0:A_ScreenHeight:y_c[1]:y:0
     y2:=StrLen(y)?y_r?y_c[2]=""?!InStr(y,">")?A_ScreenHeight:0:y_c[2]:y:A_ScreenHeight
	
	  	Loop, Parse, cs, -~|&_.
			{
				PixelSearch,OutX, OutY, %x1%, %y1%, %x2%, %y2%,%A_LoopField%, 0 , Fast RGB	
				IF t_f:=!ErrorLevel
					break
			}
		} else {
			PixelGetColor, pc, x,y,RGB
			t_f:= InStr(cs,pc)
		}	
			if !t_f and !a_o
				return false
			if t_f and a_o
				return true
	}
return	t_f?true:false	
}



Ghost_jack_00
Posts: 4
Joined: 28 Jun 2023, 01:01

Re: ifcolors() 屏幕坐标点颜色判断函数

25 Mar 2024, 01:18

改了个v2 版本的

Code: Select all

#Requires AutoHotkey >=2.0

/*--------------------------------------------------------------	
判断颜色 1.2
作者: Ghost_jack
(功能灵活,可多点,可单点,可多色,可单色)
返回值: 0-false  1-true 
示例用法  1.0版本 (PixelGetColor 第四参数 多点)


		
		1、IfColors(&X, &Y ,"100,200,0xFFFFFF")
		 => PixelGetColor, pc, 100,200,RGB
		 => InStr(0xFFFFFF,pc)
			
			单点判断单颜色真假
		2、IfColors(&X, &Y ,"100,200,0xFFFFFF|0x00000")
			=> PixelGetColor, pc, 100,200,RGB
			=> InStr(0xFFFFFF|0x00000,pc)
			单点判断多颜色真假,颜色分隔符不能是逗号
			
		3、IfColors(&X, &Y ,"100,200,0xFFFFFF","300,400,0x000000")
			多点判断多颜色同时成立的真假,多点用引号分开
			
		4、IfColors(&X, &Y ,"100,200,0xFFFFFF,or","300,400,0x000000")
			多点判断多颜色任一成立的真假,  第4参数为or ||,默认不设置为 and
		
		5、IfColors(&X, &Y ,"100,200,0xFFFFFF|0x000000,||","300,400,0x000000","500,600,0x888888")
			a => IfColors(&X, &Y ,"100,200,0xFFFFFF|0x000000")
			b => IfColors(&X, &Y ,"300,400,0x000000")
			c => IfColors(&X, &Y ,"500,600,0x888888")
		复杂逻辑的组合:解释从左往右,  (a or b)and c
		
/*------------------------------------------------------------	
示例用法  1.1版本 (PixelSearch 多色)
		兼容1.0,区分为 坐标数字,区分为是否存在 ~|-_ 分隔符
		
		1、IfColors(&X, &Y ,"100~200,300,0xFFFFFF")
			=>   PixelSearch,X, Y, 100, 300, 200, 300, 0xFFFFFF, 0 , Fast RGB
			范围判断单颜色真假
			
		2、IfColors(&X, &Y ,"100,300~200,0xFFFFFF|0x000000")
			a=>  PixelSearch,X, Y, 100, 300, 100, 200, 0xFFFFFF, 0 , Fast RGB
			b=>  PixelSearch,X, Y, 100, 300, 100, 200, 0x000000, 0 , Fast RGB
			  a or b
			判断范围,是否存在多颜色中的任意一个颜色 ,颜色分隔符不能是逗号
			
		3、IfColors(&X, &Y ,"100~200,300~400,0xFFFFFF","300,400,0x000000")
			a=> PixelSearch,X, Y, 100, 300, 200, 400, 0xFFFFFF, 0 , Fast RGB
			b=> IfColors(&X, &Y ,"300,400,0x000000")
				a and b
			范围判断+ 单点判断,同时成立
			
		4、IfColors(&X, &Y ,"100~200,300~400,0xFFFFFF,or","300,400,0x000000")
			a=> PixelSearch,X, Y, 100, 300, 200, 400, 0xFFFFFF, 0 , Fast RGB
			b=> IfColors(&X, &Y ,"300,400,0x000000")
				a or b
			范围判断 + 单点判断,任一成立    (第4参数为or ||,默认不设置为 and)
		
		5、IfColors(&X, &Y ,"100~200,200,0xFFFFFF|0x000000,||","300,400,0x000000","500~600,700,0x888888")
		
			a=> PixelSearch,X, Y, 100, 200, 100, 300, 0xFFFFFF, 0 , Fast RGB
					PixelSearch,X, Y, 100, 200, 100, 300, 0x000000, 0 , Fast RGB
			b=> IfColors(&X, &Y ,"300,400,0x000000")
			c=> PixelSearch,X, Y, 500, 700, 600, 700, 0xFFFFFF, 0 , Fast RGB

		复杂的组合:解释从左往右,  (a or b)and c

/*--------------------------------------------------------------
示例用法  1.3版本 (坐标缺省值设置,可反转)

		兼容1.0,1.1, 区分为 坐标数字缺省值表达方式 分隔符  ~_&<>.|
		没有分隔符   =  全屏幕坐标
		有分隔符,缺省数值 = 自动屏幕坐标值   > 分隔符表示反转
		
		1、缺省值
		=>  ifcolors(100~,~300,0xFFFFFF)
		=>  PixelSearch,X, Y, 100,A_ScreenHeight, A_ScreenWidth,300 , 0xFFFFFF, 0 , Fast RGB
		
		2、缺省值表达 全屏搜索,下列表达是一个效果

		=>  ifcolors(,,0xFFFFFF)
		=>  ifcolors( , ,0xFFFFFF)
		=>  ifcolors(~, ,0xFFFFFF)
		=>  ifcolors(~,|,0xFFFFFF)
		=>  ifcolors(0~,0<,0xFFFFFF)
		=>  PixelSearch,X, Y, 0, 0, A_ScreenWidth, A_ScreenHeight, 0xFFFFFF, 0 , Fast RGB
		
		3、缺省坐标表达式   反转分隔符  >
		=>  ifcolors(>, ,0xFFFFFF)
		=>  PixelSearch,X, Y, A_ScreenWidth, 0,  0, A_ScreenHeight, 0xFFFFFF, 0 , Fast RGB
		
		
		
*/ ;--------------------------------------------

IfColors(&X, &Y , Params*) {
	for index,param in params	
	{
		xyc:= StrSplit(StrReplace(param, A_Space),","),x:=xyc[1],y:=xyc[2],cs:=xyc[3]
		a_o:=InStr("or||",xyc.Length=4?xyc[4]:"&")=0?false:true
		if (RegExMatch(x . y, "([~_&<>\.\|])") or !StrLen(x) or !StrLen(y)) 
		{
			x1:=RegExMatch(x, "(^\d+)", &xr)?xr[1]:RegExMatch(x, ">")?A_ScreenWidth:0
			x2:=RegExMatch(x, "(\d+$)", &xr)?xr[1]:RegExMatch(x, ">")?0:A_ScreenWidth
			y1:=RegExMatch(y, "(^\d+)", &yr)?yr[1]:RegExMatch(y, ">")?A_ScreenHeight:0
			y2:=RegExMatch(y, "(\d+$)", &yr)?yr[1]:RegExMatch(y, ">")?0:A_ScreenHeight
			Loop Parse, cs, "-~|&_."
				{
				IF t_f:=PixelSearch(&X, &Y, x1, y1, x2, y2,A_LoopField)
					break
				}
		}	else 
			t_f:=InStr(cs,PixelGetColor(x,y))=0?false:true
		if !t_f and !a_o
			return false
		if t_f and a_o
			return true
	}
	return t_f
}


Return to “脚本函数”

Who is online

Users browsing this forum: No registered users and 102 guests