一: 前提

在做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. python 递归函数_连载|想用Python做自动化测试?递归函数
  2. 运用java语言提取数据库信息
  3. python垃圾回收 (GC) 机制
  4. CSS之Responsive设计和CSS3 Media Queries的结合
  5. django模型查询
  6. MongoDB怎么做性能测试,看看这篇大神总结
  7. 高级着色语言HLSL入门(1)
  8. 基于SSM的旅游信息平台
  9. java web 导出excel_javaweb导出excel表格
  10. Unity基础知识结构总结
  11. 天刀 服务器状态,12月11日服务器例行维护公告(已完成)
  12. IT创业项目-赚钱项目-网赚项目:月入2W+的视频号创业项目
  13. pencil平替笔哪个好用?好用的pencil平替笔推荐
  14. 联通托管服务器为什么打不开网页,为什么有些网页联通宽带打不开,移动4G能打开?...
  15. 什么是百度权重 百度指数词
  16. Element properties is not closed
  17. Windows下mysql5.7修改root密码
  18. 数据防泄密工作企业该如何开展
  19. leetcode 1277
  20. 整体认知主要依靠周边视觉而非中央视觉

热门文章

  1. 道or悼?三分钟看懂史上最逆天的区块链众筹项目The DAO
  2. 银行业国产数据库现状
  3. 【phpcms-v9】phpcms-v9中系统变量列表及目录结构列表
  4. [转载]点阵图(位图)与矢量图的区别
  5. 【办公类-19-04】办公中的思考——幼儿姓名笔画数统计(单字、全名字)
  6. 深度:人群、场景、信任感—中国中老年消费品市场三大机会解读
  7. [win7]360开启局域网ARP防火墙后重启蓝屏的解决
  8. 百度:抚顺县上马学校老师打学生!百度地震姜常宏就在那个学校求助?!!
  9. wordpress汉化技巧_保护WordPress网站安全的10个鲜为人知的技巧
  10. Linux-IO Target(LIO SCSI Target)介绍(二)