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);
          }
        }
    
  • 相关阅读:
    Linq 中的Select事例
    C#关于事件的几个好例子
    C#运用实例.读取csv里面的词条,对每一个词条抓取百度百科相关资料,然后存取到数据库
    cookie 和 session 基本使用 以及 封装
    javascript 兼容各个浏览器的事件
    jquery选择器从认识到使用初级篇
    作业八—Alpha阶段项目总结
    第十四次
    第十三次
    十二次
  • 原文地址:https://www.cnblogs.com/black-Q/p/15427376.html
Copyright © 2011-2022 走看看