首頁 > web前端 > H5教程 > 主體

關於html5中如何呼叫相機拍照並且壓縮圖片的範例詳解

黄舟
發布: 2017-07-24 15:08:38
原創
2684 人瀏覽過

這篇文章主要介紹了H5調用相機拍照並壓縮圖片的實例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

整理文檔,搜刮出一個H5調用相機拍照並壓縮圖片的實例代碼,稍微整理精簡一下做下分享。

背景

最近要做一個h5的頁面,主要功能就是呼叫相機拍照或是相簿選圖並且把照片壓縮轉base64之後上傳到後台伺服器,然後伺服器傳回識別結果。

前端的主要功能點有:

  1. H5如何呼叫相機

  2. ##圖片如何壓縮

  3. #圖片轉base64

H5呼叫相機/相簿

呼叫相機最簡單的方法就是使用input file[camera ]屬性:


<input type="file" capture=camera accept="image/*">//相机
<input type="file" accept="image/*">//相册
登入後複製

這個種方法相容性還是有問題的,在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(&#39;canvas&#39;);
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(&#39;image/jpeg&#39;, quality/100);
登入後複製

然後就是上傳到伺服器並展示伺服器的結果啦,然而事情並沒有那麼順利。 。 。 ios手機拍照壓縮之後圖片莫名的旋轉了,繼續解決問題。

解決IOS圖片旋轉

先引用exif.js,透過EXIF.getData和EXIF.getTag取得拍照方向資訊。


//file通过input标签获取
EXIF.getData(file,function(){
  orientation=EXIF.getTag(file,&#39;Orientation&#39;);
});
登入後複製

下面給出每個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下方圖片已經正常了。

下面給出完整程式碼:


$(&#39;input[type=file]&#39;).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,&#39;Orientation&#39;);
    });

    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(&#39;canvas&#39;);
        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(&#39;image/jpeg&#39;, quality/100);
        //获取识别结果
        ...
      }
      image.src=dataURL;
    };
    reader.readAsDataURL(file);
  }else{
    alert("只能识别图片!")
  }
});
登入後複製

以上是關於html5中如何呼叫相機拍照並且壓縮圖片的範例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板