//img:图片文件
//maxW最大宽度
//maxH最大高度
const resizeMe = (img, maxW, maxH, nocheck) => {
const browser = {
versions: function () {
var u = navigator.userAgent;
return {
trident: u.indexOf('Trident') > -1, //IE内核
presto: u.indexOf('Presto') > -1, //opera内核
webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1,//火狐内核
mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或者uc浏览器
iPhone: u.indexOf('iPhone') > -1, //是否为iPhone或者QQHD浏览器
iPad: u.indexOf('iPad') > -1, //是否iPad
webApp: u.indexOf('Safari') == -1, //是否web应该程序,没有头部与底部
weixin: u.toLowerCase().match(/MicroMessenger/i) == 'micromessenger', //是否微信
qq: u.match(/\sQQ/i) == " qq" //是否QQ
};
}()
};
var canvas = document.createElement('canvas');
var width = img.width;
var height = img.height;
var max_width = maxW || 640;
var max_height = maxH || 640;
var max_size = 5120;//k
if (width > max_width) {
height *= max_width / width;
height = Math.round(height);
width = max_width;
}
if (height > max_height) {
width *= max_height / height;
width = Math.round(width);
height = max_height;
}
//将图片放入canvas,并重置canvas大小
if (browser.versions.ios || browser.versions.webApp) {
var mpImg = new MegaPixImage(img);
canvas.width = width;
canvas.height = height;
mpImg.render(canvas, {width: width, height: height});
} else {
canvas.width = width;
canvas.height = height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0, width, height);
}
var res, quality = .7, resSize, ratio = 1;
res = canvas.toDataURL("image/jpeg", quality); // 截取canvas对应的jpg图片,并且画质为70%(默认就是70%,可以改变)
// Android 2.x、Android 4.1.2、4.3 的 toDataURL 不支持jpeg格式;
if (res.substr(0, "data:image/png".length) == "data:image/png" || res.substr(0, 6) == "data:,") {
var encoder = new JPEGEncoder();
res = encoder.encode(canvas.getContext("2d").getImageData(0, 0, width, height), quality * 100, true);
}
resSize = Math.ceil(res.length / 1024); //k
if (resSize > max_size && !nocheck) {
ratio = Math.ceil(Math.sqrt(max_size / resSize) * 100) / 100;
if (ratio >= .9) {
ratio -= .1;
}
res = resizeMe(img, max_width * ratio, max_height * ratio, true);
}
return res;
}
前端压缩图片
最新推荐文章于 2024-10-15 14:00:48 发布
该博客内容涉及图片处理技术,主要介绍了一种名为`resizeMe`的JavaScript函数,用于根据最大宽度和高度限制来调整图片尺寸。函数首先判断浏览器内核,然后使用canvas进行图片压缩,特别考虑了iOS和WebApp的情况。此外,针对不同设备和图片大小,函数还进行了质量调整和大小优化,确保图片不会过大并适应不同平台的需求。
摘要由CSDN通过智能技术生成