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];

},

});

相关推荐
薛定猫AI3 小时前
【深度解析】Gemma Chat 本地 AI 编程 Agent:Electron + MLX + 开源模型的离线 Vibe Coding 实战
javascript·人工智能·electron
kyriewen3 小时前
Webpack vs Vite:一个是“老黄牛”,一个是“猎豹”,你选谁?
前端·webpack·vite
打小就很皮...3 小时前
html2canvas + jsPDF 生成 PDF 的踩坑与解决方案总结
前端·pdf
全栈前端老曹3 小时前
【前端地图】多地图平台适配方案——高德、百度、腾讯、Google Maps SDK 差异对比、封装统一地图接口
前端·javascript·百度·dubbo·wgs84·gcj-02·bd09
笑虾4 小时前
Win10 修改注册表 让鼠标悬停PNG上时 tip 始终显示分辨率
开发语言·javascript·ecmascript
雾岛听风6914 小时前
JavaScript基础语法速查手册
开发语言·前端·javascript
遇见~未来4 小时前
第三篇_现代布局_从弹性到网格
前端·css3
前端那点事4 小时前
Vue前端SEO优化全攻略(实操落地版,新手也能上手)
前端·vue.js
Dxy12393102164 小时前
HTML 如何使用 SVG 画曲线
前端·算法·html
用户2367829801684 小时前
从零实现 GIF 制作工具:LZW 压缩与 Median Cut 色彩量化
前端·javascript