国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > HTML5 > 正文

H5調(diào)用相機(jī)拍照并壓縮圖片的實(shí)例代碼

2024-09-05 07:22:03
字體:
供稿:網(wǎng)友

整理文檔,搜刮出一個H5調(diào)用相機(jī)拍照并壓縮圖片的實(shí)例代碼,稍微整理精簡一下做下分享。

背景

最近要做一個h5的頁面,主要功能就是調(diào)用相機(jī)拍照或者是相冊選圖并且把照片壓縮轉(zhuǎn)base64之后上傳到后臺服務(wù)器,然后服務(wù)器返回識別結(jié)果。

前端的主要功能點(diǎn)有:

  1. H5如何調(diào)用相機(jī)
  2. 圖片如何壓縮
  3. 圖片轉(zhuǎn)base64

H5調(diào)用相機(jī)/相冊

調(diào)用相機(jī)最簡單的方法就是使用input file[camera]屬性:

<input type="file" capture=camera accept="image/*">//相機(jī)<input type="file" accept="image/*">//相冊

這個種方法兼容性還是有問題的,在iphone手機(jī)上可以正常打開相機(jī),但是在安卓手機(jī)上點(diǎn)擊之后是相機(jī)、圖庫、文件管理器等混合選擇項(xiàng)。在網(wǎng)上搜了很多都沒有什么好的解決辦法,只能繼續(xù)往下寫了。。。

圖片壓縮

圖片壓縮就要用到FileReader<canvas>了。

FileReader對象允許Web應(yīng)用程序異步讀取存儲在計(jì)算機(jī)上的文件的內(nèi)容,使用File或Blob對象指定要讀取的文件或數(shù)據(jù)。

<canvas>是一個可以使用腳本在其中繪制圖形的HTML元素,可以繪制圖形和簡單的動畫。

圖片壓縮要壓縮圖片的分辨率和質(zhì)量,分辨率壓縮我這里是設(shè)置了圖片的最大邊為800,另一邊按照圖片原有比例縮放,也可以設(shè)置圖片整體的縮放比例。

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獲取

然后就是壓縮圖片的質(zhì)量了,這里設(shè)置壓縮了80%,如果設(shè)置太小圖片就失真了。動態(tài)創(chuàng)建<canvas>標(biāo)簽然后壓縮圖片:

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);

然后就是上傳到服務(wù)器并展示服務(wù)器的結(jié)果啦,然而事情并沒有那么順利。。。ios手機(jī)拍照壓縮之后圖片莫名的旋轉(zhuǎn)了,繼續(xù)解決問題。

解決IOS圖片旋轉(zhuǎn)

首先引用exif.js,通過EXIF.getData和EXIF.getTag獲取拍照方向信息。

//file通過input標(biāo)簽獲取EXIF.getData(file,function(){  orientation=EXIF.getTag(file,'Orientation');});

下面給出每個orientation值對應(yīng)到iphone手機(jī)拍照的含義:

orientation 描述
3 iphone橫屏拍攝,此時home鍵在左側(cè),圖片相對于原始位置旋轉(zhuǎn)了180度
6 iphone豎屏拍攝,此時home鍵在下方(正常拿手機(jī)的方向),圖片相對于原始位置逆時針旋轉(zhuǎn)可90度
8 iphone豎屏拍攝,此時home鍵在上方,圖片相對于原始位置順時針旋轉(zhuǎn)了90度
獲取圖片的方向信息之后,根據(jù)獲取到的值作相應(yīng)的旋轉(zhuǎn)操作。
switch (orientation) {  case 6:  case 8:    cvs.width = height;    cvs.height = width;    break;}var context=cvs.getContext("2d");switch(orientation){  //iphone橫屏拍攝,此時home鍵在左側(cè)  case 3:  // 180度向左旋轉(zhuǎn)  context.translate(width, height);  context.rotate(Math.PI);  break;  //iphone豎屏拍攝,此時home鍵在下方(正常拿手機(jī)的方向)  case 6:  context.rotate(0.5 * Math.PI);  context.translate(0, -height);  break;  //iphone豎屏拍攝,此時home鍵在上方  case 8:  // 逆時針旋轉(zhuǎn)90度  context.rotate(-0.5 * Math.PI);  context.translate(-width, 0);  break;}

然后再上傳圖片,發(fā)現(xiàn)在IOS下圖片已經(jīng)正常了。

下面給出完整代碼:

$('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圖片旋轉(zhuǎn)問題         switch(orientation){          //iphone橫屏拍攝,此時home鍵在左側(cè)          case 3:          // 180度向左旋轉(zhuǎn)          context.translate(width, height);          context.rotate(Math.PI);          break;          //iphone豎屏拍攝,此時home鍵在下方(正常拿手機(jī)的方向)          case 6:          context.rotate(0.5 * Math.PI);          context.translate(0, -height);          break;          //iphone豎屏拍攝,此時home鍵在上方          case 8:          // 逆時針旋轉(zhuǎn)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);        //獲取識別結(jié)果        ...      }      image.src=dataURL;    };    reader.readAsDataURL(file);  }else{    alert("只能識別圖片!")  }});

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 怀宁县| 容城县| 满洲里市| 武义县| 南部县| 平塘县| 磐安县| 济源市| 布拖县| 阿巴嘎旗| 罗江县| 江油市| 双流县| 紫金县| 广饶县| 阳东县| 兴城市| 息烽县| 旌德县| 元阳县| 福清市| 南开区| 广宗县| 盐池县| 南木林县| 峨眉山市| 乌兰浩特市| 桐城市| 安福县| 仙游县| 武宣县| 白水县| 旬阳县| 合川市| 新余市| 霍邱县| 敦煌市| 太康县| 敖汉旗| 上饶市| 屏边|