后端为了方便需要直接将图片存储为base64,但图片过大时转出的base64过长,因此前端需要对转后的base64进行压缩
话不多说,直接上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
   | /**  *   * @param {需要转换的图片file} file   * @param {是否返回压缩后的base64} isCompression   * @param {转换成功后通过回调函数将结果返回} callback   */ export function imageToBase64(file, isCompression, callback) { 	// 判断图片类型 	if (file.type == 'image/jpeg' || file.type == 'image/png' || file.type == 'image/jpg') { 		var isJpg = true 	} else { 		jsJpg = false 	}
  	// 判断图片大小 	const isLt2M = file.size / 1024 / 1024 < 2 	if (!isJpg) { 		this.$message.error('上传图片只能是jpg/png/jepg格式') 	} 	if (!isLt2M) { 		this.$message.error('上传图片大小不能超过2M') 	}
  	// 创建一个HTML5的FileReader对象 	var reader = new FileReader() 	// 创建一个img对象 	var img = new Image() 	// let filename = file.filename 	if (file) { 		reader.readAsDataURL(file) 	} 	if (isJpg && isLt2M) { 		reader.onload=(e)=>{ 			// let base64Str = reader.result.split[','][1] 			img.src = e.target.result 			// base64地址图片加载完毕后执行 			img.onload = function() { 				// 缩放图片需要canvas(也可以在DOM中直接定义canvas标签,这样就能把压缩完的图片不转base64也能直接显示出来) 				var canvas = document.createElement('canvas') 				var context = canvas.getContext('2d') 				// 图片原始尺寸 				var originWidth = this.width 				var originHeight = this.height 				// 最大尺寸限制,可通过设置宽高来实现图片压缩程度 				var maxWidth = 300, 					maxHeight = 300 				// 目标尺寸 				var targetWidth = originWidth 					targetHeight = originHeight 				// 图片尺寸超过最大尺寸限制 				if(originWidth > maxWidth || originHeight > maxHeight) { 					if (originWidth / originHeight > maxWidth / maxHeight) { 						// 更改宽度,按照宽度限定尺寸 						targetWidth = maxWidth 						targetHeight = Math.round(maxWidth*(originHeight/originWidth)) 					} else { 						targetHeight = maxHeight 						targetWidth = Math.round(maxHeight*(originWidth/originHeight)) 					} 				} 				// 对图片进行缩放 				canvas.width = targetWidth 				canvas.height = targetHeight 				// 清除画布 				context.clearRect(0, 0, targetWidth, targetHeight) 				/** 图片压缩 				 * 第一个参数是创建的img对象 				 * 第二三个参数是左上角坐标 				 * 后两个参数是画布区域宽高 				 */ 				context.drawImage(img, 0, 0, targetWidth, targetHeight) 				/** 压缩后的base64文件 				 * 第一个参数可以为image/jpeg或image/webp类型的图片 				 * 第二个参数设置图片质量取值0-1,超出则以默认值0.92替代 				 */ 				var newUrl = canvas.toDataURL('image/jpeg', 0.02) 				if (isCompression) { // 返回压缩后的base64 					callback(newUrl) 				} else { // 返回不压缩的base64 					callback(e.target.result) 				} 			} 		} 	} }
   |