vue图片压缩上传处理进行服务器上传

138 篇文章 7 订阅

涉及到的api方法

drawImage() 方法在画布上绘制图像、画布或视频。

drawImage() 方法也能够绘制图像的某些部分,以及/或者增加或减少图像的尺寸。

在画布上定位图像:

JavaScript 语法:context.drawImage(img,x,y);

在画布上定位图像,并规定图像的宽度和高度:

JavaScript 语法:context.drawImage(img,x,y,width,height);

剪切图像,并在画布上定位被剪切的部分:

JavaScript 语法:context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);

参数值

参数描述
img规定要使用的图像、画布或视频。 
sx可选。开始剪切的 x 坐标位置。
sy可选。开始剪切的 y 坐标位置。
swidth可选。被剪切图像的宽度。
sheight可选。被剪切图像的高度。
x在画布上放置图像的 x 坐标位置。
y在画布上放置图像的 y 坐标位置。
width可选。要使用的图像的宽度(伸展或缩小图像)。
height可选。要使用的图像的高度(伸展或缩小图像)。

 

toDataURL(type, encoderOptions)

二、参数

1、type:图片格式,默认为 image/png,可以是其他image/jpeg等

2、encoderOptions:0到1之间的取值,主要用来选定图片的质量,默认值是0.92,超出范围也会选择默认值。

三、返回值

返回值是一个数据url,是base64组成的图片的源数据、可以直接赋值给图片的src属性。

 

项目使用:

1.新建utils/imgUpload.js文件


import Router from '@/router/index';
const dataURLtoFile = (dataurl, filename) => { // 将base64转换为file文件
    let arr = dataurl.split(',')
    let mime = arr[0].match(/:(.*?);/)[1]
    let bstr = atob(arr[1])
    let n = bstr.length
    let u8arr = new Uint8Array(n)
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n)
    }
    return new File([u8arr], filename, { type: mime })
};

const imgZip = (file) => {
    var _this = this;
    let imgZipStatus = new Promise((resolve, reject) => {
        let canvas = document.createElement("canvas"); // 创建Canvas对象(画布)
        let context = canvas.getContext("2d");
        let img = new Image();
        img.src = file.content; // 指定图片的DataURL(图片的base64编码数据)
        var Orientation = '';
        img.onload = () => {
            let url = window.location.href.split('#')[1];
            console.log(Router.currentRoute.path)
            if(Router.currentRoute.path=="/center/myCenter"){
                canvas.width = 400;
                canvas.height = 300;
                context.drawImage(img, 0, 0, 400, 300);
            }else{
                canvas.width = img.width;
                canvas.height = img.height;
                context.drawImage(img, 0, 0, canvas.width, canvas.height);
            }
            //根据页面路径判断是否压缩质量,自行定义
            if(Router.currentRoute.path=="/forum"){
                file.content = canvas.toDataURL(file.file.type, 0.2); // 0.92为默认压缩质量
            }else{
                file.content = canvas.toDataURL(file.file.type, 0.5); // 0.92为默认压缩质量
            }
            
            let files = dataURLtoFile(file.content, file.file.name);
            resolve(files)
        }
    })
    return imgZipStatus;
};
export {
    imgZip,
}

2.main.js引入

// 引入imgUpload方法
import * as imgUpload from "./utils/imgUpload"
Vue.prototype.$imgUpload = imgUpload;

3.页面 中使用,图片上传,使用的有赞vant-ui,自行查看使用

this.$imgUpload.imgZip(file).then((resData) => {
        const formData = new FormData();
        formData.append("file", resData);
        // 请求接口上传图片到服务器
        uploadImg(formData).then((res) => {
          if (res.code == 200) {
            
            this.$toast("上传成功");
          } else {
            this.$toast(res.msg);
          }
});

最后点个关注,支持一下呗!

ad1f2260fd7a0a735205660eef074ef2.gif

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

船长在船上

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值