這篇文章主要介紹了H5調用相機拍照並壓縮圖片的實例代碼,內容挺不錯的,現在分享給大家,也給大家做個參考。
整理文檔,搜尋一個H5呼叫相機拍照並壓縮圖片的實例程式碼,稍微整理精簡一下做下分享。
背景
最近要做一個h5的頁面,主要功能就是呼叫相機拍照或是相簿選圖並且把照片壓縮轉base64之後上傳到後台伺服器,然後伺服器傳回識別結果。
前端的主要功能點有:
H5如何呼叫相機
H5呼叫相機/相簿
呼叫相機最簡單的方法就是使用input file[camera ]屬性:<input type="file" capture=camera accept="image/*">//相机 <input type="file" accept="image/*">//相册這個種方法相容性還是有問題的,在iphone手機上可以正常開啟相機,但是在安卓手機上點擊之後是相機、圖庫、檔案管理器等混合選擇項目。在網路上搜了很多都沒有什麼好的解決辦法,只能繼續往下寫了。 。 。
圖片壓縮
圖片壓縮就要用到FileReader和
5ba626b379994d53f7acf72a64f9b697了。
var MAX_WH=800; var image=new Image(); image.onload=function () { if(image.height > MAX_WH) { // 宽度等比例缩放 *= image.width *= MAX_WH/ image.height; image.height = MAX_WH; } if(image.width > MAX_WH) { // 宽度等比例缩放 *= image.height *= MAX_WH/ image.width; image.width = MAX_WH; } } image.src=dataURL;//dataURL通过FileReader获取然後就是壓縮圖片的品質了,這裡設定壓縮了80%,如果設定太小圖片就失真了。動態創建5ba626b379994d53f7acf72a64f9b697標籤然後壓縮圖片:
var quality=80; var cvs = document.createElement('canvas'); cvs.width = image.width; cvs.heigh = image.height; var context=cvs.getContext("2d"); context.drawImage(image, 0, 0,image.width, image.height); dataURL = cvs.toDataURL('image/jpeg', quality/100);然後就是上傳到伺服器並展示伺服器的結果啦,然而事情並沒有那麼順利。 。 。 ios手機拍照壓縮之後圖片莫名的旋轉了,繼續解決問題。
解決IOS圖片旋轉
先引用exif.js,透過EXIF.getData和EXIF.getTag取得拍照方向資訊。//file通过input标签获取 EXIF.getData(file,function(){ orientation=EXIF.getTag(file,'Orientation'); });下面給出每個orientation值對應到iphone手機拍照的意思:
描述 | |
---|---|
iphone橫向螢幕拍攝,此時home鍵在左側,圖片相對於原始位置旋轉了180度 | |
#iphone豎屏拍攝,此時home鍵在下方(正常拿手機的方向),圖片相對於原始位置逆時針旋轉可90度 | |
iphone垂直螢幕拍攝,此時home鍵在上方,圖片相對於原始位置順時針旋轉了90度 |
在取得圖片的方向資訊之後,根據取得到的值作對應的旋轉運算。
switch (orientation) { case 6: case 8: cvs.width = height; cvs.height = width; break; } var context=cvs.getContext("2d"); switch(orientation){ //iphone横屏拍摄,此时home键在左侧 case 3: // 180度向左旋转 context.translate(width, height); context.rotate(Math.PI); break; //iphone竖屏拍摄,此时home键在下方(正常拿手机的方向) case 6: context.rotate(0.5 * Math.PI); context.translate(0, -height); break; //iphone竖屏拍摄,此时home键在上方 case 8: // 逆时针旋转90度 context.rotate(-0.5 * Math.PI); context.translate(-width, 0); break; }
然後再上傳圖片,發現在IOS下方圖片已經正常了。
下面給出完整程式碼:
$('input[type=file]').change(function(e) { var file = this.files[0]; var mime_type=file.type; var orientation=0; if (file && /^image\//i.test(file.type)) { EXIF.getData(file,function(){ orientation=EXIF.getTag(file,'Orientation'); }); var reader = new FileReader(); reader.onloadend = function () { var width,height; var MAX_WH=800; var image=new Image(); image.onload=function () { if(image.height > MAX_WH) { // 宽度等比例缩放 *= image.width *= MAX_WH / image.height; image.height = MAX_WH; } if(image.width > MAX_WH) { // 宽度等比例缩放 *= image.height *= MAX_WH / image.width; image.width = MAX_WH; } //压缩 var quality=80; var cvs = document.createElement('canvas'); cvs.width = width = image.width; cvs.height =height = image.height; switch (orientation) { case 6: case 8: cvs.width = height; cvs.height = width; break; } var context=cvs.getContext("2d"); //解决ios图片旋转问题 switch(orientation){ //iphone横屏拍摄,此时home键在左侧 case 3: // 180度向左旋转 context.translate(width, height); context.rotate(Math.PI); break; //iphone竖屏拍摄,此时home键在下方(正常拿手机的方向) case 6: context.rotate(0.5 * Math.PI); context.translate(0, -height); break; //iphone竖屏拍摄,此时home键在上方 case 8: // 逆时针旋转90度 context.rotate(-0.5 * Math.PI); context.translate(-width, 0); break; } context.drawImage(image, 0, 0,image.width, image.height); dataURL = cvs.toDataURL('image/jpeg', quality/100); //获取识别结果 ... } image.src=dataURL; }; reader.readAsDataURL(file); }else{ alert("只能识别图片!") } });
#以上就是本文的全部內容,希望對大家的學習有所幫助,更相關內容請關注PHP中文網!
相關推薦:
關於H5新屬性audio音訊和video視訊的控制解析Angular下H5多張上傳圖片的方法#
以上是關於H5調用相機拍照並壓縮圖片的程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!