這次帶給大家H5呼叫相機拍照並壓縮圖片,H5調用相機拍照並壓縮圖片的注意事項有哪些,下面就是實戰案例,一起來看一下。 整理文檔,搜尋一個H5呼叫相機拍照並壓縮圖片的實例程式碼,稍微整理精簡一下做下分享。 背景 最近要做一個h5的頁面,主要功能就是呼叫相機拍照或是相簿選圖並且把照片壓縮轉base64之後上傳到後台伺服器,然後伺服器傳回識別結果。 前端的主要功能點有: H5如何呼叫相機 ##圖片如何壓縮 #圖片轉base64 H5呼叫相機/相簿呼叫相機最簡單的方法就是使用input file[camera ]屬性: //相机 //相册這個種方法相容性還是有問題的,在iphone手機上可以正常開啟相機,但是在安卓手機上點擊之後是相機、圖庫、檔案管理器等混合選擇項。在網路上搜了很多都沒有什麼好的解決辦法,只能繼續往下寫了。 。 。 圖片壓縮圖片壓縮就要用到FileReader和了。 FileReader物件允許Web應用程式非同步讀取儲存在電腦上的檔案的內容,使用File或Blob物件指定要讀取的檔案或資料。 是一個可以使用腳本在其中繪製圖形的HTML元素,可以繪製圖形和簡單的動畫。 圖片壓縮要壓縮圖片的解析度和質量,解析度壓縮我這裡是設定了圖片的最大邊為800,另一邊依照圖片原有比例縮放,也可以設定圖片整體的縮放比例。 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%,如果設定太小圖片就失真了。動態創建標籤然後壓縮圖片: 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手機拍照的意思: orientation描述 3iphone橫向螢幕拍攝,此時home鍵在左側,圖片相對於原始位置旋轉了180度 #6iphone垂直螢幕拍攝,此時home鍵在下方(正常拿手機的方向),圖片相對於原始位置逆時針旋轉可90度 #8iphone豎屏拍攝,此時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中History模式的使用詳解 localstorage和sessionstorage使用記錄 #