1. 使用decodeStream获取Bitmap
ImageView.setImageBitmap、ImageView.setImageResource、BitmapFactory.decodeResource: 通过Java层的createBitmap完成,消耗更多内存
BitmapFactory.decodeStream: JNI >> nativeDecodeAsset,更加节约内存
InputStream is = getResources().openRawResource(R.drawable.pic); Bitmap bitmap = BitmapFactory.decodeStream(is);
注:decodeStream方法得到的Bitmap长宽是其他方法的1/2,等于原图的长宽像素值。具体原因不清楚。
2. Decode时使用BitmapFactory.Options参数
a)Options.inSampleSize, 成比例放缩
BitmapFactory.Options ops = new BitmapFactory.Options(); ops.inSampleSize = 2; // 取样比例,得到的结果长宽是原图的1/2 Bitmap bitmap = BitmapFactory.decodeStream(is, null, ops);
b)Options.inJustDecodeBounds,只获取长宽,不获取图片
BitmapFactory.Options ops = new BitmapFactory.Options(); ops.inJustDecodeBounds = true; // 只解码边界值(长宽) Bitmap bitmap = BitmapFactory.decodeStream(is, null, ops); // 此处得到的Bitmap为null int bmpWidth = ops.outWidth; // 原始图片的宽度 int bmpHeight = ops.outHeight; // 原始图片的高度
注:奇怪的是,只获取长宽的话,几种方法获得的大小都一样,等于decodeStream获取的长宽值,也是图片的原长宽值。
c)Options.inPreferredConfig,修改图片编码格式(默认是Bitmap.Config.ARGB_8888)
编码方式有:(ARGB分别代表透明度、红、绿、蓝)
Bitmap.Config ALPHA_8 占8位(具体情况不清楚)
Bitmap.Config ARGB_4444 占16位(ARGB各4位)
Bitmap.Config ARGB_8888 占32位(ARGB各8位)
Bitmap.Config RGB_565 占16位(R5位G6位B5位)
d)其他
/* 下面两个字段需要组合使用 */ options.inPurgeable = true; options.inInputShareable = true;
3. 手动回收Bitmap
if(!bitmap.isRecycled()) { bitmap.recycle(); }
【参考文章】
http://blog.csdn.net/hjm4702192/article/details/7821519
http://blog.csdn.net/yan8024/article/details/6775033
http://yueguc.iteye.com/blog/1051966
http://blog.csdn.net/hjm4702192/article/details/7821519
http://www.cnblogs.com/coding-way/archive/2011/07/26/2117522.html