简介
PixelGetColor 通常用于在特定像素处获取单一颜色值,这对于大多数应用程序来说是足够的。然而,一些带有反作弊机制的软件,例如《英雄联盟》的外服版本,会对图像进行模糊处理(Fuzz处理)。在这种情况下,我们需要采用一种能够识别颜色相似性的取色方法,以确保逻辑的正确执行。
绝对取色
先给出绝对取色的代码:
;取色组
GetColor(x,y)
{
PixelGetColor, color, x, y, RGB
StringRight color,color,10 ;
return color
}
;绝对取色
F9::
MouseGetPos, mouseX, mouseY
PixelGetColor, color, %mouseX%, %mouseY%, RGB
StringRight color,color,10
;tooltip, %mouseX%,%mouseY%颜色是:%color%
tooltip, %mouseX%,%mouseY%颜色是:%color%, 0, 0
Clipboard=GetColor(%mouseX%,%mouseY%)=="%color%"
return
这段AutoHotkey脚本定义了一个名为`GetColor`的函数,用于从屏幕上任意位置获取颜色值,并返回去掉前缀的十六进制颜色代码。同时,它还设置了一个F9热键,当按下时,脚本会获取鼠标当前位置的颜色值,显示一个提示框展示这个颜色值,并尝试将这个值复制到剪贴板。
相似取色
相似取色需要在绝对取色的基础上进行修改,添加对RGB通道中颜色的对比。其中的 diff 逻辑可以自行修改,可以是对比偏差的总和,也可以是比较每个RGB通道中颜色的偏差阈值,如以下代码:
;RGB通道相似函数
IsColorSeems(x, y, color)
{
; 定义两个颜色的RGB值
color1 := GetColor(x,y) ; 第一个颜色的十六进制表示
color2 := color ; 第二个颜色的十六进制表示
; 将十六进制颜色值转换为十进制RGB值
Red1 := ((color1 >> 16) & 0xFF)
Green1 := ((color1 >> 8) & 0xFF)
Blue1 := (color1 & 0xFF)
Red2 := ((color2 >> 16) & 0xFF)
Green2 := ((color2 >> 8) & 0xFF)
Blue2 := (color2 & 0xFF)
; 计算两个颜色在RGB通道上的差异,并使用Abs函数取绝对值
deltaRed := Abs(Red1 - Red2)
deltaGreen := Abs(Green1 - Green2)
deltaBlue := Abs(Blue1 - Blue2)
; 定义颜色差异的阈值
threshold := 5 ; 这个值可以根据需要调整
; 判断两个颜色是否接近
if (deltaRed <= threshold && deltaGreen <= threshold && deltaBlue <= threshold) {
return true
} else {
return false
}
}
;取色组
GetColor(x,y)
{
PixelGetColor, color, x, y, RGB
StringRight color,color,10 ;
return color
}
;绝对取色
F9::
MouseGetPos, mouseX, mouseY
PixelGetColor, color, %mouseX%, %mouseY%, RGB
StringRight color,color,10
;tooltip, %mouseX%,%mouseY%颜色是:%color%
tooltip, %mouseX%,%mouseY%颜色是:%color%, 0, 0
Clipboard=GetColor(%mouseX%,%mouseY%)=="%color%"
return
;相似取色
F11::
MouseGetPos, mouseX, mouseY
PixelGetColor, color, %mouseX%, %mouseY%, RGB
StringRight color,color,10
;IsColorSeems()
tooltip, %mouseX%,%mouseY%颜色seems:%color%, 0, 0
Clipboard=IsColorSeems(%mouseX%,%mouseY%, "%color%")
return
上述AutoHotkey脚本定义了一个名为 IsColorSeems 的函数,它通过比较两个颜色在RGB通道上的差异来判断它们是否足够相似。如果两个颜色的RGB值在每个通道上的差异都小于预设的阈值,则认为这两个颜色是相似的,并返回真(true);否则返回假(false)。这个函数可以用来识别在视觉上相近的颜色,即使反作弊机制中颜色值有所变化。