找色函数

函数:getColor() 获取指定像素的颜色

函数说明 : 获取指定像素的颜色
函数方法 : getColor(整数型x, 整数型y);
返回值 : 整型 color

参数类型说明
整数型将获取颜色值的X坐标
整数型将获取颜色值的y坐标
返回值类型说明
color整数型x,y坐标点的十进制颜色值

示例:

c = getColor(100, 100);         -- 将坐标为(100,100)的点的颜色保存在变量c中
if c == 0x0000ff then           -- 如果该点颜色为0x0000ff(纯蓝色)
    touchDown(0, 100, 100);     -- 那么点击该坐标
    touchUp(0);
end

---------------也可以写成-------------

if getColor(100, 100) == 0x0000ff then   -- 如果该点颜色为0x0000ff(纯蓝色)
    touchDown(0, 100, 100);     -- 那么点击该坐标
    touchUp(0);
end

注意事项:

1,getColor()返回的是十进制颜色值,如纯白色获取到的数值是16777215。十进制数值和十六进制颜色对比时,十六进制前面需加"0x"即"0xFFFFFF"。
2,在十六进制颜色值"0xAABBCC"中,"AA"对应的是红(R,Red),"BB"对应的是绿(G,Green),"CC"对应的是蓝(B,Blue)。

语法说明:

c = getColor(100, 100); 中"="的作用是赋值,将getColor(100, 100)获得的值赋值给c这个变量。
if getColor(100, 100) == 0x0000ff then 中的"=="是关系运算符中等于的意思。
翻译成中文就是:如果 100,100这个坐标的颜色等于 0x0000ff 那么执行下面的语句。不等于的写法是"~="

函数:getColorRGB() 获取指定像素颜色的R、G、B三个值

函数说明 : 获取指定像素颜色的R、G、B三个值
函数方法 : getColorRGB(整数型x, 整数型y);
返回值 : 整型 R,G,B

参数类型说明
整数型将获取颜色值的X坐标
整数型将获取颜色值的Y坐标
返回值类型说明
R整数型x,y坐标点的颜色R(红色)值
G整数型x,y坐标点的颜色G(绿色)值
B整数型x,y坐标点的颜色B(蓝色)值

示例:

r, g, b = getColorRGB(100, 100);              -- 将坐标为(100,100)的点的颜色的R、G、B分别保存在变量r、g、b中
if r == 0x00 and b == 0x00 and g == 0xff then -- 如果该点颜色为0x0000ff(纯蓝色)
    touchDown(0, 100, 100);                   -- 那么点击该坐标
    touchUp(0);
end

示例:封装一个单点模糊比对函数

function compare_color_point(x,y,r,g,b,sim)
    local lr,lg,lb;
    lr,lg,lb = getColorRGB(x,y);
    if math.abs(lr-r) > sim then
        return false;
    end
    if math.abs(lg-g) > sim then
        return false;
    end
    if math.abs(lb-b) > sim then
        return false;
    end
    return true;
end
-----调用方法
if compare_color_point(100,100,255,255,255,30) then
    touchDown(0, 100, 100);
    mSleep(50)
    touchUp(0);
end
--sim值越小精确度越高,范围是 0-255

函数:findColor() 全屏找色

函数说明 : 全屏寻找符合指定颜色的坐标,不支持模糊查找。
函数方法 : findColor(整型 color);
返回值 : 整数型 x, y

参数类型说明
color整数型将要找的十六进制颜色值
返回值类型说明
x整数型找到的坐标X值,未找到返回 -1
y整数型找到的坐标Y值,未找到返回 -1

示例

x, y = findColor(0x0000ff); -- 在全屏范围找到第一个颜色为0x0000ff的点, 将其坐标保存到变量x和y中
if x ~= -1 and y ~= -1 then -- 如果找到了
    touchDown(0, x, y);     -- 点击那个点
    touchUp(0);
end

注意事项:

1,未找到时返回 (-1,-1),示例中使用的"~=" 为关系运算符"不等于"的意思。 "and"为逻辑运算符 "和"的意思。
2,尽量不要使用这个函数,全屏找色耗费资源,而且由于颜色可能会产生肉眼不可见的变化导致找色失败,建议使用区域模糊找色。

LUA逻辑运算符:

and or not
逻辑运算符认为false和nil是假(false),其他为真,0也是true.
and和or的运算结果不是true和false,而是和它的两个操作数相关。
a and b -- 如果a为false,则返回a,否则返回b
a or b -- 如果a为true,则返回a,否则返回b

例如:

print(4 and 5)           --> 5
print(nil and 13)        --> nil
print(false and 13)      --> false
print(4 or 5)            --> 4
print(false or 5)        --> 5

函数:findColorFuzzy() 全屏模糊找色

