|
// 导入必要的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 ,实际就是裁剪验证码图片的意思。
请在下图依次点击 网O三B-口XK 刀 金 文件.. 按铃 减温 更多 加量 用
全屏截图,然后把验证码裁剪截图出来 代码是:var img = screen.screenShotFull();
var url = img.cutImagePercent(0, 0.2, 1, 0.62); printl(url);
|
|