当前位置: 首页 > article >正文

uniapp-图片压缩(适配H5,APP)

uniapp本身是自带压缩图片的方式的,但是他只适用于APP,做不到多端的适配,如果只考虑app,就非常容易实现了。
使用uni.compressImage()这个API即可

compressImage(url) {
	return new Promise((reslove, reject) => {
		   const tempFilePath = url //url是选中图片的路径
		   uni.compressImage({ 
		       src: tempFilePath,
		       quality: 50, //压缩的程度
		       success: (res) => {
					reslove(res.tempFilePath) //压缩成功返回的路径
		       },
		       fail: (error) => {
		            console.log('压缩失败', error)
		       }
		   })	
		})
	},

要适配H5和APP可以使用canvas的方式进行压缩
原理:按照需求等比例创建空白画布,将图片粘到画布上,最后保存画布的base64流

translate(imgSrc, scale) {
	//imgSrc:图片的路径
	//scale:缩放比例 0-1之间
	return new Promise((reslove, reject) => {
		var img = new Image(); //创建Image对象生成一个<img>标签
		img.src = imgSrc; //将图片路径赋给<img>标签的src
		img.onload = () => {//onload在图片加载成功后触发,在onload中完成压缩功能
			var h = img.height/2; // 获取原本图片的宽高
			var w = img.width/2;  //默认按比例压缩,根据需求修改
			var canvas = document.createElement('canvas');//创建画布
			var ctx = canvas.getContext('2d');  //设置为2d效果
			var width = document.createAttribute("width"); //创建属性节点
			width.nodeValue = w; //设置属性值
			var height = document.createAttribute("height");
			height.nodeValue = h;
			canvas.setAttributeNode(width); //设置画布宽高
			canvas.setAttributeNode(height);
			ctx.drawImage(img, 0, 0, w,h);//将图片贴到画布上
			//img:图片 0,0:粘贴的位置 w,h:粘贴图片的大小
			var base64 = canvas.toDataURL('image/png', scale);
			//'image/png':压缩返回图片的类型 scale:图片质量
			//如果要base64的流,可以直接将结果返回了
			canvas = null; //清除画布
			var blob = this.base64ToBlob(base64); //需要二进制流调用该方法拿到
			let blobUrl = window.URL.createObjectURL(blob);//blob地址
			reslove(blobUrl)
		}
	})
 },
// base64转Blob
base64ToBlob(base64) { 
	var arr = base64.split(','),
	mime = arr[0].match(/:(.*?);/)[1],
	bstr = atob(arr[1]),
	n = bstr.length,
	u8arr = new Uint8Array(n);
	while (n--) {
		u8arr[n] = bstr.charCodeAt(n);
	}
	return new Blob([u8arr],  {
		type: mime,
	});
},

http://www.kler.cn/a/108067.html

相关文章:

  • 随时随地编码:香橙派Zero3上安装Code Server远程开发指南
  • 申论1_概括、分析
  • [CKS] K8S NetworkPolicy Set Up
  • LabVIEW开发相机与显微镜自动对焦功能
  • 普通电脑上安装属于自己的Llama 3 大模型和对话客户端
  • 【前端学习指南】Vue computed 计算属性 watch 监听器
  • 10月Java行情 回暖?
  • 【机器学习可解释性】4.SHAP 值
  • 第10期 | GPTSecurity周报
  • scratch接钻石 2023年9月中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析
  • 力扣第763题 划分字母区间 c++ 哈希 + 双指针 + 小小贪心
  • 制作自己的前端组件库并上传到npm上
  • MySQL实战2
  • 华为c语言编程规范
  • 【Unity】RenderFeature应用(简单场景扫描效果)
  • Linux学习第26天:异步通知驱动开发: 主动
  • 基于Headless构建高可用spark+pyspark集群
  • React中useEffect Hook使用纠错
  • 大彩串口屏读写文件问题
  • Proteus仿真--从左往右流水灯仿真(仿真文件+程序)
  • React之如何捕获错误
  • PlantSimulation访问本地Excel文件的方法
  • 10分钟了解JWT令牌 (JSON Web)
  • 目标检测YOLO实战应用案例100讲-改进YOLOv4的遥感图像目标检测
  • STM32 APP跳转到Bootloader
  • 调试记录 单片机GD32F103C8T6(兆易创新) 程序烧写完成但是没有现象 (自己做的板子)