工作-根据base64或者url获取图片字节大小

背景

在上传图片时,发现如果图片过大,传给后端时会出现数据丢失的情况。如果统一压缩处理,又会出现原本很小的文件再次压缩导致图片严重失真。

结合诸多背景,就需要在根据网络url或者base64拿到图片大小。
再根据大小考虑是否需要压缩。

参考一些文章,总结以下几种拿到图片大小的方式,方便后续自己使用:

  • 通过请求的content-length
  • 通过访问这个网络资源
  • 通过base64的长度
  • 通过生成img之后在load方法拿到size

下面挨个说下这几种方法:

1、通过请求的content-length

var xhr = new XMLHttpRequest();
xhr.open('HEAD', 'img/test.jpg', true);
xhr.onreadystatechange = function(){
  if ( xhr.readyState == 4 ) {
    if ( xhr.status == 200 ) {
      alert('Size in bytes: ' + xhr.getResponseHeader('Content-Length'));
    } else {
      alert('ERROR');
    }
  }
};
xhr.send(null);

2、通过访问这个网络资源

function getImageSizeInBytes(imgURL) {
    var request = new XMLHttpRequest();
    request.open("HEAD", imgURL, false);
    request.send(null);
    var headerText = request.getAllResponseHeaders();
    var re = /Content\-Length\s*:\s*(\d+)/i;
    re.exec(headerText);
    return parseInt(RegExp.$1);
  }
    
  var picLink = "https://img.alicdn.com/tfs/TB1ZUuMgb9YBuNjy0FgXXcxcXXa-298-170.png";
  var size = this.getImageSizeInBytes(picLink);
  var size_image = size / 1000;

3、通过base64的长度

这种方式我试了下并不想博客说的偏差很小,我的反而偏差很大,不知道为什么。

Base64编码要求把3个8位字节(38=24)转化为4个6位的字节(46=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用’=’,因此编码后输出的文本末尾可能会出现1或2个’=’

getImgByteSize(data) {
	if (data.graphicContents) { // 获取base64图片byte大小
		const equalIndex = data.graphicContents.indexOf('=');  // 获取=号下标
		if (equalIndex > 0) {
			const str = data.graphicContents.substring(0, equalIndex); // 去除=号
			const strLength = str.length;
			const fileLength = strLength - (strLength / 8) * 2; // 真实的图片byte大小
			data.size = Math.floor(fileLength); // 向下取整
		} else {
			const strLength = data.graphicContents.length;
			const fileLength = strLength - (strLength / 8) * 2;
			data.size = Math.floor(fileLength); // 向下取整
		}
	} else {
		data.size = null;
	}
	}

4、通过生成img之后在load方法拿到size

这种方式我试了下,哇 拿到的速度好慢。。反正感觉也不好用

let url = 'url';
const canvas = document.getElementById('canvas');
let ctx = null;
var img = new Image();
img.src = url;
img.setAttribute('crossorigin', 'anonymous'); // 设置图片跨域应该在图片加载之前
img.onload = function(e) {
	//将图片的绝对宽高绘制在canvas上
	canvas.width = img.width;
	canvas.height = img.height;
	ctx = canvas.getContext('2d');
	ctx.drawImage(img,0,0);
	canvas.toBlob(function(res){
		console.log(res.size);//图片真实存储大小
	},'image/jpeg',1)
	let base64 = canvas.toDataURL('image/jpeg', 1);
}

总结

有遇到同样问题的小伙伴,可以参考下,对base64等等我了解也不是特别深,有机会搞清楚这些东东。。


版权声明:本文为weixin_46254175原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>