『从零开始学小程序』媒体组件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,最终渲染到了我们的文本控件上。

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

全部评论

相关推荐

一共一个小时,面试难度以及自己的回答算是最近的面试压力比较大的,实习问了30分钟,中间穿插八股。1.redis数据结构2.redis持久化机制3.mysql索引底层4.聚簇索引与非聚簇索引5.索引优化6.索引失效7.mysql执行一条sql8.那么多索引mysql怎么选(不会)9.tcp与udp区别10.tcp为什么可靠11.消息队列作用12.kafka怎么保证消息有序性13.mcp是什么?14.skills是什么?15.jvm内存分配与回收过程(我讲了从创建对象到判断垃圾对象到垃圾回收我全说了一遍,是这个吗?)16.fullgc触发机制17.tcp的拥塞控制流程(不会了)18.分布式事务解决方案,说了2pc,3pc,tcc。算法是反转双向链表,没有按格式输出,但是面试官没让继续写了,面完以为挂了,结果晚上秒过,看看复试什么情况吧。今天百度打电话准备发offer了,业务跟在手子的差不多,很垂,并且说不分日常暑期,只看表现,会有转正机会,但是考虑再三还是拒绝了,百度实习薪资确实有点低,title也不如之前了,但是面试的二位业务老师我很喜欢,对我的评价也不错,希望之后能有机会共事。从三月份到现在一共面了六家,面试次数总共是8场,情况如下:脉脉二面(无答复,默认挂)百度二面已oc美团一面过,下周一二面shein一面过直接HR面游族一面过直接HR面腾讯一面过等待约二面滴滴明天一面面试通过率还是蛮高的,但是大部分都是日常,感觉对我现在的加成不大,大概率不会去,不知道暑期会是什么情况呢唉,希望能有面试吧,继续加油。字节被无hc直接取消了,现在还没人捞,有没有字节HR救救我
不管什么都不想跳动了:本人美团百度快手都待过,建议肯定是直接留快手多一点产出后转正or直接冲字节腾讯暑期吧。一是快手从福利到基建都吊打另外两家。美团现在这个业务比较惨,本来毛利就很低,亏损严重,今年很可能要优化人力降低成本,去了别说日常,就算暑期后面都很可能被优化。百度其实实习生权限挺高的,可以接触到一些含金量高的项目,但是现在的风评不如之前了,薪资也不高。二是转正概率和薪资是跟产出挂钩的,你都在手子已经积累产出了,去其他家日常实习产出都是从0开始,肯定不可能有你在手子转正可能性大啊,现在日常压根没必要去,而且我有两个师弟都是在快手日常转正的,不用太担心,安心留在手子一边多做一点产出然后一边冲字节腾讯暑期,字节腾讯今年实习岗位非常多的,不如好好把握这个,加油。
查看18道真题和解析
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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