转自:http://www.netfoucs.com/article/wangpeifeng669/100219.html
(一)创建图片Bitmap的类型
BitmapFactory.Options代表Bitmap存储的方式
ALPHA_8 | 只有alpha值,占1字节 |
ARGB_4444 | 不推荐,ARGB各占4bits,共占2字节 |
ARGB_8888 | 默认保存方式,ARGB各占8bits,共占4字节 |
RGB_565 | 没alpha值,共占2字节 |
(二)Bitmap占用内存大小
Android中一张图片(BitMap)占用的内存主要和以下几个因数有关:图片长度,图片宽度,单位像素占用的字节数。
一张图片(BitMap)占用的内存=图片长度*图片宽度*单位像素占用的字节数
注:图片长度和图片宽度的单位是像素。
比如一张400*560的图片,以ARGB_8888显示,占用内存为400*560*4=869000字节。
也可以通过程序获取Bitmap占用内存
protected int bitmapSizeOf(Bitmap data) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1) { return data.getRowBytes() * data.getHeight(); } else { return data.getByteCount(); } }
(三)Bitmap处理技巧
1.不加载Bitmap获取图片信息
通过inJustDecodeBounds参数,设置不加载图片,可以获取到图片宽高
BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, bmOptions); int photoW = bmOptions.outWidth; int photoH = bmOptions.outHeight;
读取 drawable 下名为 pic 图片的缩略图,长度、宽度都只有原图片的 1/2。图片大小减少,占用的内存自然也变小了。这么做的弊端是图片质量变差,inSampleSize 的值越大,图片的质量就越差。
InputStream is = this.getResources().openRawResource(R.drawable.pic); BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = false;options.inSampleSize = 2; Bitmap btp =BitmapFactory.decodeStream(is,null,options);
相比ARGB_8888加载方式,内存消耗降低一半。
BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferredConfig = Bitmap.Config.RGB_565; opt.inPurgeable = true; opt.inInputShareable = true; // 获取资源图片 InputStream is = context.getResources().openRawResource(resId); return BitmapFactory.decodeStream(is,null,opt);
4.图片不需要继续使用即时回收
Bitmap类的构造方法都是私有的,所以开发者不能直接new出一个Bitmap对象,只能通过BitmapFactory类的各种静态方法来实例化一个Bitmap,生成Bitmap对象最终都是通过JNI调用方式实现的。所以,加载Bitmap到内存里以后,包含两部分内存区域的,
一部分是Java部分的,一部分是C部分的。所以需要调用recycle()方法来释放C部分的内存。
// 先判断是否已经回收 if(bitmap != null && !bitmap.isRecycled()){ // 回收并且置为null bitmap.recycle(); bitmap = null; } System.gc();