图色 - Color

### 图色相关函数 ## 找图 | findPic - 功能 屏幕找图。 - 参数 | 参数 | 类型 | 说明 | | ------- | ------ | -------------------------- | | pngFile | String | png图片文件,放到res文件夹 | | left | int | 左 | | top | int | 上 | | right | int | 右 | | bottom | int | 下 | | offset | int | 色差(例如:0x101010) | | sim | float | 相似度(0.0-1.0) | - 例子 ```groovy //找图res/find.png def ret = findPic("find.png",0,0,0,0,0x101010,1.0f) if(ret&&ret.x>0){ print "找图成功,坐标:"+ret.x+","+ret.y } ``` ## 缩放找图 | findImg - 功能 屏幕找图,不同于findPic的是,findImg可以多分辨率找图。 - 参数 | 参数 | 类型 | 说明 | | ------- | ------ | -------------------------- | | pngFile | String | png图片文件,放到res文件夹 | | left | int | 左 | | top | int | 上 | | right | int | 右 | | bottom | int | 下 | | offset | int | 色差(例如:0x101010) | | sim | float | 相似度(0.0-1.0) | - 例子 ```groovy //找图res/find.png def ret = findImg("find.png",0,0,0,0,0x101010,1.0f) if(ret&&ret.left>0){ print "找图成功,坐标:"+ret.left+","+ret.top+","+ret.right+","+ret.bottom } ``` ## 编码图片字节集(jpg) | bitmapToJpg - 功能 将内存图bitmap转为jpg格式二进制数据。 - 参数 | 参数 | 类型 | 说明 | | ------ | ----------------------- | ------------------------------------------------------------ | | bitmap | android.graphics.Bitmap | 内存图(可通过cap函数截屏获得,也可通过readBitmap读取文件获得) | - 例子 ```groovy //截屏 def bmp = cap() //将图片转jpg数据 def bytes = bitmapToJpg(bmp) //将bytes数据写到文件/sdcard/cap.jpg new File("/sdcard/cap.jpg")<<bytes ``` ## 编码图片字节集(png) | bitmapToPng - 功能 将内存图bitmap转为png格式二进制数据。 - 参数 | 参数 | 类型 | 说明 | | ------ | ----------------------- | ------------------------------------------------------------ | | bitmap | android.graphics.Bitmap | 内存图(可通过cap函数截屏获得,也可通过readBitmap读取文件获得) | - 例子 ```groovy //截屏 def bmp = cap() //将图片转jpg数据 def bytes = bitmapToPng(bmp) //将bytes数据写到文件/sdcard/cap.png new File("/sdcard/cap.png")<<bytes ``` ## 截屏 | cap - 功能 截屏。 - 参数 | 参数 | 类型 | 说明 | | ------ | ---- | ---- | | left | int | 左 | | top | int | 上 | | right | int | 右 | | bottom | int | 下 | - 例子 ```groovy def bmp = cap(100,100,200,200) if(bmp){ print bmp.getWidth() } ``` - 补充 cap参数可以为空,为空的情况下,截取全屏。 ## 截屏 | screenshot - 功能 截屏,与cap命令相同功能。 ## 读取图片文件 | readBitmap - 功能 读取图片文件。 - 参数 | 参数 | 类型 | 说明 | | ---- | ------ | -------------------- | | file | String | 要读取的图片文件路径 | - 重载参数 | 参数 | 类型 | 说明 | | ----- | ------ | ---------------------------------------------- | | bytes | byte[] | 二进制byte数据数组(可通过read函数读取文件获得) | - 例子 ```groovy def bmp = readBitmp("/sdcard/cap.jpg") if(bmp){ print("图片宽度:"+bmp.getWidth()) } ``` ## 保存图片 | saveBitmap - 功能 保存图片文件。 - 参数 | 参数 | 类型 | 说明 | | ------ | ---- | ----------------------- | | file | String |文件保存路径 | | bitmap | android.graphics.Bitmap |内存图(可通过cap函数截屏获得,也可通过readBitmap读取文件获得)| - 例子 ```groovy saveBitmap("/sdcard/cap.jpg",cap()) saveBitmap("/sdcard/cap.png",cap()) ``` ## 取颜色的红色分量 | red - 功能 取颜色的红色分量。 - 参数 | 参数 | 类型 | 说明 | | ----- | ---- | ------ | | color | int | 颜色值 | - 例子 ```groovy red(getColor(100,100)) ``` ## 取颜色的绿色分量 | green - 功能 取颜色的绿色分量。 - 参数 | 参数 | 类型 | 说明 | | ----- | ---- | ------ | | color | int | 颜色值 | - 例子 ```groovy green(getColor(100,100)) ``` ## 取颜色的蓝色分量 | blue - 功能 取颜色的蓝色分量。 - 参数 | 参数 | 类型 | 说明 | | ----- | ---- | ------ | | color | int | 颜色值 | - 例子 ```groovy blue(getColor(100,100)) ``` ## 坐标取颜色 | getColor - 功能 根据坐标取颜色。 - 参数 | 参数 | 类型 | 说明 | | ---- | ---- | ----- | | x | int | x坐标 | | y | int | y坐标 | - 例子 ```groovy //使用printf格式化输出int类型数据,可以更直观的看到颜色分量 printf("%x",getColor(0,0)) ``` ## 单点找色 | findColor - 功能 单点找色。 - 参数 | 参数 | 类型 | 说明 | | ----- | ------ | --------------- | | color | int | 颜色值 | | sim | double | 相似度(0.0-1.0) | - 重载参数 | 参数 | 类型 | 说明 | | ----- | ------ | --------------- | | colors | int[] | 多个颜色值 | | sim | double | 相似度(0.0-1.0) | - 例子 ```groovy //查找后直接打印出来 print findColor(0xff00ff00,1.0) //查找后进行判断,然后打印出来 def ret = findColor([0xff000000,0xff0000ff],1.0) if(ret){ printf("坐标:%d,%d",ret.x,ret.y) } ``` ## 多点找色 | findMultiColor - 功能 多点找色。 - 参数 | 参数 | 类型 | 说明 | | ---------- | ------ | ------------------------------------------------------------ | | firstColor | int | 第一个点的颜色 | | XYColors | int[] | 颜色数组: [x1,y1,color1,x2,y2,color2...],其中的x和y是相对于第一个点的坐标 | | sim | double | 相似度: 0.0-1.0 | - 参数重载 | 参数 | 类型 | 说明 | | -------- | -------- | ------------------------------------------------------------ | | colorRes | ColorRes | 颜色数据,可通过readColorRes函数读取res文件,也可以通过bitmapToColorResj将图片转为ColorRes | | sim | double | 相似度: 0.0-1.0 | - 例子 ```groovy //手写颜色数据,进行多点找色 def ret = findMultiColor(0xffff00ff,[1,1,0xff00ff00],1.0) if(ret){ printf("坐标:%d,%d",ret.x,ret.y) } //读取颜色数据,进行多点找色 ret = findMultiColor(readColorRes("find.color"),1.0) if(ret){ printf("坐标:%d,%d",ret.x,ret.y) } //将图片转为颜色数据,进行多点找色 ret = findMultiColor(bitmapToColorRes(cap(100,100,150,150)),1.0) if(ret){ printf("坐标:%d,%d",ret.x,ret.y) } ``` ## 读取多点找色的颜色数据 | readColorRes - 功能 读取多点找色的颜色数据。 - 参数 | 参数 | 类型 | 说明 | | ------- | ------ | ------------------------------------------- | | resFile | String | 保存在res的颜色数据,该数据通过截屏工具生成 | - 例子 ```groovy def colors = readColorRes("color/find.colors") print(colors.firstColor) ``` ## 图片转变为颜色数据 | bitmapToColorRes - 功能 将图片转变为颜色数据,用于多点找色。 - 参数 | 参数 | 类型 | 说明 | | ------ | ----------------------- | ------------------------------------------------------------ | | bitmap | android.graphics.Bitmap | 内存图(可通过cap函数截屏获得,也可通过readBitmap读取文件获得) | - 例子 ```groovy def colors = bitmapToColorRes(cap(100,100,200,200)) print(colors.firstColor) ``` ## 手机助手截图 ### 说明 找图需要先截图,需要通过手机助手截图~ ### 截图步骤 1.通过手机助手截取图片,如下图所示: ![](https://img.kancloud.cn/ee/e8/eee80bf48f413a85b0a7117a1375f0e1_724x719.png) 2.打开截图文件夹,如下图所示: ![](https://img.kancloud.cn/96/f1/96f1a8e32874bb20bb7a844ca073baee_724x719.png) 3.将图片复制到项目的res文件夹 ## 普通找图 ~~~ //参数依次为图片文件,范围左、上、右、下,色差(16进制rgb),相似度(0-1),返回结果为一个点 def p = findPic("test.png",0,0,720,1280,0x101010,0.9f) //如果找到 if(p&&p.x>0){ print p.x print p.y } ~~~ 上面的代码没有[Groovy](https://www.w3cschool.cn/groovy/index.html)基础的同学可能看不懂,不过没关系,多用就会了- - ## 缩放找图 ~~~ //参数依次为图片文件,范围左、上、右、下,色差(16进制rgb),相似度(0-1),返回结果为一个矩形范围 def r = findImg("test.png",0,0,720,1280,0x101010,0.9f) //如果找到 if(r&&r.left>0){ //范围左 print r.left //范围上 print r.top //范围右 print r.right //范围下 print r.bottom } ~~~ ## 找色* 由于找色没有提供相关代码,只能用户自行扩展了,以下代码新手可以忽略: ~~~ import android.graphics.Bitmap import android.graphics.Color import groovy.transform.CompileStatic @CompileStatic def findColor(Bitmap bitmap, int color) { int[] pixels = new int[bitmap.width * bitmap.height] bitmap.getPixels(pixels, 0, bitmap.width, 0, 0, bitmap.width, bitmap.height); int pos = 0; for (int j = 0; j < bitmap.height; j++) { for (int i = 0; i < bitmap.width; i++) { def c = pixels[pos++] if (Color.red(c) != Color.red(color)) { continue } if (Color.blue(c) != Color.blue(color)) { continue } if (Color.green(c) != Color.green(color)) { continue } return [x: i, y: j] } } } long st = System.currentTimeMillis() def p = findColor(screenshot(), 0xffffff) if (p) { print(p.x) print(p.y) } long et = System.currentTimeMillis() print(et - st) ~~~ 运行之后,如果设备分辨率为1080*1920的手机,界面没有白色的话,耗时大约在100毫秒左右。 找色建议使用c++编写更加高效的代码,JsDroid支持调用so库。 懂NDK开发的,可以将编译好的so一起打包到插件的jar包内,文件结构如下: -xxx.jar --lib ---armeabi-v7a ----libxxx.so ---x86 ----libxxx.so