function 截图并上传() {
截图权限()
base64String = images.toBase64(captureScreen(), "jpg", 0.01);
log(base64String)
aaa=http.post("http://192.168.0.116:8080/upload", base64String, {})
log(aaa)
} 为什么截图出来很大

造梦 · 2 小时前

回答

Hamibot AI
1
· 2 小时前

截图文件过大通常由以下几个原因导致:

  1. 屏幕分辨率高:现代手机屏幕分辨率较高(如 1080P、2K),像素点多,原始数据量大。
  2. Base64 编码膨胀:Base64 编码会将二进制图片数据转换为文本,体积会比原二进制文件增大约 33%。
  3. 压缩质量参数images.toBase64 的质量参数范围通常是 0-100 的整数。传入 0.01 可能被识别为 0 或 1,虽然质量极低,但如果分辨率未降低,体积依然可能较大。

优化方案

为了减小截图体积,建议采取以下措施:

  1. 缩放图片:使用 images.resize() 将截图尺寸缩小(例如缩小到宽 500 像素),这是减小体积最有效的方法。
  2. 截取区域:如果只需要屏幕部分内容,使用 images.clip() 截取特定区域。
  3. 调整压缩质量:将质量参数设置为合理的整数(如 50-80),在保证清晰度的同时控制大小。

优化后的代码示例

以下代码展示了如何缩小图片尺寸后再转换为 Base64 并上传,同时修正了变量声明和网络请求的处理方式,确保兼容 Hamibot 的 JavaScript 引擎。

// 文档地址 https://docs.hamibot.com/
function 截图并上传 () {
  截图权限 ();
  // 截取屏幕
  var img = captureScreen();
  // 将图片宽度缩放至 500 像素,高度自动按比例调整,大幅减小体积
  var smallImg = images.resize(img, [500, 0]);
  // 转换为 Base64,质量设置为 50 (0-100)
  var base64String = images.toBase64(smallImg, "jpg", 50);
  log("Base64 长度:" + base64String.length);
  
  // 发送请求,建议设置 Content-Type 头
  var aaa = http.post("http://192.168.0.116:8080/upload", base64String, {
    headers: {
      "Content-Type": "text/plain"
    }
  });
  
  // 打印响应内容
  if (aaa.statusCode == 200) {
    log("上传成功:" + aaa.body.string());
  } else {
    log("上传失败:" + aaa.statusCode);
  }
  
  // 回收图片内存
  img.recycle();
  smallImg.recycle();
}

function 截图权限 () {
  auto.waitFor();
  if (!requestScreenCapture()) {
    toastLog('没有授予 Hamibot 屏幕截图权限');
    hamibot.exit();
  }
  sleep(1000);
}

注意事项

  1. 内存回收:使用 captureScreen() 生成的图片对象占用内存,使用完毕后建议调用 recycle() 方法回收,避免内存溢出。
  2. 网络权限:确保 Hamibot 应用已获取网络权限,且目标服务器地址可访问。
  3. 兼容性:代码中使用 var 声明变量,避免使用箭头函数,以兼容 Rhino 1.7.15 引擎。
  4. 质量参数images.toBase64 的第三个参数建议传入 0 到 100 之间的整数,小数可能导致不可预期的行为。

通过缩放图片尺寸,通常可以将 Base64 字符串长度控制在几十 KB 以内,适合网络传输。

ℹ️ 本回答由 AI 生成,内容仅供参考