自动发帖软件
标题:
安卓脚本示例实时截图判断页面变化
[打印本页]
作者:
发帖软件
时间:
4 小时前
标题:
安卓脚本示例实时截图判断页面变化
安卓脚本示例实时截图判断页面变化
2.png
(1016.49 KB, 下载次数: 0)
4 小时前
上传
3.png
(1.04 MB, 下载次数: 0)
4 小时前
上传
// 实时截图判断页面变化示例
// 技术交流QQ群711841924群一,苹果内测群,528816639
// 采用全屏高采样率像素对比,间隔5秒检测
/**
* 截取当前屏幕并保存为Mat对象
* @returns {Object} Mat对象,失败返回null
*/
function captureScreen() {
try {
// 获取屏幕尺寸
var screenWidth = 1080;
var screenHeight = 1920;
if (typeof screen !== 'undefined') {
if (typeof screen.getScreenWidth === 'function') {
screenWidth = screen.getScreenWidth();
screenHeight = screen.getScreenHeight();
}
}
printl("截取屏幕: " + screenWidth + "x" + screenHeight);
var screenshot = screen.screenShot(screenWidth, screenHeight, 100);
return screenshot.getMat();
} catch (e) {
printl("截图失败: " + String(e));
return null;
}
}
/**
* 比较两个Mat对象的相似度(通过像素点采样)
* @param {Object} mat1 - 第一个Mat对象
* @param {Object} mat2 - 第二个Mat对象
* @param {number} sampleRate - 采样率(0-1),默认0.2表示采样20%的像素
* @returns {number} 相似度(0-1),1表示完全相同
*/
function compareMats(mat1, mat2, sampleRate) {
if (!mat1 || !mat2) {
printl("ERR: Mat对象为空,无法比较");
return 0;
}
try {
sampleRate = sampleRate || 0.2; // 提高默认采样率到20%
var width1 = mat1.width();
var height1 = mat1.height();
var width2 = mat2.width();
var height2 = mat2.height();
printl("图片1尺寸: " + width1 + "x" + height1);
printl("图片2尺寸: " + width2 + "x" + height2);
// 尺寸不同直接认为不同
if (width1 !== width2 || height1 !== height2) {
printl("⚠️ 图片尺寸不同,判定为页面已变化");
return 0;
}
// 计算采样步长
var stepX = Math.floor(1 / sampleRate);
var stepY = Math.floor(1 / sampleRate);
var totalPixels = 0;
var samePixels = 0;
var changedPixels = 0;
// 采样比较像素点
for (var y = 0; y < height1; y += stepY) {
for (var x = 0; x < width1; x += stepX) {
try {
var pixel1 = mat1.get(y, x);
var pixel2 = mat2.get(y, x);
if (pixel1 && pixel2) {
totalPixels++;
// 比较RGB值(降低容差,提高灵敏度)
var diff = Math.abs(pixel1[0] - pixel2[0]) +
Math.abs(pixel1[1] - pixel2[1]) +
Math.abs(pixel1[2] - pixel2[2]);
// 降低阈值从30到10,更灵敏
if (diff < 10) {
samePixels++;
} else {
changedPixels++;
}
}
} catch (e) {
// 忽略单个像素读取错误
}
}
}
if (totalPixels === 0) {
printl("ERR: 没有可比较的像素点");
return 0;
}
var similarity = samePixels / totalPixels;
var changeRate = changedPixels / totalPixels;
printl("采样像素总数: " + totalPixels);
printl("相似像素数: " + samePixels);
printl("变化像素数: " + changedPixels);
printl("变化率: " + (changeRate * 100).toFixed(2) + "%");
printl("相似度: " + (similarity * 100).toFixed(2) + "%");
return similarity;
} catch (e) {
printl("ERR: 比较Mat对象错误: " + String(e));
return 0;
}
}
/**
* 基础页面变化检测 - 通过两次截图对比
* @param {number} interval - 两次截图间隔时间(秒)
* @param {number} threshold - 相似度阈值(0-1),低于此值认为页面变化,默认0.90(更敏感)
* @returns {boolean} 页面是否发生变化(true=变化,false=未变化)
*/
function isPageChangedByScreenshot(interval, threshold) {
printl("=== 开始截图对比页面变化检测 ===");
printl("截图间隔: " + interval + "秒");
printl("相似度阈值: " + (threshold * 100).toFixed(1) + "%");
printl("💡 提示: 请在" + interval + "秒内切换页面或滚动屏幕");
try {
// 第一次截图
printl("\n📸 进行第1次截图...");
var mat1 = captureScreen();
if (!mat1) {
printl("ERR: 第1次截图失败");
return false;
}
printl("✅ 第1次截图成功");
// 等待指定时间
printl("\n⏰ 等待 " + interval + " 秒...");
printl("👉 请在此期间切换页面、滚动屏幕或改变界面内容");
sleep.second(interval);
// 第二次截图
printl("\n📸 进行第2次截图...");
var mat2 = captureScreen();
if (!mat2) {
printl("ERR: 第2次截图失败");
mat1 = null; // 释放资源
return false;
}
printl("✅ 第2次截图成功");
// 比较两次截图
printl("\n🔍 开始比较两次截图...");
var similarity = compareMats(mat1, mat2, 0.2); // 提高采样率到20%
// 释放Mat资源
mat1 = null;
mat2 = null;
// 判断是否变化(降低阈值到0.90,更敏感)
threshold = threshold || 0.90;
var changed = (similarity < threshold);
printl("\n=== 检测结果 ===");
printl("相似度: " + (similarity * 100).toFixed(2) + "%");
printl("阈值: " + (threshold * 100).toFixed(1) + "%");
if (changed) {
printl("✅✅✅ 结论: 页面已变化!检测到 " + ((1 - similarity) * 100).toFixed(2) + "% 的差异");
} else {
printl("⭕ 结论: 页面未变化(差异太小,可能需要更大改动)");
}
return changed;
} catch (e) {
printl("ERR: 截图对比页面变化检测错误: " + String(e));
return false;
}
}
/**
* 演示页面变化检测方法
*/
function demonstratePageChangeDetection() {
printl("=== AIWROK 实时截图页面变化检测(最准确版)===");
// 安全获取APP版本
try {
if (typeof app !== 'undefined' && app && typeof app.version !== 'undefined') {
printl("APP版本: " + app.version);
} else {
printl("APP版本: 未知");
}
} catch (e) {
printl("获取APP版本失败: " + String(e));
}
// 获取屏幕尺寸
var screenWidth = 1080;
var screenHeight = 1920;
try {
if (typeof screen !== 'undefined' && screen) {
if (typeof screen.getScreenWidth === 'function') {
screenWidth = screen.getScreenWidth();
screenHeight = screen.getScreenHeight();
}
}
} catch (e) {
printl("获取屏幕尺寸失败,使用默认值: " + String(e));
}
printl("设备分辨率: " + screenWidth + "x" + screenHeight);
printl("\n📌 检测方法: 全屏高采样率像素对比");
printl("📌 检测间隔: 5秒");
printl("📌 灵敏度: 高(采样率25%,颜色阈值10,相似度阈值90%)");
// 执行页面变化检测
printl("\n=== 开始页面变化检测 ===");
printl("⚠️⚠️⚠️ 重要提示 ⚠️⚠️⚠️");
printl("在接下来的5秒内,请务必:");
printl(" 1. 切换到另一个页面/应用");
printl(" 2. 或者大幅滚动当前页面");
printl(" 3. 或者弹出对话框/菜单");
printl("否则将检测不到变化!");
var changed = isPageChangedByScreenshot(5, 0.90);
printl("\n=== 最终检测结果 ===");
if (changed) {
printl("✅✅✅ 页面已变化!检测成功!");
} else {
printl("⭕ 页面未变化");
printl("💡 如果确实有变化但未检测到,请检查:");
printl(" 1. 是否在5秒内进行了明显的页面切换");
printl(" 2. 变化幅度是否足够大");
printl(" 3. 可以尝试降低阈值,如: isPageChangedByScreenshot(5, 0.85)");
}
printl("\n=== 检测完成 ===");
}
/**
* 运行页面变化检测示例
*/
function runPageChangeDetectionExample() {
printl("开始执行实时截图页面变化检测示例");
printl("⚠️ 本示例完全基于实时截图,不需要任何CV文件");
printl("⚠️ 采用最准确的全屏高采样率对比方法");
printl("⚠️ 检测间隔: 5秒\n");
// 演示页面变化检测
demonstratePageChangeDetection();
printl("\n页面变化检测示例执行完毕");
}
// 运行示例
runPageChangeDetectionExample();
复制代码
欢迎光临 自动发帖软件 (http://www.fatiegongju.com/)
Powered by Discuz! X3.2