图色 - 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.通过手机助手截取图片,如下图所示:

2.打开截图文件夹,如下图所示:

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