图片 - Images

Images Stability: 2 - Stable 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} 图片格式,可选的值为: png jpeg/jpg webp 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"); media.scanFile("/sdcard/1.jpg"); //刷新图库 以下非官方例子 //下载图片 let res =http.get("http://imgsrc.baidu.com/forum/w%3D580/sign=5339d407ab8b87d65042ab1737082860/ffef9a44ebf81a4cb12a8affdd2a6059242da6cd.jpg") if (res.statusCode == 200) { let img = images.fromBytes(res.body.bytes()); img = images.resize(img, [500, 600]); log(img); var s=images.save(img, "/sdcard/DCIM/Camera/IMG_20200121_99999.jpg", "jpg", 50); media.scanFile("/sdcard/DCIM/Camera/IMG_20200121_99999.jpg"); //刷新图片文件 log(s); toast("下载成功"); } images.fromBase64(base64) base64 {string} 图片的Base64数据 返回 {Image} 解码Base64数据并返回解码后的图片Image对象。如果base64无法解码则返回null。 images.toBase64(img[, format = “png”, quality = 100]) image {image} 图片 format {string} 图片格式,可选的值为: png jpeg/jpg webp quality {number} 图片质量,为0~100的整数值 返回 {string} 把图片编码为base64数据并返回。 联众识别2.0接口调用示例: let src = captureScreen(), clip; //截图 // 红米7a 滑块区域的两种图片 if (findNode("text", "请进行安全验证")) { clip = images.clip(src, 104, 538, 512, 256); } else if (findNode("text", "请拖动下方滑块完成拼图")) { clip = images.clip(src, 67, 482, 585, 329); } let result = getCode(clip); log(result) // { code: '-1', msg: '网络链接超时...', data: {} } // { code: 0, msg: '', data: { recognition: '1' } } // { code: 0, msg: '', data: { recognition: '354,205' } } 识别成功 // 联众接入技术 10:11:53 // 如果平台压缩了客户上传图像展示的话 返还结果是 是储存结果乘以压缩比例 // 平台后台上,识别结果显示的 是储存图像的坐标值 // 以程序返还坐标值为准 那个是以客户原图返回的坐标 function getCode(img) { http.__okhttp__.setTimeout(3e4); var imgData = images.toBase64(img, format = "png"), i = device.release, c = device.model, s = device.buildId; try { var json = http.postJson("https://v2-api.jsdama.com/upload", { softwareId: softwareId, softwareSecret: softwareSecret, username: username, password: password, captchaData: imgData, captchaType: captchaType, captchaMinLength: 1, captchaMaxLength: 1, workerTipsId: 0 }, { headers: { "User-Agent": "Mozilla/5.0 (Linux; Android " + i + "; " + c + " Build/" + s + "; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 Mobile Safari/537.36", } }); } catch (e) { return { code: "-1", msg: "网络链接超时...", data: {} }; } var html = json.body.json(), code = html.code, message = html.message; if (code == "0") { // log(html.data.recognition) // { data: { recognition: '296,192', captchaId: '20190903:000000000033308132201' }, message: '', code: 0 } return { code: code, msg: message, data: { recognition: html.data.recognition } }; } else if (code == "10079009" || code == "10142006" || code == "10142004" || code == "10142005" || code == "10079006") { return { code: code, msg: message, data: {} }; } else { log("其他识别结果", code) }; return html; } images.fromBytes(bytes) bytes {byte[]} 字节数组 解码字节数组bytes并返回解码后的图片Image对象。如果bytes无法解码则返回null。 images.toBytes(img[, format = “png”, quality = 100]) image {image} 图片 format {string} 图片格式,可选的值为: png jpeg/jpg webp 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 三次样条插值 LANCZOS4 Lanczos插值 参见InterpolationFlags 返回 {Image} 调整图片大小,并返回调整后的图片。例如把图片放缩为200*300:images.resize(img, [200, 300])。 参见Imgproc.resize。 images.scale(img, fx, fy[, interpolation]) [v4.1.0新增] img {Image} 图片 fx {number} 宽度放缩倍数 fy {number} 高度放缩倍数 interpolation {string} 插值方法,可选,默认为"LINEAR"(线性插值),可选的值有: NEAREST 最近邻插值 LINEAR 线性插值(默认) AREA 区域插值 CUBIC 三次样条插值 LANCZOS4 Lanczos插值 参见InterpolationFlags 返回 {Image} 放缩图片,并返回放缩后的图片。例如把图片变成原来的一半: images.scale(img, 0.5, 0.5)。 参见Imgproc.resize。 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} 图片1 img2 {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, 可选的值: BINARY BINARY_INV TRUNC TOZERO TOZERO_INV OTSU TRIANGLE 返回 {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} 阈值化类型,可选的值有: BINARY BINARY_INV blockSize {number} 邻域块大小 C {number} 偏移值调整量 返回 {Image} 对图片进行自适应阈值化处理,并返回处理后的图像。 可以参考有关博客(比如threshold与adaptiveThreshold)或者OpenCV文档adaptiveThreshold。 images.cvtColor(img, code[, dstCn]) [v4.1.0新增] img {Image} 图片 code {string} 颜色空间转换的类型,可选的值有一共有205个(参见ColorConversionCodes),这里只列出几个: BGR2GRAY BGR转换为灰度 BGR2HSV BGR转换为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",可选的值有: CONSTANT iiiiii|abcdefgh|iiiiiii with some specified i REPLICATE aaaaaa|abcdefgh|hhhhhhh REFLECT fedcba|abcdefgh|hgfedcb WRAP cdefgh|abcdefgh|abcdefg REFLECT_101 gfedcb|abcdefgh|gfedcba TRANSPARENT uvwxyz|abcdefgh|ijklmno REFLECT101 same as BORDER_REFLECT_101 DEFAULT same as BORDER_REFLECT_101 ISOLATED do 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对象。