一: 前提

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

二:实现

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

图片二

其中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 调起相机_H5移动端调用相机或相册相关推荐

  1. 安卓端调用相机拍照返回并预览---清晰原图

    安卓端调用相机拍照并返回预览图片 一.demo预览 二.xml代码和activity简单代码描述. 三.老规矩再来写几个转换工具方法 继之前写的安卓调用相机拍照返回预览,如果对于画质要求不高的话可以考 ...

  2. android相机拍照代码,Android 调用相机拍照,适配到Android 10

    今天写的博客是关于Android调用手机相机拍照并显示图片.这是一个很常用的功能,并且这个功能在Android6.0.7.0.10.0等版本上实现都有所不同,需要对Android各个版本进行兼容适配, ...

  3. h5 调起相机_Html5在手机端调用相机的方法实现

    input调用设备录像,相机等- HTML5官方文档解释:capture属性用于调用设备的摄像头或麦克风. 当accept="audio/或video/"时capture只有两种值 ...

  4. html5 调用本地街景,H5案例分享:在移动端调用腾讯街景

    在移动端调用腾讯街景 腾讯地图街景组件可以通过多种方式调起,来展示3D街景信息. 腾讯街景API,是构建在v2版本上的全新应用接口,对于目的地,可以让用户足不出户,得到更直观.更真切 的身临其境的体验 ...

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

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

  6. android调用相机返回大图,Android调用相机拍照返回原图

    在开始之前,先说下正常调用相机的状况: 正常调用相机,在 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActiv ...

  7. h5获取安卓定位_H5 移动端获取当前位置

    3种方法: 1.H5自带的方法,获取经纬度 2.通过地图提供的JS.获取位置 3.通过微信的API(这个需要公众号 / 小程序) 1.通过H5自带的获取经纬度的方法 优点: 需要引用的资源较少,H5自 ...

  8. h5页面禁止复制_H5移动端页面禁止复制技巧

    前言:业务需要,需要对整个页面禁止弹出复制菜单. 在禁止的页面中加入以下css样式定义 * { -webkit-touch-callout:none;/*系统默认菜单被禁用*/ -webkit-use ...

  9. vue移动端调用照相机及相册

    <template><div class="me-detail"><m-hbar title="个人笔记"/><div ...

最新文章

  1. 【HDU】4706 Children's Day(模拟)
  2. python 项目构建工具_python的构建工具setup.py
  3. 美团O2O排序解决方案——线下篇
  4. angular 获取ng-repeat完成状态 $last
  5. 程序员小抄 (转载自酷壳,一个专注技术的博客)
  6. 如何给影像添加投影_地面互动投影是如何实现的,需要哪些设备?
  7. 【MySQL】MySQL show index 索引信息
  8. c++------------之---【虚函数和抽象基类的应用】
  9. pooleddb mysql_使用dbutils的PooledDB连接池,操作数据库
  10. php新浪获取ip接口,【php】利用新浪api接口与php获取远程数据的步骤,获取IP地址,并获取相应的IP归属地...
  11. 计算机网络的三种通讯模式(单播,广播,组播)小结
  12. mysql --force 无效_【技能库】--mysql 索引失效 force index也失效-- 原因解决方案(256)...
  13. win 7系统微信如何用代理服务器,win7系统电脑上使用微信的操作方法
  14. 《增长黑客》- 读书笔记(一)
  15. 家用无线路由器设置技巧
  16. 服务器操作系统本备份,服务器操作系统本备份
  17. JAVA 利用ASCII码偏移(来自IDEA免费激活码游戏)
  18. 自定义配置log日志
  19. QR分解、RQ分解与SVD
  20. Sigar获取系统信息

热门文章

  1. itunes 无法构建版本问题
  2. umi 兼容ie11 按照官方配置还是失败处理
  3. #2 VS Code字体大小和行间距设置
  4. 2013蓝桥杯 黄金分割数 斐波那契数列与黄金分割比例的结合应用+模拟手算
  5. 中年人的第N个HelloWorld
  6. c#串口缓存字节数_c#串口编程(转)
  7. tyvj 4752 数学逻辑题
  8. 游戏笔记本计算机购买,2021年4月|游戏笔记本电脑选购,个人主观推荐
  9. 台式计算机idc数据排名,IDC:2018年全球个人计算设备出货量约为4.07亿台 下滑大约3.9%...
  10. 2020年版教育直播平台排名早已出来,你看过了吗?