一: 前提

在做H5时,有时要实现拍照功能,这就要调取手机端的相机,当时,在网上搜了很多能实现的方式,最后还是用html5自带的 input标签,实现移动端调用手机摄像头。好了,话不多说,下面就是我实现的代码:

二:实现

(一):调用手机相机或相册

      <!--图片二--><label for="xFile2" style="padding-top:15px;" class=" cameraImg2" @click="removeImg2();"><span v-if="imgList2.length == ''" class="glyphicon-camera" ><p style="line-height:5px;"><label>图片二</label><!--调取相机--><input type="file" id="xFile2" capture="camera" multiple="multiple" accept="image/*" class="imgInp1" @change='onUpload2($event)'  style="position:absolute;clip:rect(0 0 0 0); width: 100%; height: 105px; top:0px;" v-if="judgeFan"></p></span></label>
复制代码

其中input标签type="file"的参数capture表示,可以捕获到系统默认的设备,比如:camera照相机;camcorder摄像机;microphone录音,accept表示,直接打开系统文件目录,multiple属性,表示可以支持多选。

(二): 获取图片同时压缩,然后传给后台

// 解决ios照片旋转问题//获取照片的拍摄方向getOrientation(file, callback){var reader = new FileReader();reader.onload = function(e) {var view = new DataView(e.target.result);if (view.getUint16(0, false) != 0xFFD8){return callback(-2);}var length = view.byteLength, offset = 2;while (offset < length) {var marker = view.getUint16(offset, false);offset += 2;if (marker == 0xFFE1) {if (view.getUint32(offset += 2, false) != 0x45786966){return callback(-1);}var little = view.getUint16(offset += 6, false) == 0x4949;offset += view.getUint32(offset + 4, little);var tags = view.getUint16(offset, little);offset += 2;for (var i = 0; i < tags; i++){if (view.getUint16(offset + (i * 12), little) == 0x0112)return callback(view.getUint16(offset + (i * 12) + 8, little));}}else if ((marker & 0xFF00) != 0xFF00){break;}else {offset += view.getUint16(offset, false);}}return callback(-1);};reader.readAsArrayBuffer(file);},/*
获取图片的事件
*/
onUpload(input) {var _this = this;if (_this.judgeZheng) {_this.judgeZheng = false;_this.hideImg2=true;/*imglist 是定义的一个存放图片的数组,来判断只能上传一张图片*/if (this.imgList.length >= 1) {$.alert("只能上传一张照片!");return;}if (input.target.files && input.target.files[0]) {if (window.FileReader) {var name = input.target.value.substring(input.target.value.lastIndexOf(".") + 1,input.target.value.lastIndexOf(".").length);var timeStamp = input.timeStamp;/*创建一个FileReader对象,用来获取文件*/var reader = new FileReader();reader.onload = function(e) {var objs = {url: e.target.result,name: name,timeStamp: timeStamp};ysImg(objs, function(objs) {_this.imgListzheng = objs.url;_this.img_file = input;_this.thumbnailUrl = objs.url;_this.img_data = objs.url;_this.img_name ='11.jpg';_this.timeStamp = objs.timeStamp;});function ysImg(objs, callback) {//设置压缩图片的最大高度var imgarr = [];var MAX_HEIGHT = 1000;//获取拍摄方向_this.getOrientation(input.target.files[0], function(orientation) {_this.orientation = orientation;});// 创建一个 Image 对象var image = new Image();image.src = objs.url;// 绑定 load 事件处理器,加载完成后执行image.onload = function() {// 获取 canvas DOM 对象var canvas = document.createElement("canvas");// 如果高度超标if (image.height > MAX_HEIGHT && image.height >= image.width) {// 宽度等比例缩放 *=image.width *= MAX_HEIGHT / image.height;image.height = MAX_HEIGHT;}//考录到用户上传的有可能是横屏图片同样过滤下宽度的图片。if (image.width > MAX_HEIGHT && image.width > image.height) {// 宽度等比例缩放 *=image.height *= MAX_HEIGHT / image.width;image.width = MAX_HEIGHT;}// 获取 canvas的 2d 画布对象,var ctx = canvas.getContext("2d");// canvas清屏,并设置为上面宽高ctx.clearRect(0, 0, canvas.width, canvas.height);// 重置canvas宽高canvas.width = image.width ;canvas.height = image.height ;//判断图片拍摄方向是否旋转了90度if(_this.orientation == 6){var x = canvas.width / 2;                //画布宽度的一半var y = canvas.height / 2;               //画布高度的一半ctx.clearRect(0,0, canvas.width, canvas.height);           //先清掉画布上的内容ctx.translate(x,y);                      //将绘图原点移到画布中点ctx.rotate( (Math.PI / 180) * 90 );      //旋转角度ctx.translate(-x,-y);                    //将画布原点移动ctx.drawImage(image, 0, 0, image.width, image.height);       //绘制图片}else{// 将图像绘制到canvas上ctx.drawImage(image, 0, 0, image.width, image.height);// !!! 注意,image 没有加入到 dom之中//        document.getElementById('img').src = canvas.toDataURL("image/png");}_this.blob = canvas.toDataURL("image/jpeg",0.5);if (objs.url.length <_this.blob.length) {objs.url = objs.url;} else {objs.url =_this.blob;}var arrName=_this.blob.split(",");var strName1=arrName[1];/* 将获取的图片资源通过接口上传到后台*/_this.API.post('/gateway/gateway',{fileContent:strName1,fileName:'11.jpg',fileType:"A01"}).then(function(res){if(res.code=="000000"){if(res.data.idCardNumber) {_this.noName=res.data.name;_this.noIdCardNumber=res.data.idCardNumber;if(_this.blob3) {_this.name=_this.noName;_this.idCardNumber =  _this.noIdCardNumber}} _this.imgList.push(_this.imgListzheng);}else{_this.imgList=[];_this.judgeZheng = true;   }})//将转换结果放在要上传的图片数组里callback(objs);};}};reader.onabort = function() {alert("上传中断");};reader.onerror = function() {alert("上传出错");};reader.readAsDataURL(input.target.files[0]);} else {alert("Not supported by your browser!");}}} else {}},
复制代码

亲测有用哟。如果对你有帮助,用你的小手帮忙点个赞哟。 ღ( ´・ᴗ・` )比心

H5移动端调取相机或相册相关推荐

  1. H5 移动端调取手机相机或相册

    H5 移动端调取手机相机或相册 1.html代码如下: <!--图片二--><label for="xFile2" style="padding-top ...

  2. h5调用安卓原生相机、相册、电话、录像,且兼容安卓系统8.0

    前言 安卓原生组件webview加载h5的URL,若要h5调用安卓原生相机和相册有效需要做以下操作. 测试机:魅蓝note2  系统5.1.1 华为荣耀畅玩7x  系统8.0.0 一.h5页面相关 方 ...

  3. h5 调起相机_H5移动端调用相机或相册

    一: 前提 在做H5时,有时要实现拍照功能,这就要调取手机端的相机,当时,在网上搜了很多能实现的方式,最后还是用html5自带的 input标签,实现移动端调用手机摄像头.好了,话不多说,下面就是我实 ...

  4. Vue 移动端调用相机和相册实现图片上传

    一.基础知识: 1.只调用手机相册 <input type="file" accept="image/*;" > 2.只调用手机相机拍照 <i ...

  5. html5plus请求打开相机权限,iOS与H5交互 询问相机、相册权限的问题

    问题背景: 某个H5页面中需要打开手机本地相册及照相机,用户选择某几张图片之后上传至服务器上.纯H5完成的话,当打开相机或者相册时,第一次会正常询问权限,但是如果用户点击了不允许之后,询问弹窗不再能弹 ...

  6. 记录webView接入h5界面时,调起相册、文件、相机无效的解决办法

    记录webView接入h5界面时,调起相册.文件.相机无效的解决办法. 在开发项目时,接入一个h5界面.使用webview时,发现界面显示正常,但是按钮不论怎么点都无效,但是m站和ios都正常.后来上 ...

  7. 调用移动端相机以及相册功能

    HTML5页面如何在手机端浏览器调用相机.相册功能 最近在做一个公司的保险信息处理系统项目,开发微信端浏览器访问的HTML5的页面,页面中有一个标签,iOS直接就支持吊起相机拍照或是相册选择,但and ...

  8. 移动端h5实现手机拍照上传图片,相册选择上传图片input type=file

    移动端h5实现手机拍照上传图片,相册选择上传图片input type=file 有不足或者不对的在下方留言,有不明白的也请在下方留言,虽然我不一定能看到,话不多说上代码,注释都写好了 <!doc ...

  9. 安卓WebView(H5)调用原生相机及相册

    在开始叙述正文之前笔者先声明一下应用场景:例如在网页上的即时通讯需要能拍照或者从图库选择图片来进行上传,此场景下就可以用到这篇文章的内容 正文 首先,如果你已经把相机以及访问文件夹的权限都加上了并且W ...

最新文章

  1. remotepath != null 与 !TextUtils.isEmpty(remotepath) 的区别
  2. JVM之常用基础参数详解
  3. Java转JSON串的几种方式
  4. WSSv3 Technical Articles_Windows SharePoint Services 3.0编码开发工具和技巧(Part 2 of 2)
  5. css绘画三角形,实现一些图形
  6. 开源关系型数据库架构
  7. 用Eclipse制作博客
  8. 方法:如何解决NetShareEnum返回ERROR_NO_UNICODE_TRANSLATION(1113)的问题
  9. 灰度到伪彩色的转换公式
  10. 计算机科学与技术专业大学四川省录取分数,四川人工智能专业大学分数线
  11. Java项目:基于java+ssm生鲜超市进销存管理系统--计算机毕业设计
  12. C++ | PaddleOCR GPU版使用步骤与测试时间对比(相对CPU)
  13. 猴子吃桃问题(三种方法解决)
  14. BioPython(一)
  15. 想当程序员,如何判断自己是否适合当前端程序员?
  16. ST MCU的国产替代
  17. Android画板,橡皮擦为黑色痕迹的问题
  18. 【2021-07-23】JS逆向之某乎x_zes_96
  19. Unity VR打包导致UI显示不正确的问题解决
  20. Virtualbox桥接无网络解决

热门文章

  1. matlab标点符号含义
  2. jQuery Treegrid自定义表头(全网独家)附带源码
  3. 对讲机使用过程中的常见故障及排除故障的解决方法
  4. 中老年女装洞察报告:2900亿的中老年女装生意|60加研究院
  5. plsql调试sql
  6. 用批处理来设置文件夹权限
  7. 计算机老师开场白试讲视频,教师面试试讲开场白
  8. python清晰度增强_3行代码Python搞定图片清晰度识别,原来我们看到的不一定是这样的...
  9. 宝来客:节日送礼年轻人更偏爱珠宝?
  10. 644HA温变的安装与调试