函数说明 : 全屏寻找符合指定颜色的坐标,支持模糊查找。
函数方法 : findColorFuzzy(整型 color,整数型 degree);
返回值 : 整数型 x, y

参数类型说明
color整数型将要找的十六进制颜色值
degree整数型精度,范围:1 ~ 100,数值越大精度越高,100为完全匹配
返回值类型说明
x整数型找到的坐标X值,未找到返回 -1
y整数型找到的坐标Y值,未找到返回 -1

示例

x, y = findColorFuzzy(0x0000ff, 90); -- 在全屏范围找到第一个颜色为0x0000ff的点, 精确度为90%, 将其坐标保存到变量x和y中
if x ~= -1 and y ~= -1 then          -- 如果找到了
    touchDown(0, x, y);              -- 点击那个点
    touchUp(0);
end

注意事项:

1,未找到时返回 (-1,-1),示例中使用的"~=" 为关系运算符"不等于"的意思。 "and"为逻辑运算符 "和"的意思。
2,全屏找色耗费资源,尽量不要使用这个函数。

函数:findColorInRegion() 区域找色

函数说明 : 区域寻找符合指定颜色的坐标,不支持模糊查找。
函数方法 : findColorInRegion(整型 color,整数型 x1, 整数型 y1, 整数型 x2, 整数型 y2);
返回值 : 整数型 x, y

参数类型说明
color整数型将要找的十六进制颜色值
x1整数型欲寻找的区域左上角的X坐标
y1整数型欲寻找的区域左上角的Y坐标
x2整数型欲寻找的区域右下角的X坐标
y2整数型欲寻找的区域右下角的Y坐标
返回值类型说明
x整数型找到的坐标X值,未找到返回 -1
y整数型找到的坐标Y值,未找到返回 -1

示例

x, y = findColorInRegion(0x0000ff, 100, 100, 200, 200); -- 在区域[(100,100)(200,200)]范围找到第一个颜色为0x0000ff的点, 将其坐标保存到变量x和y中
if x ~= -1 and y ~= -1 then                             -- 如果找到了
    touchDown(0, x, y);                                 -- 点击那个点
    touchUp(0);
end

注意事项:

1,未找到时返回 (-1,-1),示例中使用的"~=" 为关系运算符"不等于"的意思。 "and"为逻辑运算符 "和"的意思。
2,而且由于颜色可能会产生肉眼不可见的变化导致找色失败,建议使用区域模糊找色。

函数:findColorInRegionFuzzy() 区域模糊找色

函数说明 : 区域寻找符合指定颜色的坐标,支持模糊查找。
函数方法 : findColorInRegionFuzzy(整型 color, 整数型 degree,整数型 x1, 整数型 y1, 整数型 x2, 整数型 y2);
返回值 : 整数型 x, y

参数类型说明
color整数型将要找的十六进制颜色值
degree整数型精度,范围:1 ~ 100,数值越大精度越高,100为完全匹配
x1整数型欲寻找的区域左上角的X坐标
y1整数型欲寻找的区域左上角的Y坐标
x2整数型欲寻找的区域右下角的X坐标
y2整数型欲寻找的区域右下角的Y坐标
返回值类型说明
x整数型找到的坐标X值,未找到返回 -1
y整数型找到的坐标Y值,未找到返回 -1

示例

x, y = findColorInRegionFuzzy(0x0000ff, 90, 100, 100, 200, 200); -- 在区域[(100,100)(200,200)]范围找到第一个颜色为0x0000ff的点, 精确度为90%, 将其坐标保存到变量x和y中
if x ~= -1 and y ~= -1 then                                      -- 如果找到了
    touchDown(0, x, y);                                          -- 点击那个点
    touchUp(0);
end

示例:此函数单点模糊找色使用方法

x, y = findColorInRegionFuzzy(0x0000ff, 90, 100, 100, 100, 100); -- 将左上角和右下角两个坐标写成一样,作用就是判断(100,100)这个坐标颜色是否为0x0000ff, 精确度为90%, 将其坐标保存到变量x和y中
if x ~= -1 and y ~= -1 then                                      -- 如果找到了
    touchDown(0, x, y);                                          -- 点击那个点
    touchUp(0);
end

示例:不断降低精确度的写法

for sim = 100, 50, -1 do           --使用 for 循环不断降低精确度(建议精确度不低于50%)
    x, y = findColorInRegionFuzzy(0x0000ff, sim, 100, 100, 100, 100);
    if x ~= -1 and y ~= -1 then   --如果在指定区域找到某点符合条件
        touchDown(0, x, y);       --那么单击该点
        touchUp(0);
        break;                    --并跳出循环
    end
end

注意事项:

1,未找到时返回 (-1,-1),示例中使用的"~=" 为关系运算符"不等于"的意思。 "and"为逻辑运算符 "和"的意思。

