zoukankan      html  css  js  c++  java
  • vue文件上传及压缩(canvas实现压缩)

      // 读取文件结果
        afterRead(files) {
          let that = this;
          let file = files.file;
          if (file === undefined) {
            return;
          }
          if (file.size / 1024 > 1025) {
            // 文件大于1M(根据需求更改),进行压缩上传
            this.photoCompress(
              file,
              {
                // 调用压缩图片方法
                quality: 0.2,
              },
              function (base64Codes) {
                // console.log("压缩后:" + base.length / 1024 + " " + base);
                let bl = that.base64UrlToBlob(base64Codes);
                // file.append('file', bl, 'file_' + Date.parse(new Date()) + '.jpg') // 文件对象
                that.uploadLice(bl); // 请求图片上传接口
              }
            );
          } else {
            // 小于等于1M 原图上传
            this.uploadLice(file);
          }
        }
        /**
         * base64 转 Blob 格式 和file格式
         */
        base64UrlToBlob(urlData) {
          let arr = urlData.split(","),
            mime = arr[0].match(/:(.*?);/)[1], // 去掉url的头,并转化为byte
            bstr = atob(arr[1]), // 处理异常,将ascii码小于0的转换为大于0
            n = bstr.length,
            u8arr = new Uint8Array(n);
          while (n--) {
            u8arr[n] = bstr.charCodeAt(n);
          }
          // 转blob
          // return new Blob([u8arr], {type: mime})
          let filename = Date.parse(new Date()) + ".jpg";
          // 转file
          return new File([u8arr], filename, { type: mime });
        }
        /*
          压缩图片
          file:文件(类型是图片格式),
          obj:文件压缩后对象width, height, quality(0-1)
          callback:容器或者回调函数
        */
        photoCompress(file, obj, callback) {
          let that = this;
          let ready = new FileReader();
          /* 开始读取指定File对象中的内容. 读取操作完成时,返回一个URL格式的字符串. */
          ready.readAsDataURL(file);
          ready.onload = function () {
            let re = this.result;
            that.canvasDataURL(re, obj, callback); // 开始压缩
          };
        }
        /* 利用canvas数据化图片进行压缩 */
        /* 图片转base64 */
        canvasDataURL(path, obj, callback) {
          let img = new Image();
          img.src = path;
          img.onload = function () {
            let that = this; // 指到img
            // 默认按比例压缩
            let w = that.width,
              h = that.height,
              scale = w / h;
            w = obj.width || w;
            h = obj.height || w / scale;
            let quality = 0.2; // 默认图片质量为0.7
            // 生成canvas
            let canvas = document.createElement("canvas");
            let ctx = canvas.getContext("2d");
            // 创建属性节点
            let anw = document.createAttribute("width");
            anw.nodeValue = w;
            let anh = document.createAttribute("height");
            anh.nodeValue = h;
            canvas.setAttributeNode(anw);
            canvas.setAttributeNode(anh);
            ctx.drawImage(that, 0, 0, w, h);
            // 图像质量
            if (obj.quality && obj.quality >= 1 && obj.quality < 0) {
              quality = obj.quality;
            }
            // quality值越小,所绘制出的图像越模糊
            let base64 = canvas.toDataURL("image/jpeg", quality);
            // 回调函数返回base64的值
            callback(base64);
          };
        }
        //  返回file文件,调用接口执行上传
        async uploadLice(files) {
          const formData = new FormData();
          formData.append("file", files);
          let result = await uploadApi(formData);
          if (result.code == 200) {
            this.sendUrl.push(result.data);
          }
        }
    
  • 相关阅读:
    HDU 4432 求因子+进制转换
    HDU 4438 概率 多个情况下的数学期望
    HDU 4424 并查集+贪心思想
    POJ 1611 记录节点数的并查集
    HDU 4430 二分查找
    HDU 4422 采蘑菇的小女孩
    最短路之SPFA模板
    zju pat1065. A+B and C (64bit)
    zju pat 1058 A+B in Hogwarts
    zju pat 1054 The Dominant Color
  • 原文地址:https://www.cnblogs.com/black-Q/p/15427376.html
Copyright © 2011-2022 走看看