AiWROK软件里的OpenCV图片分辨率压缩和质量压缩

78

主题

190

回帖

861

积分

管理员

积分
861
// 导入必要的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();

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Segoe UI"; font-variant-ligatures: none; --link-color: var(--yq-text-link); color: rgb(38, 38, 38); font-size: 15px;">主要包含两种压缩方式:分辨率压缩和质量压缩。以下是代码的详细解释:
----- 基础准备 -----
1类库导入:
导入Android图形类(Bitmap)、文件操作类
导入OpenCV核心库和图像处理类
使用屏幕截图需要Auto.js的screen对象
2全屏截图:

----- 核心方法 -----
1分辨率压缩方法(resizeCompress):
按比例缩小尺寸:保持宽高比计算目标高度
使用OpenCV的INTER_AREA算法(适合缩小图像的插值算法)
转换Bitmap时使用RGB_565配置(比默认ARGB_8888节省50%内存)
保存质量为85的JPEG文件
2质量压缩方法(qualityCompress):
直接调整JPEG压缩质量(0-100范围,值越小压缩比越高)
不改变图片尺寸,仅降低文件质量
----- 执行流程 -----
1原始截图保存
存储路径:/sdcard/original.jpg
输出原始分辨率(如1080x2340)和文件大小(如800KB)
2执行两种压缩:
分辨率压缩到640px宽度(生成/sdcard/resized_640.jpg)
质量压缩到70%(生成/sdcard/quality_70.jpg)
3压缩结果输出:
显示压缩后尺寸(注意此处代码存在计算错误,实际高度应为640*原图高宽比)
显示压缩后文件大小(单位KB)
----- 优化细节 -----
1资源管理:

2错误处理:
使用try-catch捕获异常
截图失败时自动退出脚本
----- 潜在问题 -----
1尺寸计算误差: 当前代码中ingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Segoe UI"; padding-right: 4px; padding-left: 4px; margin: 1px 3px; line-height: 1.1; word-break: break-all;">img.getWidth()*(640/img.getWidth())实际等于640,高度计算未正确实现,应改为:

2OpenCV初始化: 实际使用中可能需要先初始化OpenCV库:

3路径兼容性: 硬编码路径(/sdcard/)可能不适用于新版本Android,建议改用环境变量:

这个脚本适用于需要自动化处理手机截图的场景(如APP测试截图上传),通过两种压缩方式的组合使用,可以在清晰度和文件大小之间取得平衡。
另外:
有的要取手机点击或是拖动验证码的,就特别简单了,用软件的剪切图片功能。有的客户想实现把截的图片分辨率是 720*345,变成378*314 ,实际就是裁剪验证码图片的意思。
3.png
请在下图依次点击
网O三B-口XK
文件..
按铃
减温
更多
加量

全屏截图,然后把验证码裁剪截图出来
4.png
代码是:
var img = screen.screenShotFull();

var url = img.cutImagePercent(0, 0.2, 1, 0.62);
printl(url);

举报 回复