函数:findMultiColorInRegionFuzzy() 多点区域模糊找色

函数说明 : 区域内寻找多个符合条件的点,支持模糊查找。
函数方法 : findMultiColorInRegionFuzzy(数组 table, 整数型 degree,整数型 x1, 整数型 y1, 整数型 x2, 整数型 y2);
返回值 : 整数型 x, y

参数类型说明
table数组要找的颜色数组
degree整数型精度,范围:1 ~ 100,数值越大精度越高,100为完全匹配
x1整数型欲寻找的区域左上角的X坐标
y1整数型欲寻找的区域左上角的Y坐标
x2整数型欲寻找的区域右下角的X坐标
y2整数型欲寻找的区域右下角的Y坐标
返回值类型说明
x整数型找到的坐标X值,未找到返回 -1
y整数型找到的坐标Y值,未找到返回 -1

示例

 -- 在区域[(10,10)(200,200)]范围内以90%的精确度找一个满足以下条件的点:
 --     1. 其颜色为0x0000ff
 --     2. 其X坐标+10,Y坐标+20的坐标上的点颜色为0x00ff00
 --     3. 其X坐标-10,Y坐标-20的坐标上的点颜色为0xff0000
x, y = findMultiColorInRegionFuzzy({0x0000ff, 10, 20, 0x00ff00, -10, -20, 0xff0000 }, 90, 10, 10, 200, 200);
if x ~= -1 and y ~= -1 then                                      -- 如果找到了
    touchDown(0, x, y);                                          -- 点击那个点
    touchUp(0);
end

指导:
此函数作用是先找到第一个基准点后,在这个点周围按照数组格式来查找其他的点,数组内所有点都符合要求即为找到。
通过多点我们可以建立一个大概的模型,比如一个关闭窗口的叉图标
假如下面是一个5*5的像素的图片

10001
01010
00100
01010
10001

通过取1位置的颜色用9个像素点就可以建立一个叉的模型,甚至用5个坐标点就可以建立一个大致的模型

10001
00000
00100
00000
10001

假设第一个1坐标是100,100,所有1的颜色为0x123456
那么第二个点坐标就为104,100,相对第一个坐标的偏移值为(4,0);
那么第三个点坐标就为102,102,相对第一个坐标的偏移值为(2,2);
那么第四个点坐标就为100,104,相对第一个坐标的偏移值为(0,4);
那么第五个点坐标就为104,104,相对第一个坐标的偏移值为(4,4);
把以上5个坐标点变成多点找色的数组格式为:

{0x123456, 4,0, 0x123456, 2,2, 0x123456, 0,4, 0x123456, 4,4, 0x123456 }

找色代码为:

x, y = findMultiColorInRegionFuzzy({0x123456, 4,0, 0x123456, 2,2, 0x123456, 0,4, 0x123456, 4,4, 0x123456 }, 90, 50, 50 150, 150);

返回的坐标为(100,100),即使这个图标在(50, 50 150, 150)这个范围内进行了偏移也可准确的找到该图标并点击。

用5个点建立的模型从效率上来说就比25个点效率要高很多。
甚至我们可以把数字,字母,文字建立成数组模型来实现找字,判断金币数量等操作。

注意事项:

1,数组内的坐标为第一个坐标的相对值。
2,多点找色代码和数组可以通过触摸精灵脚本编辑器的找色工具生成。
3,精确度设置的越低就会增大误判的可能性,建议设置60~90之间。
4,善用此函数可完全替代找图,并提高脚本效率。

函数:findMultiColorInRegionFuzzyEx() 高级多点区域模糊找色

函数说明 : 返回区域内多个符合条件的点,支持模糊查找。
函数方法 : findMultiColorInRegionFuzzyEx(数组 table, 整数型 degree,整数型 x1, 整数型 y1, 整数型 x2, 整数型 y2);
返回值 : 数组 table

参数类型说明
table数组要找的颜色数组
degree整数型精度,范围:1 ~ 100,数值越大精度越高,100为完全匹配
x1整数型欲寻找的区域左上角的X坐标
y1整数型欲寻找的区域左上角的Y坐标
x2整数型欲寻找的区域右下角的X坐标
y2整数型欲寻找的区域右下角的Y坐标
返回值类型说明
table数组范围内找到的坐标table,未找到返回 {} 空数组

返回的 table 格式:

table = { {
            x = 394,
            y = 397
        }, {
            x = 488,
            y = 404
        }, {
            x = 488,
            y = 713
        } }

示例:

function main()
    local inspect = require('inspect')
    t = findMultiColorInRegionFuzzyEx({0xEB78E6, 1, 0, 0xF09CE9, 2, 4, 0x6C1771, 2, 6, 0x4B1956},80,100, 100, 500, 500)
    logDebug(inspect(t))
end