前端調用手機相機拍照
實現方式常見有兩種:
一種是通過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 };