欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

移動端 Vue+Vant 的Uploader 實現(xiàn)上傳、壓縮、旋轉(zhuǎn)圖片功能

 更新時間:2019年06月10日 11:48:38   作者:我想當個土老板  
這篇文章主要介紹了移動端 Vue+Vant 的Uploader 實現(xiàn) 上傳、壓縮、旋轉(zhuǎn)圖片功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下

面向百度開發(fā)

html

 <van-uploader :after-read="onRead" accept="image/*">
    <img src="./icon_input_add.png" />
 </van-uploader>

js

data() {
    return {
      files: {
        name: "",
        type: ""
      },
      headerImage: null,
      picValue: null,
      upImgUrl,
    }
  },
  // 組件方法 獲取 流
  async onRead(file) {
      // console.log(file);
      // console.log(file.file);
      this.files.name = file.file.name; // 獲取文件名
      this.files.type = file.file.type; // 獲取類型
      this.picValue = file.file; // 文件流
      this.imgPreview(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 () {
          // console.log(this.result);
          let result = this.result;
          let img = new Image();
          img.src = result;
          //判斷圖片是否大于500K,是就直接上傳,反之壓縮圖片
          if (this.result.length <= 500 * 1024) {
            self.headerImage = this.result;
            self.postImg();
          } else {
            img.onload = function () {
              let data = self.compress(img, Orientation);
              self.headerImage = data;
              self.postImg();
            };
          }
        };
      }
    },
    // 壓縮圖片
    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;
        }
      }
      //進行最小壓縮
      let ndata = canvas.toDataURL("image/jpeg", 0.1);
      tCanvas.width = tCanvas.height = canvas.width = canvas.height = 0;
      return ndata;
    },
    // 旋轉(zhuǎn)圖片
    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;
      }
    },
    //將base64轉(zhuǎn)換為文件
    dataURLtoFile(dataurl) {
      var arr = dataurl.split(","),
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      return new File([u8arr], this.files.name, {
        type: this.files.type
      });
    },
    //這里寫接口 
    async postImg() {
      let file = this.dataURLtoFile(this.headerImage);
      let formData = new window.FormData();
      formData.append("file", file);
      toast_loding(this, "圖片上傳中···");
      try {
        let res = await util.ajax.post(this.upImgUrl, formData, {
          headers: {
            "Content-Type": "multipart/form-data"
          }
        });
      } catch (e) {
        console.log(e);
      }
    }

總結(jié)

以上所述是小編給大家介紹的移動端 Vue+Vant 的Uploader 實現(xiàn)上傳、壓縮、旋轉(zhuǎn)圖片功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝! 

相關(guān)文章

最新評論