Images 图片处理
Images
稳定性: 稳定
images 模块提供了一些手机设备中常见的图片处理函数,包括截图、读写图片、图片剪裁、旋转、二值化、找色找图等。
该模块分为两个部分,找图找色部分和图片处理部分。
需要注意的是,image 对象创建后尽量在不使用时进行回收,同时避免循环创建大量图片。因为图片是一种占用内存比较大的资源,尽管 Auto.js 通过各种方式(比如图片缓存机制、垃圾回收时回收图片、脚本结束时回收所有图片)尽量降低图片资源的泄漏和内存占用,但是糟糕的代码仍然可以占用大量内存。
Image 对象通过调用recycle()函数来回收。例如:
// 读取图片
var img = images.read("./1.png");
//对图片进行操作
...
// 回收图片
img.recycle();
例外的是,caputerScreen()返回的图片不需要回收。
图片处理
images.read(path)
path{string} 图片路径
读取在路径 path 的图片文件并返回一个 Image 对象。如果文件不存在或者文件无法解码则返回 null。
images.load(url)
url{string} 图片 URL 地址
加载在地址 URL 的网络图片并返回一个 Image 对象。如果地址不存在或者图片无法解码则返回 null。
images.copy(img)
img{Image} 图片- 返回 {Image}
复制一张图片并返回新的副本。该函数会完全复制 img 对象的数据 。
images.save(image, path[, format = "png", quality = 100])
image{Image} 图片path{string} 路径format{string} 图片格式,可选的值为:pngjpeg/jpgwebp
quality{number} 图片质量,为 0~100 的整数值
把图片 image 以 PNG 格式保存到 path 中。如果文件不存在会被创建;文件存在会被覆盖。
//把图片压缩为原来的一半质量并保存
var img = images.read("/sdcard/1.png");
images.save(img, "/sdcard/1.jpg", "jpg", 50);
app.viewFile("/sdcard/1.jpg");
images.fromBase64(base64)
base64{string} 图片的 Base64 数据- 返回 {Image}
解码 Base64 数据并返回解码后的图片 Image 对象。如果 base64 无法解码则返回null。
images.toBase64(img[, format = "png", quality = 100])
image{image} 图片format{string} 图片格式,可选的值为:pngjpeg/jpgwebp
quality{number} 图片质量,为 0~100 的整数值- 返回 {string}
把图片编码为 base64 数据并返回。
images.fromBytes(bytes)
bytes{byte[]} 字节数组
解码字节数组 bytes 并返回解码后的图片 Image 对象。如果 bytes 无法解码则返回null。
images.toBytes(img[, format = "png", quality = 100])
image{image} 图片format{string} 图片格式,可选的值为:pngjpeg/jpgwebp
quality{number} 图片质量,为 0~100 的整数值- 返回 {byte[]}
把图片编码为字节数组并返回。
images.clip(img, x, y, w, h)
img{Image} 图片x{number} 剪切区域的左上角横坐标y{number} 剪切区域的左上角纵坐标w{number} 剪切区域的宽度h{number} 剪切区域的高度- 返回 {Image}
从图片 img 的位置(x, y)处剪切大小为 w * h 的区域,并返回该剪切区域的新图片。
var src = images.read("/sdcard/1.png");
var clip = images.clip(src, 100, 100, 400, 400);
images.save(clip, "/sdcard/clip.png");
images.resize(img, size[, interpolation])
[v4.1.0 新增]
-
img{Image} 图片 -
size{Array} 两个元素的数组[w, h],分别表示宽度和高度;如果只有一个元素,则宽度和高度相等 -
interpolation{string} 插值方法,可选,默认为"LINEAR"(线性插值),可选的值有:NEAREST最近邻插值LINEAR线性插值(默认)AREA区域插值CUBIC三次样条插值LANCZOS4Lanczos 插值 参见InterpolationFlags
-
返回 {Image}
调整图片大小,并返回调整后的图片。例如把图片放缩为 200*300:images.resize(img, [200, 300])。
images.scale(img, fx, fy[, interpolation])
[v4.1.0 新增]
-
img{Image} 图片 -
fx{number} 宽度放缩倍数 -
fy{number} 高度放缩倍数 -
interpolation{string} 插值方法,可选,默认为"LINEAR"(线性插值 ),可选的值有:NEAREST最近邻插值LINEAR线性插值(默认)AREA区域插值CUBIC三次样条插值LANCZOS4Lanczos 插值 参见InterpolationFlags
-
返回 {Image}
放缩图片,并返回放缩后的图片。例如把图片变成原来的一半:images.scale(img, 0.5, 0.5)。
images.rotate(img, degress[, x, y])
[v4.1.0 新增]
img{Image} 图片degress{number} 旋转角度。x{number} 旋转中心 x 坐标,默认为图片中点y{number} 旋转中心 y 坐标,默认为图片中点- 返回 {Image}
将图片逆时针旋转 degress 度,返回旋转后的图片对象。
例如逆时针旋转 90 度为images.rotate(img, 90)。
images.concat(img1, image2[, direction])
[v4.1.0 新增]
img1{Image} 图 片 1img2{Image} 图片 2- direction {string} 连接方向,默认为"RIGHT",可选的值有:
LEFT将图片 2 接到图片 1 左边RIGHT将图片 2 接到图片 1 右边TOP将图片 2 接到图片 1 上边BOTTOM将图片 2 接到图片 1 下边
- 返回 {Image}
连接两张图片,并返回连接后的图像。如果两张图片大小不一致,小的那张将适当居中。
images.grayscale(img)
[v4.1.0 新增]
img{Image} 图片- 返回 {Image}
灰度化图片,并返回灰度化后的图片。
image.threshold(img, threshold, maxVal[, type])
[v4.1.0 新增]
img{Image} 图片threshold{number} 阈值maxVal{number} 最大值type{string} 阈值化类型,默认为"BINARY",参见ThresholdTypes, 可选的值:BINARYBINARY_INVTRUNCTOZEROTOZERO_INVOTSUTRIANGLE
- 返回 {Image}
将图片阈值化,并返回处理后的图像。可以用这个函数进行图片二值化。例如:images.threshold(img, 100, 255, "BINARY"),这个代码将图片中大于 100 的值全部变成 255,其余变成 0,从而达到二值化的效果。如果 img 是一张灰度化图片,这个代码将会得到一张黑白图片。
可以参考有关博客(比如threshold 函数的使用)或者 OpenCV 文档threshold。
images.adaptiveThreshold(img, maxValue, adaptiveMethod, thresholdType, blockSize, C)
[v4.1.0 新增]
img{Image} 图片maxValue{number} 最大值adaptiveMethod{string} 在一个邻域内计算阈值所采用的算法,可选的值有:MEAN_C计算出领域的平均值再减去参数 C 的值GAUSSIAN_C计算出领域的高斯均值再减去参数 C 的值
thresholdType{string} 阈值化类型,可选的值有:BINARYBINARY_INV
blockSize{number} 邻域块大小C{number} 偏移值调整量- 返回 {Image}
对图片进行自适应阈值化处理,并返回处理后的图像。
可以参考有关博客(比如threshold 与 adaptiveThreshold)或者 OpenCV 文档adaptiveThreshold。
images.cvtColor(img, code[, dstCn])
[v4.1.0 新增]
img{Image} 图片code{string} 颜色空间转换的类型,可选的值有一共有 205 个(参见ColorConversionCodes),这里只列出几个:BGR2GRAYBGR 转换为灰度BGR2HSVBGR 转换为 HSV- ``
dstCn{number} 目标图像的颜色通道数量,如果不填写则根据其他参数自动决定。- 返回 {Image}
对图像进行颜色空间转换,并返回转换后的图像。
可以参考有关博客(比如颜色空间转换)或者 OpenCV 文档cvtColor。
images.inRange(img, lowerBound, upperBound)
[v4.1.0 新增]
img{Image} 图片lowerBound{string} | {number} 颜色下界upperBound{string} | {number} 颜色下界- 返回 {Image}
将图片二值化,在 lowerBound~upperBound 范围以外的颜色都变成 0,在范围以内的颜色都变成 255。
例如images.inRange(img, "#000000", "#222222")。
images.interval(img, color, interval)
[v4.1.0 新增]
img{Image} 图片color{string} | {number} 颜色值interval{number} 每个通道的范围间隔- 返回 {Image}
将图片二值化,在 color-interval ~ color+interval 范围以外的颜色都变成 0,在范围以内的颜色都变成 255。这里对 color 的加减是对每个通道而言的。
例如images.interval(img, "#888888", 16),每个通道的颜色值均为 0x88,加减 16 后的范围是[0x78, 0x98],因此这个代码将把#787878~#989898 的颜色变成#FFFFFF,而把这个范围以外的变成#000000。
images.blur(img, size[, anchor, type])
[v4.1.0 新增]
img{Image} 图片size{Array} 定义滤波器的大小,如[3, 3]anchor{Array} 指定锚点位置(被平滑点),默认为图像中心type{string} 推断边缘像素类型,默认为"DEFAULT",可选的值有:CONSTANTiiiiii|abcdefgh|iiiiiii with some specified iREPLICATEaaaaaa|abcdefgh|hhhhhhhREFLECTfedcba|abcdefgh|hgfedcbWRAPcdefgh|abcdefgh|abcdefgREFLECT_101gfedcb|abcdefgh|gfedcbaTRANSPARENTuvwxyz|abcdefgh|ijklmnoREFLECT101same as BORDER_REFLECT_101DEFAULTsame as BORDER_REFLECT_101ISOLATEDdo not look outside of ROI
- 返回 {Image}
对图像进行模糊(平滑处理),返回处理后的图像。
可以参考有关博客(比如实现图像平滑处理)或者 OpenCV 文档blur。
images.medianBlur(img, size)
[v4.1.0 新增]
img{Image} 图片size{Array} 定义滤波器的大小,如[3, 3]- 返回 {Image}
对图像进行中值滤波,返回处理后的图像。
可以参考有关博客(比如实现图像平滑处理)或者 OpenCV 文档blur。
images.gaussianBlur(img, size[, sigmaX, sigmaY, type])
[v4.1.0 新增]
img{Image} 图片size{Array} 定义滤波器的大小,如[3, 3]sigmaX{number} x 方向的标准方差,不填写则自动计算sigmaY{number} y 方向的标准方差,不填写则自动计算type{string} 推断边缘像素类型,默认为"DEFAULT",参见images.blur- 返回 {Image}
对图像进行高斯模糊,返回处理后的图像。
可以参考有关博客(比如实现图像平滑处理)或者 OpenCV 文档GaussianBlur。
images.matToImage(mat)
[v4.1.0 新增]
mat{Mat} OpenCV 的 Mat 对象- 返回 {Image}
把 Mat 对象转换为 Image 对象。
找图找色
images.requestScreenCapture([landscape])
landscape{boolean} 截屏方向true横屏截图false竖屏截图- 不指定值,由当前设备屏幕方向决定截图方向
return{boolean}
向系统申请屏幕截图权限,返回是否请求成功,仅需执行一次
建议在本软件界面运行该函数,在其他软件界面运行时容易出现一闪而过的黑屏现象。
示例:
//请求截图
//每次使用该函数都会弹出截图权限请求,建议选择“总是允许”。
if (!requestScreenCapture()) {
toast("请求截图失败");
exit();
}
//连续截图 10 张图片(间隔 1 秒)并保存到存储卡目录
for (var i = 0; i < 10; i++) {
captureScreen("/sdcard/screencapture" + i + ".png");
sleep(1000);
}
//安卓版本高于Android 9
if (device.sdkInt > 28) {
//等待截屏权限申请并同意
threads.start(function () {
packageName("com.android.systemui").text("立即开始").waitFor();
text("立即开始").click();
});
}
//申请截屏权限
if (!requestScreenCapture()) {
toast("请求截图失败");
exit();
}
该函数也可以作为全局函数使用。
images.stopScreenCapturer()
[v6.5.8 新增]
停止截图权限并释放相关资源,若之后再调用images.captureScreen()截图会抛出错误
images.captureScreen()
return{Image}
截取当前屏幕并返回一个 Image 对象。
没有截图权限时执行该函数会抛出 SecurityException。
该函数不会返回 null,两次调用可能返回相同的 Image 对象。这是因为设备截图的更新需要一定的时间,短时间内(一般来说是 16ms)连续调用则会返回同一张截图。
截图需要转换为 Bitmap 格式,从而该函数执行需要一定的时间(0~20ms)。
另外在 requestScreenCapture()执行成功后需要一定时间后才有截图可用,因此如果立即调用 captureScreen(),会等待一定时间后(一般为几百 ms)才返回截图。
例子:
//请求横屏截图
requestScreenCapture(true);
//截图
var img = captureScreen();
//获取在点(100, 100)的颜色值
var color = images.pixel(img, 100, 100);
//显示该颜色值
toast(colors.toString(color));
该函数也可以作为全局函数使用。
images.captureScreen(path)
path{string} 截图保存路径
截取当前屏幕并以 PNG 格式保存到 path 中。如果文件不存在会被创建;文件存在会被覆盖。
该函数不会返回任何值。该函数也可以作为全局函数使用。
images.registerAsyncCapture(listener)
[v7.1.6 新增]
listener : (image: Image) => void回调函数,参数为一个 Image 对象return : () => void返回一个函数,用于取消监听
注册一个截图监听函数,每当手机画面有变化时才会传回新的图像,而不必通过传统方法重复处理相同的图片, 回调函数会在后台线程中运行,需要注意线程安全。
var cancel = images.registerAsyncCapture((img) => {
log("新截图:", img);
});
//5秒后停止监听
setTimeout(cancel, 5000);
images.pixel(image, x, y)
image{Image} 图片x{number} 要获取的像素的横坐标。y{number} 要获取的像素的纵坐标。
返回图片 image 在点(x, y)处的像素的 ARGB 值。
该值的格式为 0xAARRGGBB,是一个"32 位整数"(虽然 JavaScript 中并不区分整数类型和其他数值类型)。
坐标系以图片左上角为原点。以图片左侧边为 y 轴,上侧边为 x 轴。
images.readPixels(path)
path{string} 图片的地址return{Object} 包括图片的像素数据和宽高,{data,width,height}
读取图片的像素数据和宽高。
images.findColor(image, color, options)
image{Image} 图片color{number} | {string} 要寻找的颜色的 RGB 值。如果是一个整数,则以 0xRRGGBB 的形式代表 RGB 值(A 通道会被忽略);如果是字符串,则以"#RRGGBB"代表其 RGB 值。options{Object} 选项包括:region{Array} 找色区域。是一个两个或四个元素的数组。(region[0], region[1])表示找色区域的左上角;region[2]*region[3]表示找色区域的宽高。如果只有 region 只有两个元素,则找色区域为(region[0], region[1])到屏幕右下角。如果不指定 region 选项,则找色区域为整张图片。threshold{number} 找色时颜色相似度的临界值,范围为 0255(越小越相似,0 为颜色相等,255 为任何颜色都能匹配)。默认为 4。threshold 和浮点数相似度(0.01.0)的换算为 similarity = (255 - threshold) / 255.
在图片中寻找颜色 color。找到时返回找到的点 Point,找不到时返回 null。
该函数也可以作为全局函数使用。
一个循环找色的例子如下:
requestScreenCapture();
//循环找色,找到红色(#ff0000)时停止并报告坐标
while (true) {
var img = captureScreen();
var point = findColor(img, "#ff0000");
if (point) {
toast("找到红色,坐标为(" + point.x + ", " + point.y + ")");
}
}
一个区域找色的例子如下:
//读取本地图片/sdcard/1.png
var img = images.read("/sdcard/1.png");
//判断图片是否加载成功
if (!img) {
toast("