总结一下Android中Bitmap图片操作中要注意的地方

本文总结了在Android中处理Bitmap时应注意的关键点,包括使用decodeStream获取更节省内存的Bitmap,利用BitmapFactory.Options进行图片缩放和获取尺寸,以及调整图片编码格式以降低内存占用。手动回收Bitmap也是避免内存泄漏的重要步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/hjm4702192/article/details/7821519
http://blog.youkuaiyun.com/yan8024/article/details/6775033
http://yueguc.iteye.com/blog/1051966
http://blog.youkuaiyun.com/hjm4702192/article/details/7821519
http://www.cnblogs.com/coding-way/archive/2011/07/26/2117522.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值