亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

移動端Vue+Vant的Uploader如何實現上傳、壓縮、旋轉圖片功能

發布時間:2021-05-21 10:16:55 來源:億速云 閱讀:805 作者:小新 欄目:web開發

這篇文章主要介紹移動端Vue+Vant的Uploader如何實現上傳、壓縮、旋轉圖片功能,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

面向百度開發

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;
      //去獲取拍照時的信息,解決拍出來的照片旋轉問題
      Exif.getData(file, function () {
        Orientation = Exif.getTag(this, "Orientation");
      });
      // 看支持不支持FileReader
      if (!file || !window.FileReader) return;
      if (/^image/.test(file.type)) {
        // 創建一個reader
        let reader = new FileReader();
        // 將圖片2將轉成 base64 格式
        reader.readAsDataURL(file);
        // 讀取成功后的回調
        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);
      }
      //修復ios上傳圖片的時候 被旋轉的問題
      if (Orientation != "" && Orientation != 1) {
        switch (Orientation) {
          case 6: //需要順時針(向左)90度旋轉
            this.rotateImg(img, "left", canvas);
            break;
          case 8: //需要逆時針(向右)90度旋轉
            this.rotateImg(img, "right", canvas);
            break;
          case 3: //需要180度旋轉
            this.rotateImg(img, "right", canvas); //轉兩次
            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;
    },
    // 旋轉圖片
    rotateImg(img, direction, canvas) {
      //最小與最大旋轉方向,圖片旋轉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++;
        //旋轉到原位置,即超過最大值
        step > max_step && (step = min_step);
      } else {
        step--;
        step < min_step && (step = max_step);
      }
      //旋轉角度以弧度值為參數
      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轉換為文件
    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);
      }
    }

為什么要使用Vue

Vue是一款友好的、多用途且高性能的JavaScript框架,使用vue可以創建可維護性和可測試性更強的代碼庫,Vue允許可以將一個網頁分割成可復用的組件,每個組件都包含屬于自己的HTML、CSS、JavaScript,以用來渲染網頁中相應的地方,所以越來越多的前端開發者使用vue。

以上是“移動端Vue+Vant的Uploader如何實現上傳、壓縮、旋轉圖片功能”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

清远市| 丁青县| 峨眉山市| 古田县| 县级市| 平遥县| 兴文县| 通城县| 高密市| 瓦房店市| 西城区| 大埔县| 鄂伦春自治旗| 商南县| 嘉鱼县| 南安市| 巍山| 定襄县| 慈溪市| 炉霍县| 灵石县| 桃源县| 河间市| 闻喜县| 年辖:市辖区| 台北市| 喀喇沁旗| 东阳市| 色达县| 天镇县| 榆中县| 黑龙江省| 厦门市| 攀枝花市| 玉树县| 锡林浩特市| 甘肃省| 界首市| 呼伦贝尔市| 永嘉县| 黑山县|