成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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

這篇文章主要介紹移動(dòng)端Vue+Vant的Uploader如何實(shí)現(xiàn)上傳、壓縮、旋轉(zhuǎn)圖片功能,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名與空間、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、武山網(wǎng)站維護(hù)、網(wǎng)站推廣。

面向百度開發(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;
      //去獲取拍照時(shí)的信息,解決拍出來的照片旋轉(zhuǎn)問題
      Exif.getData(file, function () {
        Orientation = Exif.getTag(this, "Orientation");
      });
      // 看支持不支持FileReader
      if (!file || !window.FileReader) return;
      if (/^image/.test(file.type)) {
        // 創(chuàng)建一個(gè)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;
      //如果圖片大于四百萬像素,計(jì)算壓縮比并將大小壓至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); //計(jì)算要分成多少塊瓦片
        //      計(jì)算每塊瓦片的寬和高
        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上傳圖片的時(shí)候 被旋轉(zhuǎn)的問題
      if (Orientation != "" && Orientation != 1) {
        switch (Orientation) {
          case 6: //需要順時(shí)針(向左)90度旋轉(zhuǎn)
            this.rotateImg(img, "left", canvas);
            break;
          case 8: //需要逆時(shí)針(向右)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);
      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元素隱藏后獲取,否則會(huì)出錯(cuò)
      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);
      }
    }

為什么要使用Vue

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

以上是“移動(dòng)端Vue+Vant的Uploader如何實(shí)現(xiàn)上傳、壓縮、旋轉(zhuǎn)圖片功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

文章名稱:移動(dòng)端Vue+Vant的Uploader如何實(shí)現(xiàn)上傳、壓縮、旋轉(zhuǎn)圖片功能
鏈接地址:http://jinyejixie.com/article44/gggdee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、服務(wù)器托管、App開發(fā)手機(jī)網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、小程序開發(fā)

廣告

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

成都網(wǎng)頁設(shè)計(jì)公司
怀柔区| 钟祥市| 长泰县| 高邑县| 长丰县| 普洱| 且末县| 眉山市| 涪陵区| 绥阳县| 海门市| 电白县| 南昌市| 文昌市| 兰坪| 中牟县| 城固县| 安图县| 石狮市| 镇远县| 秀山| 安福县| 德州市| 华坪县| 陕西省| 日喀则市| 鄂托克旗| 博爱县| 抚州市| 新郑市| 金山区| 怀远县| 黔西| 临武县| 永安市| 原平市| 金湖县| 宽甸| 金沙县| 梨树县| 黄陵县|