• 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)
    		       }
    		   })	
    		})
    	},
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

    translate(imgSrc, scale) {
    	//imgSrc:图片的路径
    	//scale:缩放比例 0-1之间
    	return new Promise((reslove, reject) => {
    		var img = new Image(); //创建Image对象生成一个标签
    		img.src = imgSrc; //将图片路径赋给标签的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,
    	});
    },
    
    • 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
  • 相关阅读:
    Lua系列文章(1)---Lua5.4参考手册学习总结
    还不会用springboot写接口?快看这里,手把手操作,一发入魂~
    Nacos启动报错:Unsatisfied dependency expressed through field ‘jwtTokenManager‘
    【JavaScript】-- 继承
    关于GBDT算法、XGBoost算法的基本原理概述
    【情态动词练习题】Can / Could you
    java中的File类(文件操控者)
    2023年亚太杯APMCM数学建模大赛ABC题辅导及组队
    基于spring boot开发的快递管理系统开题报告
    Java面试题:Java中垃圾回收机制是如何工作的?请描述几种常见的垃圾回收算法
  • 原文地址:https://blog.csdn.net/low666/article/details/134069161