layui在上传图片在前端处理图片压缩

有的人会遇到需要在前端代码处理图片压缩的问题,下面给大家分享怎么处理。

// 上传图片

var image_src

var IsImgDeal=false;

layui.upload.render({

elem: "#{tag}{id}",

url: sessionStorage.getItem('httpUrlPrefix') + '/upload/uploadImage',

// dataType: 'text',

// auto: false,

// multiple: true,

accept:"images",

exts: 'jpg|png|jpeg',

acceptMime:"image/jpeg,image/png",

before: function (obj) {

layer.msg("图片上传中...", { icon: 16, shade: 0.01 })

},

done: function(res){

layer.msg(`<div style="display:flex;"><div class="tipsSuccess"></div>

<div class="titleTips">提示

</div>

</div>

<div class="context" ><br>上传成功!</div>`

, {

skin: 'success-class',

time: 1000

});

layer.closeAll('loading'); //关闭loading

console.log("sfafasfa",JSON.stringify(res))

image_src = res.url

IsImgDeal = false;

},

choose: function (obj) {

obj.preview(function (index, file, result) {

console.log("================>",file)

let filename = file.name

// console.log("================>",result)

//临时存储二进制流

$("#uploadnewImg-{id}").hide()

$("#uploadexistimg-{id}").show()

$("#uploadImg-{id}").attr("src", result);

});

if (IsImgDeal) {

return;//图片处理过就直接上传

}

console.log("图片压缩开始处理");

var files = obj.pushFile();

var file_tar = null,index_tar = null;

for (var k in files) {

index_tar = k;

file_tar = files[k];

break;

}

//进行图片压缩,直接百度压缩方法

let reader = new FileReader();

var filename = file_tar.name;

reader.readAsDataURL(file_tar);

reader.onload = function () {

let content = this.result; //图片的src,base64格式

let img = new Image();

img.src = content;

img.onload = function () { //图片加载完毕

let canvas = document.createElement("canvas");

let ctx = canvas.getContext('2d');

let width = Math.ceil(img.width*0.8);

let height = Math.ceil(img.height*0.8);

canvas.width = width;

canvas.height = height;

ctx.drawImage(img, 0, 0, width, height);//压缩图片尺寸

let dataURL = canvas.toDataURL("image/jpeg");//如果是需要质量压缩就补充参数

//将base64数据转化为文件对象

var arr = dataURL.split(','), mime = arr[0].match(/:(.*?);/)[1],

bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);

while (n--) {

u8arr[n] = bstr.charCodeAt(n);

}

IsImgDeal = true;//设置标记

//如果有时差问题,后面setTimeout延时再执行,让原来的上传终止

obj.upload(index_tar, new File([new Blob([u8arr], { type: mime })], filename));//单独上传

//uploadIns.upload();//重新启动全部文件上传

}

};

layer.load(); //上传loading

//停止原本的上传,如果多个文件,需要在读取完毕后将files里面的文件队列全删除。

return delete files[index_tar];

},

});

相关推荐
Moment5 小时前
Vibe Coding 时代,到底该选什么样的工具来提升效率❓❓❓
前端·后端·github
IT_陈寒6 小时前
SpringBoot性能飙升200%?这5个隐藏配置你必须知道!
前端·人工智能·后端
小时前端7 小时前
React性能优化的完整方法论,附赠大厂面试通关技巧
前端·react.js
Nicko7 小时前
Jetpack Compose BOM 2026.02.01 解读与升级指南
前端
小蜜蜂dry7 小时前
nestjs学习 - 控制器、提供者、模块
前端·node.js·nestjs
优秀稳妥的JiaJi7 小时前
基于腾讯地图实现电子围栏绘制与校验
前端·vue.js·前端框架
前端开发呀8 小时前
从 qiankun(乾坤) 迁移到 Module Federation(模块联邦),对MF只能说相见恨晚!
前端
Lee川8 小时前
深度解构JavaScript:作用域链与闭包的内存全景图
javascript·面试
没想好d8 小时前
通用管理后台组件库-10-表单组件
前端
恋猫de小郭8 小时前
你用的 Claude 可能是虚假 Claude ,论文数据告诉你,Shadow API 中的欺骗性模型声明
前端·人工智能·ai编程