『从零开始学小程序』媒体组件camera组件

👨‍🎓作者简介:一位喜欢写作,计科专业的大三菜鸟

🏡个人主页:starry陆离 的个人主页

如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦

多媒体包括音频、视频和相机等,为了更好地在小程序中使用这些多媒体功能,微信官方也为开发者提供了一系列多媒体组件和API接口。多媒体组件如下所示:

  • video组件:视频组件
  • camera组件:相机组件
  • audio组件:音频组件
  • image组件:图片组件

1.简介

camera,相机组件。用于启动系统相机并拍摄照片,相关的API是 wx.createCameraContext。如果要启动扫描二维码功能,需用户授权scope.camera权限,并升级微信客户端至6.7.3及以上。

2.简单案例

首先我们来看看相机组件常见的两个属性,通过mode属性我们可以设置相机的应用模式,通过device-position属性可以设置摄像头朝向。

mode

string

normal

应用模式,只在初始化时有效,不能动态变更。取值为normal(相机模式)、scanCode(扫码模式)

device-position

string

back

摄像头朝向。取值为front(前置)、back(后置)

flash

string

auto

闪光灯,值为 auto , on, off,torch(常亮)

通过此三个属性我们来做一个拍照的小案例,要注意的是 同一页面只能插入一个 camera 组件

<!--pages/mycamera/mycamera.wxml-->
<view class="container">
  <view class="page-body">
    <view class="h1" style="text-align: center; font-size: large;">媒体组件camera的简单应用</view>
    <view class="demo-box">
      <view class="title">1.使用createCameraContext绑定相机并操作</view>
      <camera device-position="back" flash="off" style="width: 100%; height: 300px;"></camera>
      <view class="btn-area" style="text-align: center; margin: 10px;">
        <button type="primary" size="mini" bindtap="takePhoto">拍照</button>
      </view>
    </view>
    <view class="show-imageVideo">
      <view class="title">2.查看保存的照片和视频</view>
      <text>(1)照片路径</text>
      <image mode="aspectFill" src="{{src}}" wx:if="{{src}}"></image>
    </view>
  </view>
</view>


// pages/mycamera/mycamera.js
Page({
  // 拍照
  takePhoto() {
    const ctx = wx.createCameraContext()
    ctx.takePhoto({
      quality: 'high',
      success: (res) => {
        this.setData({
          src: res.tempImagePath
        })
      }
    })
  }
})

如果要调用前置摄像头,将device-position设置为front即可,我就不再做演示。

除了上面的三种属性,相机组件还有如下几种属性。

frame-size

string

medium

指定期望的相机帧数据尺寸。取值为small(小尺寸帧数据)、medium(中尺寸帧数据)、large(大尺寸帧数据)

bindstop

eventhandle

摄像头在非正常终止时触发,如退出后台等情况

binderror

eventhandle

用户不允许使用摄像头时触发

bindinitdone

eventhandle

相机初始化完成时触发,

e.detail = {maxZoom}

bindscancode

eventhandle

在扫码识别成功时触发,仅在 mode="scanCode" 时生效

3.CameraContext类方法

CameraContext 实例,可通过 wx.createCameraContext 获取。

CameraContext与页面内唯一的 camera组件绑定,操作对应的 camera组件。

onCameraFrame(onCameraFrameCallback callback)

获取 Camera 实时帧数据

takePhoto(Object object)

拍摄照片

setZoom(Object object)

设置缩放级别

startRecord(Object object)

开始录像

stopRecord(Object object)

结束录像

在上面的案例中我们其实已经使用了takePhoto(Object object)方法进行照片的拍摄。现在我们通过startRecord(Object object)stopRecord(Object object)方法来实现录像功能。

4.录像案例

takePhoto的使用相同,首先我们要通过 wx.createCameraContext 获取到CameraContext 实例,通过实例对象去操控这些方法。

