博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vue实现PC端调用摄像头拍照人脸录入、移动端调用手机前置摄像头人脸录入、及图片旋转矫正、压缩上传base64格式/文件格式...
阅读量:6670 次
发布时间:2019-06-25

本文共 4831 字,大约阅读时间需要 16 分钟。

进入正题

1. PC端调用摄像头拍照上传base64格式到后台,这个没什么花里胡哨的骚操作,直接看代码 (canvas + video)

2. 移动端调用手机前置摄像头人脸录入、及图片旋转矫正、压缩上传base64格式/文件流格式;移动端幺蛾子就多了,比如部分手机打开的不是前置摄像头,部分手机拍照图片旋转了,高清手机拍的图片非常大........

介绍: 1. 通过input 开启手机前置摄像头  accept="image/*" 为开启摄像头  capture="user" 为开启前置摄像头 (微信公众号的话可以微信jssdk,但它不支持前置摄像头,默认后置,所以没用)

    2. 通过 exif.js 判断旋转了多少度在通过canvas矫正

            3. 图片太大或超过规定尺寸则通过canvas压缩

 HTML 部分:

 JS 部分: 接口使用的Vuex调用   可忽略  

// 压缩图片 and 旋转角度纠正    compressImage (event) {      let _this = this      let file = event.target.files[0]      let fileReader = new FileReader()      let img = new Image()      let imgWidth = ''      let imgHeight = ''      // 旋转角度      let Orientation = null      // 缩放图片需要的canvas      let canvas = document.createElement('canvas')      let ctx = canvas.getContext('2d')// 图片大小  大于2MB 则压缩      const isLt2MB = file.size < 2097152      // 通过 EXIF 获取旋转角度 1 为正常  3 为 180°  6 顺时针90°  9 为 逆时针90°      EXIF.getData(file, function () {        EXIF.getAllTags(this)        Orientation = EXIF.getTag(this, 'Orientation')      })      // 文件读取 成功执行      fileReader.onload = function (ev) {        // 文件base64化,以便获知图片原始尺寸        img.src = ev.target.result      }      // 读取文件      fileReader.readAsDataURL(file)      // base64地址图片加载完毕后      img.onload = function () {        imgWidth = img.width        imgHeight = img.height        canvas.width = img.width        canvas.height = img.height        // 目标尺寸        let targetWidth = imgWidth        let targetHeight = imgHeight        // 不需要压缩 不需要做旋转处理        if (isLt2MB && imgWidth < 960 && imgHeight < 960 && !Orientation) return _this.XMLHttpRequest(file)        if (isLt2MB && imgWidth < 960 && imgHeight < 960 && +Orientation === 1) return _this.XMLHttpRequest(file)        // 大于2MB 、img宽高 > 960 则进行压缩        if (!isLt2MB || imgWidth >= 960 || imgHeight >= 960) {          // 最大尺寸          let maxWidth = 850          let maxHeight = 850          // 图片尺寸超过 960 X 960 的限制          if (imgWidth > maxWidth || imgHeight > maxHeight) {            if (imgWidth / imgHeight > maxWidth / maxHeight) {              // 更宽,按照宽度限定尺寸              targetWidth = maxWidth              targetHeight = Math.round(maxWidth * (imgHeight / imgWidth))            } else {              targetHeight = maxHeight              targetWidth = Math.round(maxHeight * (imgWidth / imgHeight))            }          }          // canvas对图片进行缩放          canvas.width = targetWidth          canvas.height = targetHeight          // 图片大小超过 2Mb 但未旋转  则只需要进行图片压缩          if (!Orientation || +Orientation === 1) {            ctx.drawImage(img, 0, 0, targetWidth, targetHeight)          }        }        // 拍照旋转 需矫正图片        if (Orientation && +Orientation !== 1) {          switch (+Orientation) {            case 6:     // 旋转90度              canvas.width = targetHeight              canvas.height = targetWidth              ctx.rotate(Math.PI / 2)              // 图片渲染              ctx.drawImage(img, 0, -targetHeight, targetWidth, targetHeight)              break            case 3:     // 旋转180度              ctx.rotate(Math.PI)              // 图片渲染              ctx.drawImage(img, -targetWidth, -targetHeight, targetWidth, targetHeight)              break            case 8:     // 旋转-90度              canvas.width = targetHeight              canvas.height = targetWidth              ctx.rotate(3 * Math.PI / 2)              // 图片渲染              ctx.drawImage(img, -targetWidth, 0, targetWidth, targetHeight)              break          }        }        // base64 格式   我这是vuex 形式 重点是 canvas.toDataURL('image/jpeg', 1)        // _this.$store.commit('SAVE_FACE_IMAGE_BASE64', canvas.toDataURL('image/jpeg', 1))      // 调用接口上传        // _this.upAppUserFaceByBase64()        // 通过文件流格式上传      canvas.toBlob(function (blob) {          _this.XMLHttpRequest(blob)        }, 'image/jpeg', 1)      }    },    // 上传base64方式    upAppUserFaceByBase64 () {      this.$store.dispatch('upAppUserFaceByBase64', {        baseFace: this.$store.state.faceImageBase64      }).then(res => {        // 上传成功      }).catch(err => {
console.log(err) }) }, // 上传 XMLHttpRequest (params) { // 图片ajax上传     let action = '后台接口地址' let xhr = new XMLHttpRequest()     let formData = new FormData() formData.delete('multipartFile') formData.append('multipartFile', params) // 文件上传成功 xhr.onprogress = this.updateProgress xhr.onerror = this.updateError // 开始上传 xhr.open('POST', action, true) xhr.send(formData) }, // 上传成功回调 updateProgress (res) {
// res 就是成功后的返回 }, // 上传失败回调 updateError (error) { console.log(error) },

结语; 业务代码删了导致有点乱了,有不懂或疑问之处欢迎留言;

 

转载于:https://www.cnblogs.com/ljx20180807/p/10839713.html

你可能感兴趣的文章
【剑道】步法(Ashi Sabaki)
查看>>
MyEclipse 启动 tomcat时错误处理
查看>>
Scrum 冲刺博客第六篇
查看>>
【windows8开发】javascript开发Metro风格App
查看>>
Ubuntu14.04 开启MySQL的remote access
查看>>
模型方案参数更改 对比栏入选模型方案 图表效果对比 已不在项目中使用
查看>>
PowerDesigner 15 进行 数据库反转到 数据库模型
查看>>
SpringBoot 热部署
查看>>
python学习第一天
查看>>
JS 二维数组
查看>>
黑盒测试----测试用例设计方法
查看>>
Spark-RDD 模型 以及运行原理
查看>>
chrome官方完整安装包
查看>>
linux重启和关闭系统命令
查看>>
联网成功到更新本地时钟的时间差
查看>>
Android Gradle 引用本地 AAR 的几种方式
查看>>
ue4 c++学习推荐
查看>>
《团队-科学计算器-最终程序》
查看>>
李培根报告有感
查看>>
第八课: 电流电阻率和欧姆定律
查看>>