uniapp 小程序 身份证 和人脸视频拍摄

 使用前提:

    已经在微信公众平台的用户隐私协议,已经选择配置“摄像头,录像”等权限

开发背景:客户需要使用带有拍摄边框的摄像头 ,微信小程序的方法无法支持,使用camera修改

   身份证正反面:

<template><view :style="{ height: windowHeight + 'px' }"><cameramode="normal":device-position="devicePosition"flash="off":style="{ height: cameraHeight + 'px' }"><cover-view class="controls" style="width: 100%;height: 100%;"><!-- 国徽面 --><cover-imagev-show="!idcardFrontSide"class="w569-h828"src="/static/images/index/camera_module_side.png"/></cover-view><!-- 国徽面 --><cover-imagev-show="!idcardFrontSide"class="w569-h828"src="/static/images/index/camera_module_side.png"/></cover-view></camera><view class="bottom font-36-fff"><view class="wrap"><view class="back" @click="switchBtn">切换</view><view @click="takePhoto"><image class="w131-h131" src="/static/images/index/take_camera_btn_icon.png"></image></view><view @click="chooseImage">相册</view></view></view></view>
</template><script>export default {data() {return {cameraContext: {},windowHeight: '',cameraHeight: '',idcardFrontSide: true,devicePosition: 'front',};},onLoad(options) {if(uni.createCameraContext) {this.cameraContext = uni.createCameraContext()}else {// 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示uni.showModal({title: '提示',content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'})}},onShow() {const systemInfo = uni.getSystemInfoSync()this.windowHeight = systemInfo.windowHeightthis.cameraHeight = systemInfo.windowHeight - 80},methods: {// 拍照takePhoto() {uni.showLoading({title:'拍摄中'})this.cameraContext.takePhoto({quality: 'high',success: (res) => {uni.showToast({title:'拍照成功',icon: 'none',duration: 1200})},fail: (err) => {uni.showToast({title:'拍照失败,请检查系统是否授权',icon: 'none',duration: 1200})}})},// 从相册选取chooseImage() {uni.chooseImage({count: 1,sizeType: ['original', 'compressed'],sourceType: ['album'],success: (res) =>  {},fail: (err) => {}});},},// 切换摄像头switchBtn() {if(this.devicePosition === 'back') {this.devicePosition = 'front'} else {this.devicePosition = 'back'}},}
</script><style lang="less" scoped>.icon-w569-h828 {width: 569rpx;height: 828rpx;}.controls {position: relative;display: flex;align-items: center;justify-content: center;}.bottom {width: 100%;background-color: #000;.wrap {display: flex;align-items: center;justify-content: space-between;height: 80px;padding: 0 73rpx;}}.w569-h828 {width: 569rpx;height: 828rpx;}.w131-h131 {width: 131rpx;height: 131rpx;}.font-36-fff {font-size: 36rpx;color: #fff;}
</style>

人脸视频:

<template><!-- 第三步上传视频 --><view class="container background-color-474747" :style="{height: windowHeight + 'px'}"><view class="video-wrap wpercent-100 text-align" :style="{height: takeVideoHeight + 'px'}" v-if="tipShow"><view class="content-wrap"><view class="font-36-fff font-weight">请保持声音清晰,话术完整,露出五官</view><view class="padding-top-20 font-36-fff font-weight">不符合以上要求,需重新拍摄</view><view class="padding-top-35 padding-bottom-30 font-24-FF2323 font-weight">点击下方按钮开始拍摄</view><image class="tips-icon" src="/static/images/index/take_video_tips.png"></image><text class="know" @click="startCenterCountDown">知道了</text></view></view><view class="video-wrap wpercent-100" v-if="cameraShow" ><view v-if="!centerCountDownShow" class="number">{{ second }}s</view><camera mode="normal"class="wpercent-100":device-position="devicePosition" :style="{height: takeVideoHeight + 'px'}"><!-- 中间3,2,1倒计时 --><cover-view class="center-count-down-wrap" v-if="centerCountDownShow && centerCountDownValue != 4"><cover-view :class="centerCountDownValue === '开始' ? 'center-count-down-start' : 'center-count-down'">{{ centerCountDownValue }}</cover-view></cover-view><!-- 正式拍照人面框 --><cover-image v-if="!centerCountDownShow" class="controls" src="/static/images/index/take_video_back.png"/><cover-view class="font-36-fff font-weight absolute-one-font" v-if="!centerCountDownShow">正视镜头录制一段匀速朗读下方数字的视频</cover-view><cover-view class="font-36-fff font-weight absolute-two-font" v-if="!centerCountDownShow">1234</cover-view></camera></view><transition name="fade" :duration="{ enter: 500, leave: 800 }"><view class="bottom" v-if="showBottom"><view class="wrap"><view class="back" @click="backTwoStep"><image class="w55-h49" src="/static/images/index/back_before_icon.png"></image></view><!-- 开始倒计时 --><view class="take" @click="startCenterCountDown" v-if="tipShow">		<image class="w100-h100" src="/static/images/index/take_btn_icon.png"></image></view><!-- 点击就暂停 --><view class="take" @click="stopRecord" v-if="cameraShow && !centerCountDownShow"><image class="w100-h100" src="/static/images/index/take_btn_icon.png"></image></view><view class="switch" @click="switchCamera"><image class="w69-h56" src="/static/images/index/switch_camera_icon.png"></image></view></view></view></transition></view>
</template><script>export default {data() {return {windowHeight: '',takeVideoHeight: '',tipShow: true,showBottom: true,centerCountDownShow: false,cameraShow: false,centerCountDownValue: 4,cameraContext: {},devicePosition: 'front',second: 9,setTimer: '',};},onLoad() {if(uni.createCameraContext) {setTimeout(() => {this.cameraContext = uni.createCameraContext();},200)}else {// 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示uni.showModal({title: '提示',content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'})}},created() {const systemInfo = uni.getSystemInfoSync()this.windowHeight = systemInfo.windowHeightthis.computedHeight(80)},methods: {// 计算heightcomputedHeight (number) {const systemInfo = uni.getSystemInfoSync()this.takeVideoHeight = systemInfo.windowHeight - number},// 开始倒计时 3,2,1,开始startCenterCountDown () {this.computedHeight(0)this.setBoolean(false)this.centerCountDown()},// 中间倒计时centerCountDown() {let promise = new Promise((resolve, reject) => {let setTimer = setInterval(() => {if(this.centerCountDownValue === 1) {this.centerCountDownValue = '开始'resolve(setTimer)} else {this.centerCountDownValue = this.centerCountDownValue - 1}if(this.centerCountDownValue === 2) {			// this.cameraContext.startRecord 有延迟执行的问题,所以需要提前半秒执行setTimeout(() => {this.startRecord()}, 1200)}}, 1000)})promise.then((setTimer) => {clearInterval(setTimer)this.computedHeight(80)this.showBottom = truethis.centerCountDownShow = false})},// 开始录像startRecord() {this.cameraContext.startRecord({success: (res) => {this.rightTopCountDown()},fail: (err) => {uni.showToast({title: '录像失败,请重试',icon: 'none',duration: 1200})}})},// 右上角倒计时rightTopCountDown() {let promise = new Promise((resolve, reject) => {this.setTimer = setInterval(() => {this.second = this.second - 1if (this.second <= 0) {this.stopRecord()resolve(this.setTimer)}}, 1000)})promise.then((setTimer) => {clearInterval(setTimer)this.second = 9})},// 结束录像stopRecord() {uni.showToast({title: '结束录像,正在处理视频',icon: 'none',duration: 10000})clearInterval(this.setTimer)this.second = 9this.showBottom = falsethis.computedHeight(0)this.cameraContext.stopRecord({compressed: true,success: (res) => {uni.setStorageSync('taxCollectVideoPath',res.tempVideoPath)setTimeout(() => {this.stopRecordInitData()}, 500)},fail: (err) => {this.showBottom = truethis.computedHeight(80)uni.showToast({title: '操作失败,请重试',icon: 'none',duration: 1200})}})},// 切换摄像头switchCamera() {if(this.devicePosition === 'back') {this.devicePosition = 'front'} else {this.devicePosition = 'back'}},// 结束录像之后 初始数据stopRecordInitData () {this.computedHeight(80)this.setBoolean(true)this.centerCountDownValue = 4this.second = 9},// 设置 booleansetBoolean(boolean) {this.tipShow = booleanthis.showBottom = booleanthis.cameraShow = !booleanthis.centerCountDownShow = !boolean},}}
</script><style lang="less" scoped>.container {position: relative;.video-wrap {position: relative;.content-wrap {position: absolute;bottom: 150px;width: 100%;}.padding-bottom-40 {padding-bottom: 40rpx;}.tips-icon {position: absolute;left: 242rpx;width: 96rpx;height: 327rpx;}.know {position: relative;top: 210rpx;left: 155rpx;display: inline-block;width: 199rpx;height: 92rpx;line-height: 92rpx;text-align: center;border: 3rpx dashed #fff;border-radius: 5rpx;font-size: 48rpx;color: #fff;}.number {position: absolute;top: 15px;right: 20px;z-index: 11;color: #fff;width: 30px;height: 30px;background-color: #7a7a7a;border-radius: 50%;text-align: center;line-height: 30px;}.center-count-down-wrap {display: flex;justify-content: center;align-items: center;width: 100%;height: 100%;}.center-count-down {font-size: 330rpx;color: #fff;font-weight: bold;}.center-count-down-start {font-size: 220rpx;color: #fff;font-weight: bold;}}.controls {position: absolute;bottom: 200rpx;width: 100%;height: 753rpx;}.absolute-one-font {position: absolute;left: 4.5%;bottom: 130rpx;}.absolute-two-font {position: absolute;bottom: 30rpx;left: 44%;}.bottom {// position: fixed;// bottom: 0;width: 100%;background-color: #000;.wrap {display: flex;align-items: center;justify-content: space-between;height: 80px;padding: 0 73rpx;}}.fade-enter-active, .fade-leave-active {transition: opacity .5s;}.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {opacity: 0;}.background-color-474747 {background-color: #474747;}.wpercent-100 {width: 100%;}.text-align {text-align: center;}.font-36-fff {font-size: 36rpx;color: #fff;}.font-weight {font-weight: bold;}.w55-h49 {width: 55rpx;height: 49rpx;}.w100-h100 {width: 100rpx;height: 100rpx;}.w69-h56 {width: 69rpx;height: 56rpx;}}
</style>


效果图:

借鉴的是uniapp-components,记录一下如何使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/142019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【unity】网格描边方法

【unity】网格描边方法 介绍对模型四边网格的三种描边方法&#xff1a;包括纯Shader方法、创建网格方法和后处理方法。于增强场景中3D模型的轮廓&#xff0c;使其在视觉上更加突出和清晰。这种效果可以用于增强三维场景中的物体、角色或环境&#xff0c;使其在视觉上更加吸引人…

前端---CSS的盒模型

文章目录 什么是盒模型&#xff1f;设置边框设置内边距设置外边距块级元素水平居中 什么是盒模型&#xff1f; 页面上的每个HTML元素都是一个一个的“盒子”&#xff0c;这些盒子由&#xff1a;内容、内边距、边框、外边距组成。 我们可以和住的房子联系起来&#xff0c;更好…

Python实现WOA智能鲸鱼优化算法优化卷积神经网络回归模型(CNN回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提…

STM32H750之FreeRTOS学习--------(六)FreeRTOS的列表和列表项

六、FreeRTOS的列表和列表项 文章目录 六、FreeRTOS的列表和列表项列表相关结构体列表项相关结构体迷你列表项列表相关API函数介绍初始化列表vListInitialise()函数vListInitialiseItem()函数vListInsert()函数 vListInsertEnd()函数 uxListRemove() 列表就是一个双向链表&…

21.计算老师的工资

&#xff08;定义结构体数组存放教师的财务信息&#xff08;教工卡号&#xff0c;应发工资&#xff0c;个人所得税&#xff0c;实发工资&#xff09;具体要求如下从键盘输入5个教师的教工卡号&#xff0c;应发工资 计算每人的个人所得税&#xff08;应发工资10%&#xff09;&am…

Prometheus+Ansible+Consul实现服务发现

一、简介 1、Consul简介 Consul 是基于 GO 语言开发的开源工具&#xff0c;主要面向分布式&#xff0c;服务化的系统提供服务注册、服务发现和配置管理的功能。Consul 提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能。 在没有使用 consul 服…

C语言仅凭自学能到什么高度?

今日话题&#xff0c;C语言仅凭自学能到什么高度&#xff1f;学习C语言的决定我确实非常推荐&#xff0c;毕竟它是编程领域的“通用工具”&#xff0c;初学者可以尝试并在发现编程的乐趣后制定长期学习计划。至于能够达到何种高度&#xff0c;这实在无法准确回答。即使是经验丰…

ARM64 linux并发与同步之经典自旋锁

1.3 经典自旋锁 在实际项目中临界区数据有可能会修改一个数据结构或者链表中的数据&#xff0c;在整个过程中要保证原子性&#xff0c;才不会影响数据的有效性&#xff0c;这个过程使用原子变量不合适&#xff0c;需要使用锁机制来完成&#xff0c;自旋锁&#xff08;spinlock&…

Elasticsearch7 入门 进阶

1、全文检索 1.1、数据分类 按数据分类的话&#xff0c;主要可以分为以下三类&#xff1a; 结构化数据&#xff1a;固定格式、有限长度&#xff0c;比如mysql存的数据非结构化数据&#xff1a;不定长、无固定格式&#xff0c;比如邮件、Word文档、日志等半结构化数据&#xf…

【Opencv】cv::dnn::NMSBoxes()函数详解

本文通过原理和示例对cv::dnn::NMSBoxes&#xff08;&#xff09;进行解读&#xff0c;帮助大家理解和使用。 原理 cv::dnn::NMSBoxes是OpenCV库中的一个函数&#xff0c;用于在目标检测中处理多个预测框。在目标检测中&#xff0c;模型可能会为同一个物体生成多个预测框&…

传统企业数字化转型都要面临哪些挑战?_数据治理平台_光点科技

数字化转型已经成为传统企业发展的必经之路&#xff0c;但在这个过程中&#xff0c;企业往往会遭遇多方面的挑战。 1.文化和组织惯性 最大的挑战之一是企业文化和组织惯性的阻力。传统企业往往有着深厚的历史和根深蒂固的工作方式&#xff0c;员工和管理层可能对新的数字化工作…

海外媒体发稿:彭博社发稿宣传中,5种精准营销方式

在如今的信息发生爆炸时期&#xff0c;营销方式多种多样&#xff0c;但是充分体现精准营销并针对不同用户群体的需求并非易事。下面我们就根据彭博社发稿营销推广为例子&#xff0c;给大家介绍怎样根据不同用户人群方案策划5种精准营销方式。 1.界定总体目标用户人群在制订精准…

Spring IOC - Bean的生命周期之实例化

在Spring启动流程文章中讲到&#xff0c;容器的初始化是从refresh方法开始的&#xff0c;其在初始化的过程中会调用finishBeanFactoryInitialization方法。 而在该方法中则会调用DefaultListableBeanFactory#preInstantiateSingletons方法&#xff0c;该方法的核心作用是初始化…

【nlp】2.4 GRU模型

GRU模型 1 GRU介绍2 GRU的内部结构图2.1 GRU结构分析2.2 Bi-GRU介绍2.3 使用Pytorch构建GRU模型2.4 GRU优缺点3 RNN及其变体1 GRU介绍 GRU(Gated Recurrent Unit)也称门控循环单元结构, 它也是传统RNN的变体, 同LSTM一样能够有效捕捉长序列之间的语义关联, 缓解梯度消失或爆…

0基础学习VR全景平台篇第120篇:极坐标处理接缝 - PS教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 紧跟上节课&#xff0c;我们已经学会了怎么利用PS蒙版工具来对航拍全景图补天。但是在后续工作学习中&#xff0c;我们会遇到天空这部分存在部分接缝的问题&#xff0c;如图&…

使用Docker本地安装部署Drawio绘图工具并实现公网访问

目录 前言 1. 使用Docker本地部署Drawio 2. 安装cpolar内网穿透工具 3. 配置Draw.io公网访问地址 4. 公网远程访问Draw.io 前言 提到流程图&#xff0c;大家第一时间可能会想到Visio&#xff0c;不可否认&#xff0c;VIsio确实是功能强大&#xff0c;但是软件为收费&…

Zephyr-7B论文解析及全量训练、Lora训练

文章目录 一、Zephyr&#xff1a;Direct Distillation of LM Alignment1.1 开发经过1.1.1 Zephyr-7B-alpha1.1.2 Zephyr-7B-beta 1.2 摘要1.3 相关工作1.4 算法1.4.1 蒸馏监督微调&#xff08;dSFT&#xff09;1.4.2 基于偏好的AI反馈 (AIF&#xff09;1.4.3 直接蒸馏偏好优化&…

英伟达中国特供芯片是缩水版;华为 Mate60 Pro 国产零件价值占比 47%丨 RTE 开发者日报 Vol.84

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

数据分析的流程:CRISP-DM方法和SEMMA方法

CRISP-DM方法 SEMMA方法 角色与职责&#xff1a;EDIT数字化模型

VMware 虚拟机开启后黑屏问题的解决方式

很好&#xff0c;现在是vm 虚拟机节目的连续剧了 首先&#xff0c;我们安装好了&#xff0c;vm软件。 其次&#xff0c;我们在vm中创建了虚拟机。 再其次&#xff0c;我们解决了&#xff0c;开启虚拟机计算机自动重启的问题。 最后我们遇到了这个问题&#xff1a;虚拟机开启后整…