AutoHotkey's PixelSearch
允许人们在(X1,Y1)..(X2,Y2)矩形中搜索某种颜色的像素。
但我想找到任何不是某种颜色的像素,即给定背景颜色,我想检测何时出现任何其他颜色前景。
有没有办法使用内置的PixelSearch
或其他内置函数执行此操作?
答案 0 :(得分:1)
如果您可以控制背景颜色,也许可以使用PixelSearch的{{1}}参数。
如果您的背景颜色为黑色,请搜索带有变体254的白色像素.PixelSearch应返回任何不是黑色的像素。
此代码搜索BLACK以外的任何像素(未经测试)
variation
如果您的背景为中间调灰色(0x7F7F7F),请尝试使用变体127搜索黑色和白色。再次,我还没有对此进行测试。也许变化应该是126或63.您可能不得不进行一些试验和错误,因为变量参数的行为没有全面记录。
答案 1 :(得分:0)
您可以使用PixelGetColor查看单个像素。该指令告诉您位置x,y处的像素颜色。 If命令确定像素是否为0x9D6346。
在循环中使用PixelGetColor允许您通过递增x,y或两者来一次测试一个像素范围。
是的,正确的顺序是BGR而不是RGB。看一下帮助文件证实了这一点。 :)
正在发生改变颜色的事情。也许你可以寻找另一种方法来检测屏幕上的变化。由于另一个窗口或消息变为活动而导致的颜色变化?如果是这样,您可以使用许多命令来确定屏幕上显示的内容。
Windows间谍擅长确定弹出消息的名称。即使它们与现有窗口具有相同的名称,您也可以确定哪个是包含或排除的文本。
更改特定窗口的位置可能足以检测您要查找的更改。
或许更多细节描述您要检测的内容会有所帮助。它至少会证实我们在同一个球场。
答案 2 :(得分:0)
我想不出只有内置功能才能解决这个问题的可靠方法。但是,您可以在外部GDI+
库的帮助下自行编写。
backgroundColor = 0x644E37
pToken := GDIP_StartUp()
pBitMap := GDIP_BitmapFromScreen()
while(a_index <= a_screenWidth) {
w := a_index
while(a_index <= a_screenHeight) {
h := a_index
ARGB := GDIP_GetPixel(pbitmap, w, h)
RGB := ARGBtoRGB(ARGB)
if(RGB != backgroundColor) {
msgbox, % "found pixel at " w ", " h
}
}
GDIP_DisposeImage(pBitMap)
GDIP_Shutdown(pToken)
return
ARGBtoRGB( ARGB ) {
VarSetCapacity( RGB,6,0 )
DllCall( "msvcrt.dll\sprintf", Str,RGB, Str,"%06X", UInt,ARGB<<8 )
Return "0x" RGB
}
<强>未测试强>
据称,gdip_bitmapFromScreen()
实际上 比pixelSearch
快。
答案 3 :(得分:0)
此像素搜索对我有用,可以找到除白色以外的任何颜色:
Search for black (0x000000),
if pixel not found
search for red (0xFF0000),
if pixel not found
search for lime (0x00FF00),
if pixel not found
search for blue (0x0000FF),
if pixel not found, the only color is pure white.
我将所有这些变量设置为254。变量255可以找到所有内容,包括白色。我使用石灰而不是绿色,因为称为绿色的正式颜色的绿色值为128,而石灰的绿色值为255(红色0,绿色255,蓝色0)。似乎仅搜索黑色通常不会发现白色,但有时您需要按照清单中的方法进行操作。这会告诉我除白色以外是否存在任何其他颜色的变化,包括非常接近白色以至于我看不到的颜色(在白色背景上)。
您可能需要对其他颜色进行一些数学和/或实验,但我不明白为什么这种方法不起作用。我使用了快速RGB模式和窗口坐标。我也在这里找到了有用的信息: https://en.wikipedia.org/wiki/Web_colors
答案 4 :(得分:-1)
作为一个相对新手我讨厌这样做。 :)
直接来自帮助文件中的PixelSearch。
PixelSearch,Px,Py,200,200,300,300,0x9d6346,3,快速
如果ErrorLevel
MsgBox, That color was not found in the specified region.
否则
MsgBox, A color within 3 shades of variation was found at X%Px% Y%Py%.
了解十六进制以及数字如何应用于颜色是必要的。
颜色表示为十六进制数。在这种情况下,9d6346分为三个部分。我好像记得9d是红色的值,63是绿色,46是蓝色。这三个数字的范围可以是Hex 00到Hex FF(十进制0到255)。
变化表示为十进制数是搜索颜色中允许范围的数量
9D范围为9b至9f。 63 = 61到66,46 = 44到69.根据搜索号码是否被接受,我的范围可以是1。
如果所有其他方法都无法使用Google十六进制
与PixelGetColor类似的可能性后跟各种If语句
准备好进行各种变化。一些应用程序混合了几种截然不同的颜色,以实现所需的颜色。