我如何找到一个不是某种颜色的像素



autohotkey的 PixelSearch允许搜索(x1,y1)中的某个颜色的像素。(x2,y2)矩形。

但我想找到任何不是某种颜色的像素,给定背景颜色,我想检测到何时出现在任何其他颜色中前景。

有没有办法使用内置PixelSearch或其他内置功能来执行此操作?

如果您对背景颜色有一定的控制权,也许可以使用Pixelsearch的variation参数。

如果您的背景颜色是黑色的,请搜索 White 带有变体的像素254. Pixelsearch应该返回任何不是黑色的像素。

此代码搜索以外的任何像素(未测试)

White := 0xFFFFFF
PixelSearch OutputVarX, OutputVarY, X1, Y1, X2, Y2, %White%, 254

如果您的背景是Midtone Grey(0x7f7f7f),请尝试搜索带有变化的黑色 White127。再次,我还没有对此进行测试。也许变化应为126或63。您可能必须进行一些反复试验,因为变体参数的行为尚未全面记录。

您可以使用PixelgetColor来查看单个像素。该指令告诉您位置x,y处的像素的颜色。如果命令确定像素是否为0x9d6346。

在循环中使用PixelgetColor可以通过增加X,Y或两者来一次测试一系列像素。

是的,正确的顺序为bgr而不是RGB。查看帮助文件证实了这一点。:)

改变了颜色。也许您可以寻找另一种检测屏幕上更改的方法。由于另一个窗口或消息而变化,颜色的变化是否变得活跃?如果是这样,您可以使用许多命令来确定屏幕上出现的内容。

Windows间谍擅长确定弹出消息的名称。即使它们具有与现有窗口相同的名称,您也可以确定哪个是由包含或排除的文本。

更改特定窗口的位置可能足以检测您要寻找的更改。

也许有更多的细节描述您要检测到的内容会有所帮助。至少可以确认我们处于同一球场。

我想不出一种仅使用内置功能解决此问题的可靠方法。但是,您可以在外部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.dllsprintf", Str,RGB, Str,"%06X", UInt,ARGB<<8 )
    Return "0x" RGB
}

未测试

据称,此gdip_bitmapFromScreen()实际上比pixelSearch更快

此像素搜索对我有用,以查找白色以外的任何颜色:

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

作为一个相对新手,我讨厌这样做。:)

在帮助文件中的Pixelsearch中。

pixelsearch,px,py,200,200,300,300,300,0x9d6346,3,fast

如果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。这三个数字可以介于十六进制到十六进制FF之间(十进制为0至255)。

变化表示为十进制数字是搜索颜色中允许范围的数量

9D范围为9b至9f。63 = 61至66,46 = 44至69。取决于搜索号是否已进入我的范围可能会超过1。

如果其他所有因素都失败了Google HexadeCimal

pixelgetColor类似的可能性,然后进行多种if语句

为非常广泛的变化做好准备。一些应用程序将几种截然不同的颜色交织在一起以获得所需的颜色。

最新更新