欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

浅谈Android加载大图片到Bitmap,,比如设置BitmapFa

来源: 开发者 投稿于  被查看 34909 次 评论:111

浅谈Android加载大图片到Bitmap,,比如设置BitmapFa


本文只是一个补充,网上对于解决图片内存溢出的文章很多,很多都写得很好、很详细。

比如设置BitmapFactory.Options参数,options.inJustDecodeBounds或options.inSampleSize参数,来将图片缩小加载到Bitmap中。这样就有个问题,一般的图片都是美工定制的图片,大小正合适的,我为啥要缩小那,除非是一些通用性比较强的图片。


如果不缩小如何使Bitmap(位图)变小那,首先看下bitmap的大小是如何计算的:


位图的大小

Bitmap图片在加载到内存的时候是按照:宽 * 高 * 像素点位数来计算的,或者是:像素点数 * 像素点位数。像素点数就是宽*高。像素点位数,又叫位深度,是计算机表示每个像素点需要的位数。

比如我这有张图片62 x 62 的,即宽是62,高也是62:

weixin.png


像素点位数可以从这看:

aaaa.png

位深度为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 ,Green(G)值占6个bites ,Blue(B)值占5个bites,共16bites,即2个字节. 像素位数为16
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是完全可以的。这样至少能将图片大小缩小一倍。


用户评论