Vue2.0實現(xiàn)調(diào)用攝像頭進(jìn)行拍照功能exif.js實現(xiàn)圖片上傳功能-創(chuàng)新互聯(lián)

本文實例為大家分享了Vue2.0實現(xiàn)調(diào)用攝像頭進(jìn)行拍照功能的具體代碼,以及圖片上傳功能引用exif.js,供大家參考,具體內(nèi)容如下

目前成都創(chuàng)新互聯(lián)已為成百上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計、福清網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

可以在github 上下載demo鏈接

vue組件代碼

<template>
 <div>
 <div >
  <div class="show">
  <div class="picture" :></div>
  </div>
  <div >
  <input type="file" id="upload" accept="image/jpg" @change="upload">
  <label for="upload"></label>
  </div>
 </div>
 </div>
</template>

<script>
import {Exif} from './exif.js'

export default {
 data () {
 return {
  headerImage:'',picValue:''
 }
 },
 mounted () {
 },
 methods: {
 upload (e) {
  let files = e.target.files || e.dataTransfer.files;
  if (!files.length) return;
  this.picValue = files[0];
  this.imgPreview(this.picValue);
  console.log(this.picValue)
 },
 imgPreview (file) {
  let self = this;
  let Orientation;
  //去獲取拍照時的信息,解決拍出來的照片旋轉(zhuǎn)問題
  Exif.getData(file, function(){
   Orientation = Exif.getTag(this, 'Orientation');
  });
  // 看支持不支持FileReader 
  if (!file || !window.FileReader) return;

  if (/^image/.test(file.type)) {
   // 創(chuàng)建一個reader
   let reader = new FileReader();
   // 將圖片2將轉(zhuǎn)成 base64 格式
   reader.readAsDataURL(file);
   // 讀取成功后的回調(diào)
   reader.onloadend = function () {
   let result = this.result;
   let img = new Image();
   img.src = result;
   //判斷圖片是否大于100K,是就直接上傳,反之壓縮圖片
   if (this.result.length <= (100 * 1024)) {
    self.headerImage = this.result;
    self.postImg();
   }else {
    img.onload = function () {
    let data = self.compress(img,Orientation);
    self.headerImage = data;
    self.postImg();
    }
   }
   }
  }
  },
  postImg () {
  //這里寫接口
  },
  rotateImg (img, direction,canvas) {
  //最小與大旋轉(zhuǎn)方向,圖片旋轉(zhuǎn)4次后回到原方向
  const min_step = 0;
  const max_step = 3;
  if (img == null)return;
  //img的高度和寬度不能在img元素隱藏后獲取,否則會出錯
  let height = img.height;
  let width = img.width;
  let step = 2;
  if (step == null) {
   step = min_step;
  }
  if (direction == 'right') {
   step++;
   //旋轉(zhuǎn)到原位置,即超過大值
   step > max_step && (step = min_step);
  } else {
   step--;
   step < min_step && (step = max_step);
  }
  //旋轉(zhuǎn)角度以弧度值為參數(shù)
  let degree = step * 90 * Math.PI / 180;
  let ctx = canvas.getContext('2d');
  switch (step) {
   case 0:
    canvas.width = width;
    canvas.height = height;
    ctx.drawImage(img, 0, 0);
    break;
   case 1:
    canvas.width = height;
    canvas.height = width;
    ctx.rotate(degree);
    ctx.drawImage(img, 0, -height);
    break;
   case 2:
    canvas.width = width;
    canvas.height = height;
    ctx.rotate(degree);
    ctx.drawImage(img, -width, -height);
    break;
   case 3:
    canvas.width = height;
    canvas.height = width;
    ctx.rotate(degree);
    ctx.drawImage(img, -width, 0);
    break;
  }
 },
 compress(img,Orientation) {
  let canvas = document.createElement("canvas");
  let ctx = canvas.getContext('2d');
  //瓦片canvas
  let tCanvas = document.createElement("canvas");
  let tctx = tCanvas.getContext("2d");
  let initSize = img.src.length;
  let width = img.width;
  let height = img.height;
  //如果圖片大于四百萬像素,計算壓縮比并將大小壓至400萬以下
  let ratio;
  if ((ratio = width * height / 4000000) > 1) {
  console.log("大于400萬像素")
  ratio = Math.sqrt(ratio);
  width /= ratio;
  height /= ratio;
  } else {
  ratio = 1;
  }
  canvas.width = width;
  canvas.height = height;
 //  鋪底色
  ctx.fillStyle = "#fff";
  ctx.fillRect(0, 0, canvas.width, canvas.height);
  //如果圖片像素大于100萬則使用瓦片繪制
  let count;
  if ((count = width * height / 1000000) > 1) {
  console.log("超過100W像素");
  count = ~~(Math.sqrt(count) + 1); //計算要分成多少塊瓦片
 //   計算每塊瓦片的寬和高
  let nw = ~~(width / count);
  let nh = ~~(height / count);
  tCanvas.width = nw;
  tCanvas.height = nh;
  for (let i = 0; i < count; i++) {
   for (let j = 0; j < count; j++) {
   tctx.drawImage(img, i * nw * ratio, j * nh * ratio, nw * ratio, nh * ratio, 0, 0, nw, nh);
   ctx.drawImage(tCanvas, i * nw, j * nh, nw, nh);
   }
  }
  } else {
  ctx.drawImage(img, 0, 0, width, height);
  }
  //修復(fù)ios上傳圖片的時候 被旋轉(zhuǎn)的問題
  if(Orientation != "" && Orientation != 1){
  switch(Orientation){
   case 6://需要順時針(向左)90度旋轉(zhuǎn)
    this.rotateImg(img,'left',canvas);
    break;
   case 8://需要逆時針(向右)90度旋轉(zhuǎn)
    this.rotateImg(img,'right',canvas);
    break;
   case 3://需要180度旋轉(zhuǎn)
    this.rotateImg(img,'right',canvas);//轉(zhuǎn)兩次
    this.rotateImg(img,'right',canvas);
    break;
  }
  }
  //進(jìn)行最小壓縮
  let ndata = canvas.toDataURL('image/jpeg', 0.1);
  console.log('壓縮前:' + initSize);
  console.log('壓縮后:' + ndata.length);
  console.log('壓縮率:' + ~~(100 * (initSize - ndata.length) / initSize) + "%");
  tCanvas.width = tCanvas.height = canvas.width = canvas.height = 0;
  return ndata;
 },
 }
}
</script>

<style>
*{
 margin: 0;
 padding: 0;
}
.show {
 width: 100px;
 height: 100px;
 overflow: hidden;
 position: relative;
 border-radius: 50%;
 border: 1px solid #d5d5d5;
}
.picture {
 width: 100%;
 height: 100%;
 overflow: hidden;
 background-position: center center;
 background-repeat: no-repeat;
 background-size: cover;
}
</style>

網(wǎng)站題目:Vue2.0實現(xiàn)調(diào)用攝像頭進(jìn)行拍照功能exif.js實現(xiàn)圖片上傳功能-創(chuàng)新互聯(lián)
URL標(biāo)題:http://muchs.cn/article18/dddhgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、Google小程序開發(fā)、網(wǎng)站策劃、網(wǎng)站建設(shè)網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作