本文只是一个补充,网上对于解决图片内存溢出的文章很多,很多都写得很好、很详细。
比如设置BitmapFactory.Options参数,options.inJustDecodeBounds或options.inSampleSize参数,来将图片缩小加载到Bitmap中。这样就有个问题,一般的图片都是美工定制的图片,大小正合适的,我为啥要缩小那,除非是一些通用性比较强的图片。
如果不缩小如何使Bitmap(位图)变小那,首先看下bitmap的大小是如何计算的:
位图的大小
Bitmap图片在加载到内存的时候是按照:宽 * 高 * 像素点位数来计算的,或者是:像素点数 * 像素点位数。像素点数就是宽*高。像素点位数,又叫位深度,是计算机表示每个像素点需要的位数。
比如我这有张图片62 x 62 的,即宽是62,高也是62:
像素点位数可以从这看:
位深度为8,即像素点位数为8。 Bitmap(位图)的大小就是:62 * 62 * 8 = 30752位,即3844个字节。
但是有一点是Android并不是按照图片实际的像素位数来加载的。
像素位数的确定实际是按照像素的编码模式来的,android中可以使用4种模式:Config.ALPHA_8、Config.RGB_565、Config.ARGB_4444、Config.ARGB_8888。如下:
Config.ALPHA_8 | 此时图片只有alpha值,没有RGB值,一个像素占用一个字节, 像素位数为8 |
Config.RGB_565 | 一个像素占用2个字节,没有alpha(A)值,即不支持透明和半透明,Red(R)值占5个bites |
Config.ARGB_4444 | 一个像素占用2个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占4个bites。像素位数为16 |
Config.ARGB_8888 | 一个像素占用4个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占8个bites。像素位数为32 |
利用BitmapFactory加载(解码)图片时有个BitmapFactory.Options类型的参数opts,opts.inPreferredConfig 就是用于设置加载图片需要采用的像素编码模式(像素位数)。如:
opts.inPreferredConfig = Config.ARGB_4444或opts.inPreferredConfig = Config.ARGB_8888。
如果不设opts.inPreferredConfig参数,android默认是采用Config.ARGB_8888,即按像素位数32来加载的,而不管你图片实际的像素位数是多少。这样上面的图片实际加载到Bitmap的大小是:62 * 62 * 32 = 123008位,空间大了4倍。
所以说,如果在不缩小图片的情况下,如何降低位图大小就是要降低像素位数的大小。一般图片,除非特别严格的,使用Config.ARGB_4444或Config.RGB_565是完全可以的。这样至少能将图片大小缩小一倍。