// 开始录像
  startRecord(){
    const ctx = wx.createCameraContext()
    var that=this;
    ctx.startRecord({
      timeoutCallback(){that.ctx.stopRecord()},
      success: (res) => {console.log(res)}
    })
  },
  // 停止录像
  stopRecord(){
    const ctx = wx.createCameraContext()
    ctx.stopRecord({
      success: (res) => {
        console.log(res)
        this.setData({videoSrc:res.tempVideoPath})
      }
    })
  }

5.扫码模式

通过上面的两个案例,相信大家都明了相机组件的常见属性和CameraContext类方法。除了调用摄像头拍照、录像,我们生活中用的最多的可能就是扫码功能,那么我们来康康这个功能又如何实现。

首先哈,我们定义一个文本组件来存放扫码后得到的内容。一个按钮来触发扫码功能。

<text  style="margin-top: 30px; border: 5px solid #11eeff;" >{{scanCode}}</text>
<button style="margin-top: 30px;" bindtap="scanCodeEvent" type="primary">扫码</button>

我们再来看看js文件怎么写,定义了一个空字符串数据scanCode,用来接收扫码得到的内容,并通过Mustache语法(类似Vue的插值语法)将数据绑定到文本组件上。

Page({
  data: {
    scanCode:''
  },
  scanCodeEvent:function(options){
    var that = this;
    wx.scanCode({
      onlyFromCamera: true,// 只允许从相机扫码
      success(res){
        console.log("扫码成功:"+JSON.stringify(res))
 
        // 扫码成功后  在此处理接下来的逻辑
        that.setData({
          scanCode: res.result
        })
      }
    })
  }
})

扫码成功后返回的内容有:

  • res.result:所扫码的内容;
  • res.scanType:所扫码的类型;
  • res.charSet:所扫码的字符集;
  • res.path:当所扫的码为当前小程序二维码时,会返回此字段,内容为二维码携带的 path;
  • res.rawData:原始数据,base64编码。

这里我们主要用到的就是res.result:所扫码的内容;将其赋值给scanCode,最终渲染到了我们的文本控件上。

可以看到我扫描校园卡,成功将二维码的内容渲染到了文本控件上。

全部评论

相关推荐

01-01 10:21
门头沟学院 Java
谁懂啊!我实习遇到的公司,真的太把实习生当正式员工使唤了,刚入职没几天,连项目代码结构都没摸透,就被安排写项目了!一开始都是些接口对接、数据格式转换的基础活,听起来不难,但架不住我对项目的业务逻辑、代码规范一窍不通。对着前辈丢过来的需求文档,我一边查代码注释,一边翻技术文档,磕磕绊绊写完功能,也只知道&nbsp;“这么写能跑通”,根本不明白&nbsp;“为什么要这么设计”,妥妥的知其然不知其所以然。本以为这种基础活会干很久,结果没过多久,领导直接甩给我一个小功能的开发方案,让我负责从方案落地到功能对接、测试上线的全流程。当时我直接懵了,硬着头皮啃需求、画流程图、写核心代码,遇到不懂的就逮着前辈狂问,加班加点成了家常便饭。更没想到的是,后面居然让我独立负责一个模块的开发,还要做性能优化。从数据库索引调整,到接口响应速度提升,每一步都得自己琢磨、自己验证。那段时间真的累到飞起,每天下班脑子都是懵的尤其是发版的时候,我比谁都紧张,盯着监控屏大气不敢喘,生怕自己写的代码出&nbsp;bug&nbsp;导致系统崩溃。一旦出问题,就得立刻配合运维回滚版本,然后自己留下来加班排查修复,常常整栋办公楼只剩我一个人的工位亮着灯。每天加班到深夜,工作量比正式员工还饱和,我不止一次对着电脑发呆:我到底是来实习的,还是来打工的?虽然这段经历确实让我的技术能力突飞猛进,但那种被推着往前走的疲惫感,直到现在想起来都觉得累。
Toxic丶爵:感觉是好事,强度高就能学到更多
大家实习都在做什么?
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务