当前位置: 首页 > news >正文

微信小程序camera相机帧转图片base64

适用于图像实时识别,形状识别,人脸识别等场景

相机组件

<camera class="camera-view" device-position="back" flash="off" binderror="onCameraError" bindinitdone="onCameraInit" frame-size="small"><!-- 扫描框 --><view class="scan-frame"></view></camera>

初始化相机

   onCameraInit() {console.log('相机初始化完成');// 创建相机上下文this.cameraContext = wx.createCameraContext();// 获取系统信息判断平台const systemInfo = wx.getSystemInfoSync();const isIOS = systemInfo.platform === 'ios';let lastTime = 0;const interval = 3000; // 每3秒取一帧try {this.frameListener = this.cameraContext.onCameraFrame((frame) => {const now = Date.now();if (now - lastTime < interval) return; // 跳过多余帧lastTime = now;if (!frame || !frame.data || frame.data.byteLength === 0) {console.warn('帧数据为空或无效');return;}console.log('取到一帧', frame.width, frame.height, frame.data.byteLength);// 转成图片 base64this.frameToBase64(frame).then((base64: string) => {// 调用识别 APIthis.recognizeFrameData(base64, frame.width, frame.height);}).catch((error: any) => {console.error('frameToBase64 转换失败:', error);});});// iOS 使用 worker,Android 不使用if (isIOS) {try {this.worker = wx.createWorker('workers/cameraWorker.js', {useExperimentalWorker: true});this.frameListener.start({ worker: this.worker });} catch (error) {console.error('创建 Worker 失败,使用普通模式:', error);this.frameListener.start();}} else {this.frameListener.start();}console.log('相机帧监听器已启动');} catch (error) {console.error('启动相机帧监听失败:', error);}},

注意ios要使用workers

相关代码

// workers/cameraWorker.js
setInterval(() => {try {const frameData = worker.getCameraFrameData(); // ArrayBufferif (frameData.byteLength === 0) return;// base64 转换const base64 = wx.arrayBufferToBase64(frameData);console.log('iOS 帧 base64 长度', base64.length);// 可以 postMessage 给主线程做处理worker.postMessage({ base64 });} catch (err) {console.error(err);}
}, 1000); // 每秒处理一帧

这里直接获取的帧需要转换成图片base64,为什么要转?

小程序相机每一帧给的是 原始 RGBA 像素数据,并不能直接使用,而是需要转换。
目前的方案是创建一个canvas将图片像素图绘制上去,然后再把 canvas 内容 转成 Base64 格式的 JPEG。

   frameToBase64(frame: any): Promise<string> {return new Promise((resolve, reject) => {try {// 创建离屏 canvasconst canvas = wx.createOffscreenCanvas({ type: '2d',width: frame.width, height: frame.height });const ctx = canvas.getContext('2d');if (!ctx) {reject(new Error('Failed to get canvas context'));return;}// 创建 ImageData 对象const imageData = ctx.createImageData(frame.width, frame.height);// 将帧数据复制到 ImageDataconst data = new Uint8Array(frame.data);imageData.data.set(data);// 将 ImageData 绘制到 canvasctx.putImageData(imageData, 0, 0);// 转为 base64 - 使用同步方式try {const base64 = canvas.toDataURL({type: 'image/jpeg',quality: 0.8});resolve(base64);} catch (e) {reject(e);}} catch (error) {reject(error);}});},
http://www.dtcms.com/a/581104.html

相关文章:

  • Agentic AI基础设施实践经验系列(四):MCP服务器从本地到云端的部署演进
  • Linux系统性基础学习笔记
  • DDR5 DFE(Decision Feedback Equalizer)
  • 前程无忧企业官方网站logo制作下载
  • 做网站难学吗wordpress替换百度站内搜索
  • STM32项目分享:基于单片机的空气质量检测系统设计
  • Windows 下PostgreSQL 数据库相关及 n8n .env文件的配置
  • jsp与网站开发期末试题做调查问卷赚钱哪个网站好
  • 在Centos7.9上安装配置zabbix proxy保姆级教程
  • 万能近似定理:神经网络「拟合万物」的理论基石
  • autofs自动挂载
  • 微软TinyTroupe“人格”模拟库:AI智能体市场调研-V3版本(五)
  • Opencv(九) : 图像旋转
  • 关键词解释:DAG 系统(Directed Acyclic Graph,有向无环图)
  • 【Linux】基础开发⼯具
  • 那些网站可以给产品做推广个人网站备案填写
  • 现代汽车确认遭遇数据泄露, 攻击者连续窃密9天获取用户驾照信息
  • 如何进行数据脱取
  • 将linux操作系统装入U盘20251107
  • 工业级部署指南:在西门子IOT2050(Debian 12)上搭建.NET 9.0环境与应用部署
  • ​AI大模型时代下的全栈技术架构:从深度学习到云原生部署实战
  • 手机版网站推荐银川网站建设哪家不错
  • maven与springBoot环境配置
  • C++程序设计实验(黑龙江大学)
  • 全屋智能家居定制小程序
  • 做电影网站需多大的空间网站建设意义
  • 拓普建站推广wordpress域名变更
  • 深度学习从入门到精通(一):深度学习的分类
  • 进制转换--c
  • opencv 学习: 05 像素操作