// 导入必要的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();
主要包含两种压缩方式:分辨率压缩和质量压缩。以下是代码的详细解释:
----- 基础准备 -----
var img = screen.screenShotFull(); // 获取全屏截图
img.save(originalPath); // 保存原始图片
----- 核心方法 -----
----- 执行流程 -----
----- 优化细节 -----
srcMat.release(); // 释放OpenCV矩阵内存
resultBitmap.recycle(); // 回收Bitmap资源
----- 潜在问题 -----
img.getWidth()*(640/img.getWidth())
实际等于640,高度计算未正确实现,应改为:"压缩后尺寸:" + targetWidth + "x" + targetHeight
if (!org.opencv.android.OpenCVLoader.initDebug()) {
printl("OpenCV初始化失败");
}
var externalDir = context.getExternalFilesDir(null).getAbsolutePath();
这个脚本适用于需要自动化处理手机截图的场景(如APP测试截图上传),通过两种压缩方式的组合使用,可以在清晰度和文件大小之间取得平衡。
另外:
有的要取手机点击或是拖动验证码的,就特别简单了,用软件的剪切图片功能。有的客户想实现把截的图片分辨率是 720*345,变成378*314 ,实际就是裁剪验证码图片的意思。
全屏截图,然后把验证码裁剪截图出来
var img = screen.screenShotFull();
var url = img.cutImagePercent(0, 0.2, 1, 0.62);
printl(url);
欢迎光临 B2B网络软件 (http://bbs.niubt.cn/) | Powered by Discuz! X3.2 |