前端调用手机相机拍照
转载地址
HTML5调用手机相机拍照
前端调用手机相机拍照
实现方式常见有两种:
一种是通过video控件,通过捕获video的流,截取video中的图像实现拍照,
还有一种是通过input[file]控件调用移动端的摄像头,实现拍照。
两种方法各有利弊,第一种可以实现对拍照界面的重写(比如添加拍照界面的遮罩层提示框等)
但是,第一种方式在IPhone环境下不兼容,不能使用。
第二种方式实际上是调用input[type='file'],会弹出一个选择框让用户选择是调用相机还是调用相册,
好处就是兼容优于上一种,不好的地方就是这种方法无法控制拍照,想要在移动端实现只能拍照不能选择照片或者在拍照界面添加引导遮罩层的方法是行不通了。
这里说一下第二种方式的实现方式:
首先在页面上添加一个input控件实现调用相机。
<input id="takepicture" type="file" accept="image/*" capture="camera" style="display: none">
自定义方式调用相机:
var takePictureOnclick = function(){var takePicture = document.getElementById('takepicture');... // 添加需要处理的代码takePicture.click(); }
然后在js中添加对这个input的onchange事件,监听拍完照之后获取照片的流。
1 // 监听照片拍摄,并获取照片流 2 var takePicture = document.getElementById('takepicture'); 3 var takePictureUrl = function () { 4 takePicture.onchange = function (event) { 5 var files = event.target.files, file; 6 if (files && files.length > 0) { 7 file = files[0]; 8 try { 9 var URL = window.URL || window.webkitURL; 10 var blob = URL.createObjectURL(file); // 获取照片的文件流 11 compressPicture(blob); // 压缩照片 12 } 13 catch (e) { 14 try { 15 var fileReader = new FileReader(); 16 fileReader.onload = function (event) { // 获取照片的base64编码 17 compressPicture(event.target.result); // 压缩照片 18 }; 19 fileReader.readAsDataURL(file); 20 } 21 catch (e) { 22 alert(common.MESSAGE.title.error, '拍照失败,请联系客服或尝试更换手机再试!'); 23 } 24 } 25 }26 } 27 }();
这个onchange方法中,通过两种方式捕获用户拍照完之后的照片,第一种是捕获照片的文件流(存在一定兼容性问题),如果第一种方式不兼容则使用第二种方式获取照片的base64编码(这种方式兼容性较高),保险一点,两种方式都是用。
以上,就完成了前端的调用相机并拍照的功能。
前端照片压缩处理
前端的照片压缩没有什么好的解决方案。目前有的是通过canvas的两个API实现照片的压缩处理。
解决兼容性需要用到两个插件:
点击这里
实现代码:
1 var compressPicture = function (blob) { 2 var quality = 0.5, image = new Image(); 3 image.src = blob; 4 image.onload = function () { 5 var that = this; 6 // 生成比例 7 var width = that.width, height = that.height; 8 width = width / 4; 9 height = height / 4; 10 // 生成canvas画板 11 var canvas = document.createElement('canvas'); 12 var ctx = canvas.getContext('2d'); 13 canvas.width = width; 14 canvas.height = height; 15 ctx.drawImage(that, 0, 0, width, height); 16 // 生成base64,兼容修复移动设备需要引入mobileBUGFix.js 17 var imgurl = canvas.toDataURL('image/jpeg', quality); 18 // 修复IOS兼容问题 19 if (navigator.userAgent.match(/iphone/i)) { 20 var mpImg = new MegaPixImage(image); 21 mpImg.render(canvas, { 22 maxWidth: width, 23 maxHeight: height, 24 quality: quality 25 }); 26 imgurl = canvas.toDataURL('image/jpeg', quality); 27 } 28 // 上传照片 29 uploadPicture(imgurl); 30 }; 31 };
关注 - 1
粉丝 - 0
» 下一篇:gulp 配置自动化前端开发
posted on 2015-09-11 11:55 一笔风尘 阅读(285) 评论(0) 编辑 收藏
【推荐】融云发布 App 社交化白皮书 IM 提升活跃超 8 倍
【邀请】网易云渠道合作伙伴招商大会,邀您共创未来
· 人工智能时代,亚马逊想打造另一个 Android
· 手游氪金太狠,连文化部都怒了:网游物品抽取概率必须公开!
· Firebug宣布停止开发更新
· 苹果和三星之间拖了5年的专利战,三星可能不用赔钱了
· Google是如何挑战AWS的霸主地位的
» 更多新闻...
· 循序渐进地代码重构
· 技术的正宗与野路子
· 陈皓:什么是工程师文化?
· 没那么难,谈CSS的设计模式
» 更多知识库文章...
前端调用手机相机拍照相关推荐
- uniapp 调用手机相机拍照实现图片上传
uniapp 调用手机相机拍照实现图片上传 参考资料:https://blog.csdn.net/weixin_46391646/article/details/108450898 调用相机相册 un ...
- 前端调用手机拍照功能失败,调用相机没反应
开发过程中需要再ios app的WKwebview里面嵌入前端页面,这时候前端页面可能有需要打开手机相机拍照或者打开手机相册功能,有时候是点击没反应,有时候是点击后能够打开相机或相册,然后拍完照片确定 ...
- h5前端调用android拍照功能,H5调用Android拍照和摄像以及选取相册
之前一直认为H5调用Android,H5不需要Android配合能直接实现功能.前段时间,自己做这个功能,才发现不是这么回事. H5编写 html文件里只需要标签即可实现代码,代码如下所示: 拍照 ο ...
- h5前端调用android拍照功能,H5中,嵌入式webview中,调用摄像头拍照功能的实现
参考资料: 1.https://github.com/robnyman/robnyman.github.com/tree/master/camera-api[老外写的demo] 2.https://w ...
- vue H5页面调用手机相机拍照/图库上传
//html//相机 //capture:user(前置摄像头).environment(后置摄像头) <input type="file" id="photo&q ...
- android 调用相机拍照。适配到 Android 10
Photograph 项目地址:donkingliang/Photograph 简介: android 调用相机拍照.适配到 Android 10 更多:作者 提 Bug 标签: android ...
- android相机拍照代码,Android 调用相机拍照,适配到Android 10
今天写的博客是关于Android调用手机相机拍照并显示图片.这是一个很常用的功能,并且这个功能在Android6.0.7.0.10.0等版本上实现都有所不同,需要对Android各个版本进行兼容适配, ...
- uniapp如何调用手机相机进行拍照
uniapp调用手机拍照的方法,我所用到的两种方法列举在下方 方法一:使用uni.chooseImage uni.chooseImage({count: 6, //默认9sizeType: ['ori ...
- html实现照片添加功能,HTML5 Canvas调用手机拍照功能实现图片上传功能(图文详解上篇)...
这篇文章主要为大家详细介绍了HTML5 Canvas,和jquery技术,调用手机拍照功能实现图片上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 因为最近一段时间,一直在弄微信项目,其中涉及到 ...
最新文章
- mysql useradd_useradd失败
- 脱胎于BTC的BCH,适合你的道路在哪里?
- ExecutorService(任务调度器)详解
- 新年不宕机就等它了!戴尔官网高效编程电脑OptiPlex 直降2500,低至3099!
- Django中STATIC_URL、STATIC_ROOT、STATICFILES_DIRS 的区别关系
- KVM总结-KVM性能优化之网络性能优化
- Firefox 66 将阻止自动播放音频和视频
- java 修改源码_再谈给应用程序diy启动画面和java源代码补丁修改
- Android 隐藏ImageView
- 由安徽十地重拳曝光老赖,谈失信会有哪些限制?
- 下一代 TGW 从13Mpps到50Mpps性能优化之旅
- 如何计算算法的时间复杂度
- 关于MFC修改CButton按钮的颜色、背景、字体
- python遇到错误跳过_python跳过错误
- JackKnife开发专题-方便快捷的IOC框架
- CNN Matlab例子RGB_MATLAB如何提取曲线原始数据
- RocketChat 代码目录结构
- javanbsp;学习过程
- 项目用到的注解(乱七八糟)
- android studio中使用AIDL进行客户端与服务端互相通信
热门文章
- pandas 转换为文本类型_python – pandas将文本特征转换为数值
- Phonetic symbol 清辅音 -- p
- csgo原始输入开不开_CSGO职业哥参数配置:帅气猪猪JW
- Python3+Scrapy通过代理爬取携程酒店数据
- 小机器人显示服务器异常,机器人常见异常报警处理、及日常维护保养。
- 智能网联汽车信息安全研究报告
- 机器翻译和人工智能翻译,语言学与机器翻译
- win10的计算机是哪个版本,Windows 10系统都有哪些版本?老旧电脑装哪个版本的win10好?...
- Unity3D 本地数据持久化记录存储
- java动态心形程序_java swing实现动态心形图案的代码下载