减小小程序因图片占内存
发布于 4 年前 作者 yanxie 4229 次浏览 来自 分享

第一次写小程序,图片的路径一般都是放在文件的本地路径,使用起来还是方便的,但是在提交小程序或者是在真机预览测试时,就出现了内存超过2M而不让发布或者预览,所以我想到的就是将图片都换成网络路径来使用,从而减少本地因为图片所占的内存。

但是更换过程中有因为我的程序中大量使用了 画布(canvas),导致一些放在画布里面的图片不能直接使用网络路径,开始我觉得没什么事情,大不了就把这一部分都放到本地文件里,但是后来我发现我使用的画布图片越来越多了,本地文件的内存又一次达到了顶峰,所以就查了很多资料,问了大佬们的意见,最后发现可以使用wx.getImageInfo来将网络路径的图片转换成本地路径,来往画布里面放。接下来就有了一系列的操作

如果画布里面只有一张图片的话我们就可以这样

wx.getImageInfo({
// 这里的路径也可以事先在data里面定义好,然后这里就可以直接调用了
    src: '图片的网络路径',
    success:(res) =>{
    	console.log('res::',res)
    	ctx.drawImage(res.path,x,y,w,h);
    	...
    	ctx.draw(); //输出到画布中
    }
})

如果有多张图片,而且每张图片的位置都不一样的话

wx.getImageInfo({
	src: '第一张图片的网络路径',
	success:(res1) =>{
		console.log('res1::',res1)
		wx.getImageInfo({
      			src: '第二张图片的网络路径',
      			success:(res2) =>{
      				console.log('res2::',res2)
      				ctx.drawImage(res1.path,x,y,w,h);
      				ctx.drawImage(res2.path,x,y,w,h); 
      				...
      				ctx.draw(); //输出到画布中
      			}
      		})
      	}
})

如果需要的图片过多的话,刚好他们的位置一样,就可以直接定义数组,然后遍历出来,去使用,这个我就不再举例子了

因为我的这个案例写的比较的绕路,总之就是多张图片就可以使用数组,然后在使用时去遍历使用

还有什么更好的办法,欢迎各位留言评论,以上是我的分享

2 回复
你这样写,会进入回调地狱。你应该单独将wx.getImageInfo二次封装,或者直接wx.getImageInfo的Promise写法,用await/async 把异步改为同步,每次返回路径之后,再用drawImage把图片画到画布里面

使用网络图片代替本地文件图片,减少小程序的使用内存。

使用wx.getImageInfo来解决画布(canvas)不能使用直接使用网络图片的问题。

回到顶部