利用canvas图片压缩 转base64

由于业务需求 需要上传图片 但是一般相机拍照图片都比较大 10m左右  导致图片上传不上去,接口报错
索性将图片压缩一下。

话不多说直接上代码

file 图片地址(本地地址 链接我还没试过)
size 期望压缩大小

// 选择的file 图片地址  size 压缩目标大小kb
compressImage(file,size) {
				let self = this;
				return new Promise((resolve, reject) => {
					var quality = 0.5; //压缩系数0-1之间 
					var image = new Image();
					image.src = file; 
					image.onload = function() {
						// 创建canvas
						var canvas = document.createElement('canvas');
						// 获取上下文
						var ctx = canvas.getContext('2d'); 
						canvas.width = this.width;
						canvas.height = this.height; 
						ctx.clearRect(0, 0, canvas.width, canvas.height);
						ctx.drawImage(this, 0, 0, canvas.width, canvas.height);
						var base64Data = canvas.toDataURL("image/jpeg",1); //压缩语句
						if( base64Data.length / 1024 > size ){
							//如想确保图片压缩到自己想要的尺寸,如要求在50-150kb之间, 
							while (base64Data.length / 1024 > size) {
								quality -= 0.01;
								base64Data = canvas.toDataURL("image/jpeg", quality);
							} 
						}  
						console.log("文件大小:" + base64Data.length / 1024,'kb左右'); 
						resolve(base64Data)
					}
				})
			},

调用(这个过程可能需要1 ~ 2秒时间 可以加一个Loading缓解一下尴尬)

this.compressImage(res.tempFilePaths[0],400).then(res=>{
	console.log('最终结果',res)
	this.iconBase64 = res
	// 拿到结果 取消加载
})

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 JavaScript 的 FileReader 和 Canvas API 实现图片压缩换为 base64 编码。 首先,使用 FileReader 将图片读取为 Blob 对象,然后使用 Canvas API 将图片压缩为指定的宽度和高度,最后将压缩后的图片换为 base64 编码。 以下是一个示例代码: ``` function compressAndConvertToBase64(file, maxWidth, maxHeight, callback) { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function(event) { const img = new Image(); img.src = event.target.result; img.onload = function() { const canvas = document.createElement('canvas'); let width = img.width; let height = img.height; if (width > height) { if (width > maxWidth) { height *= maxWidth / width; width = maxWidth; } } else { if (height > maxHeight) { width *= maxHeight / height; height = maxHeight; } } canvas.width = width; canvas.height = height; const ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0, width, height); const compressedBase64 = canvas.toDataURL('image/jpeg', 0.7); callback(compressedBase64); } } } ``` 其中,参数 `file` 是要压缩图片文件,`maxWidth` 和 `maxHeight` 分别是压缩后的图片最大宽度和高度,`callback` 是压缩完成后的回调函数。压缩后的图片质量可以通过 `toDataURL` 方法的第二个参数来控制,值越小表示压缩后的图片质量越低。 使用示例: ``` const fileInput = document.querySelector('#file-input'); fileInput.addEventListener('change', function() { const file = fileInput.files[0]; compressAndConvertToBase64(file, 800, 600, function(base64) { console.log(base64); }); }); ``` 以上代码可以将选择的文件压缩为最大宽度为 800、最大高度为 600 的图片,并将压缩后的图片换为 base64 编码输出到控制台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值