Android程序处理图片常常会OOM,有时候我们处理2、3M的图片就会内存溢出。但是我们的手机还有更多的运存。
Android 虚拟机默认为每个应用分配16M堆内存。ps:google原生OS的默认值是16M,但是各个厂家的OS会对这个值进行修改。
我们在看下图片显示手机需要多大内存:当在界面显示图片时,需要的内存空间不是按图片的实际大小来计算的,而是按像素点的多少乘以每个像素点占用的空间大小来计算的。
像素表现有三种模式:
1. ARGB_4444 :A(Alpha)透明度占4位精度,R(Red)红色占4位精度,G(Green)绿色占4位精度,B(Blue)蓝色占4位精度。总共占16位,正好2个字节。也就是一个像素占2个字节的内存。同时存储位图的透明度和颜色信息。图片质量较差。
2.ARGB_8888 : A(Alpha)透明度占8位精度,R(Red)红色占8位精度,G(Green)绿色占8位精度,B(Blue)蓝色占8位精度。也就是一个像素占4个字节的内存。同时存储位图的透明度和颜色信息。图片质量较好。
3. RGB_565 : R(Red)红色占5位精度,G(Green)绿色占6位精度,B(Blue)蓝色占5位精度,一共是16位精度,总共2个字节。存储的只是颜色信息,没有透明度信息。
当前有一张图片,大小仅为1M,但是其规格(图片的像素)为3648*2736。
那么它在
ARGB_4444模式下是:3648*2736*2bytes=19961856bytes=19M。
ARGB_8888模式下是:3648*2736*4bytes=38M。
RGB_565模式下是:3648*2736*2bytes=19M。
所以在Android默认分配下处理内存16M不够用,有些厂商会自定义。一旦超出这个值就会内存溢出。
解决办法:等比缩放图片
假设:
图片的宽和高: 3648 * 2736
屏幕的宽和高: 320 * 480
计算缩放比:
宽度缩放比例: 3648 / 320 = 11
高度缩放比例: 2736 / 480 = 5
比较宽和高的缩放比例,哪一个大用哪一个进行缩放,因此我们采用11 作为该图片长和高的缩放比例。
计算缩放后的图片的宽和高:
宽=3648 / 11 = 331
高=2736 / 11 = 248
缩放后图片的宽和高: 331* 248
网友评论