首頁  >  文章  >  web前端  >  關於H5調用相機拍照並壓縮圖片的程式碼

關於H5調用相機拍照並壓縮圖片的程式碼

不言
不言原創
2018-06-11 16:38:512197瀏覽

這篇文章主要介紹了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手機上可以正常開啟相機,但是在安卓手機上點擊之後是相機、圖庫、檔案管理器等混合選擇項目。在網路上搜了很多都沒有什麼好的解決辦法,只能繼續往下寫了。 。 。

圖片壓縮

圖片壓縮就要用到

FileReader5ba626b379994d53f7acf72a64f9b697了。

FileReader物件允許Web應用程式非同步讀取儲存在電腦上的檔案的內容,使用File或Blob物件指定要讀取的檔案或資料。

5ba626b379994d53f7acf72a64f9b697是一個可以使用腳本在其中繪製圖形的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%,如果設定太小圖片就失真了。動態創建5ba626b379994d53f7acf72a64f9b697標籤然後壓縮圖片:

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#368
描述
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下方圖片已經正常了。

下面給出完整程式碼:

$(&#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("只能识别图片!")
  }
});

#以上就是本文的全部內容,希望對大家的學習有所幫助,更相關內容請關注PHP中文網!

相關推薦:

關於H5新屬性audio音訊和video視訊的控制解析


Angular下H5多張上傳圖片的方法


#

以上是關於H5調用相機拍照並壓縮圖片的程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn