http://bbs.niubt.cn/static/image/common/codebg.gif"); color: rgb(102, 102, 102); zoom: 1; border-color: rgb(236, 234, 234); font-family: Tahoma, "Microsoft Yahei", Simsun;">
// 导入必要的Android和OpenCV类
importClass(android.graphics.Bitmap);
importClass(java.io.File);
importClass(org.opencv.core.Core);
importClass(org.opencv.core.Mat);
importClass(org.opencv.core.Size);
importClass(org.opencv.imgproc.Imgproc);
// 全屏截图
var img = screen.screenShotFull();
if (img.isNull()) {
printl("截图失败");
exit();
}
// 原始图片信息
var originalPath = "/sdcard/original.jpg";
img.save(originalPath);
printl("原始图片尺寸:" + img.getWidth() + "x" + img.getHeight());
printl("原始文件大小:" + (new File(originalPath).length()/1024).toFixed(2) + "KB");
// 方法1:调整分辨率压缩
function resizeCompress(imageObj, targetWidth) {
try {
var ratio = imageObj.getHeight() / imageObj.getWidth();
var targetHeight = Math.round(targetWidth * ratio);
var srcMat = imageObj.getMat().clone();
var dstMat = new Mat();
// 使用更高效的插值算法
Imgproc.resize(srcMat, dstMat,
new Size(targetWidth, targetHeight),
0, 0, Imgproc.INTER_AREA);
// 转换回Bitmap
var resultBitmap = Bitmap.createBitmap(
dstMat.cols(),
dstMat.rows(),
Bitmap.Config.RGB_565 // 使用更省内存的配置
);
org.opencv.android.Utils.matToBitmap(dstMat, resultBitmap);
// 保存文件
var outputPath = "/sdcard/resized_" + targetWidth + ".jpg";
var fos = new java.io.FileOutputStream(outputPath);
resultBitmap.compress(Bitmap.CompressFormat.JPEG, 85, fos);
fos.close();
// 资源回收
srcMat.release();
dstMat.release();
resultBitmap.recycle();
return outputPath;
} catch(e) {
printl("压缩出错:" + e.message);
return null;
}
}
// 方法2:质量压缩
function qualityCompress(imageObj, quality) {
try {
var outputPath = "/sdcard/quality_" + quality + ".jpg";
var bitmap = imageObj.getBitmap();
var fos = new java.io.FileOutputStream(outputPath);
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, fos);
fos.close();
bitmap.recycle();
return outputPath;
} catch(e) {
printl("质量压缩失败:" + e.message);
return null;
}
}
// 执行压缩
var resizedPath = resizeCompress(img, 640);
var qualityPath = qualityCompress(img, 70);
// 显示压缩结果
function showCompressInfo(path) {
if (!path) return;
var file = new File(path);
if (file.exists()) {
printl("压缩文件:" + path);
printl("压缩后尺寸:" +
img.getWidth()*(640/img.getWidth()) + "x" +
img.getHeight()*(640/img.getWidth()));
printl("压缩后大小:" + (file.length()/1024).toFixed(2) + "KB");
}
}
showCompressInfo(resizedPath);
showCompressInfo(qualityPath);
// 资源回收
img.recycle();
主要包含两种压缩方式:分辨率压缩和质量压缩。以下是代码的详细解释:
----- 基础准备 -----
- 类库导入:
- 导入Android图形类(Bitmap)、文件操作类
- 导入OpenCV核心库和图像处理类
- 使用屏幕截图需要Auto.js的screen对象
- 全屏截图:
var img = screen.screenShotFull(); // 获取全屏截图
img.save(originalPath); // 保存原始图片
----- 核心方法 -----
- 分辨率压缩方法(resizeCompress):
- 按比例缩小尺寸:保持宽高比计算目标高度
- 使用OpenCV的INTER_AREA算法(适合缩小图像的插值算法)
- 转换Bitmap时使用RGB_565配置(比默认ARGB_8888节省50%内存)
- 保存质量为85的JPEG文件
- 质量压缩方法(qualityCompress):
- 直接调整JPEG压缩质量(0-100范围,值越小压缩比越高)
- 不改变图片尺寸,仅降低文件质量
----- 执行流程 -----
- 原始截图保存
- 存储路径:/sdcard/original.jpg
- 输出原始分辨率(如1080x2340)和文件大小(如800KB)
- 执行两种压缩:
- 分辨率压缩到640px宽度(生成/sdcard/resized_640.jpg)
- 质量压缩到70%(生成/sdcard/quality_70.jpg)
- 压缩结果输出:
- 显示压缩后尺寸(注意此处代码存在计算错误,实际高度应为640*原图高宽比)
- 显示压缩后文件大小(单位KB)
----- 优化细节 -----
- 资源管理:
srcMat.release(); // 释放OpenCV矩阵内存
resultBitmap.recycle(); // 回收Bitmap资源
- 错误处理:
- 使用try-catch捕获异常
- 截图失败时自动退出脚本
----- 潜在问题 -----
- 尺寸计算误差: 当前代码中
img.getWidth()*(640/img.getWidth())
实际等于640,高度计算未正确实现,应改为:
"压缩后尺寸:" + targetWidth + "x" + targetHeight
- OpenCV初始化: 实际使用中可能需要先初始化OpenCV库:
if (!org.opencv.android.OpenCVLoader.initDebug()) {
printl("OpenCV初始化失败");
}
- 路径兼容性: 硬编码路径(/sdcard/)可能不适用于新版本Android,建议改用环境变量:
var externalDir = context.getExternalFilesDir(null).getAbsolutePath();
这个脚本适用于需要自动化处理手机截图的场景(如APP测试截图上传),通过两种压缩方式的组合使用,可以在清晰度和文件大小之间取得平衡。
另外:
有的要取手机点击或是拖动验证码的,就特别简单了,用软件的剪切图片功能。有的客户想实现把截的图片分辨率是 720*345,变成378*314 ,实际就是裁剪验证码图片的意思。
http://bbs.niubt.cn/static/image/common/codebg.gif"); color: rgb(102, 102, 102); zoom: 1; border-color: rgb(236, 234, 234); font-family: Tahoma, "Microsoft Yahei", Simsun;">
var img = screen.screenShotFull();
var url = img.cutImagePercent(0, 0.2, 1, 0.62);
printl(url);