android Bitmap使用技巧

本文介绍了Android中Bitmap的创建方式、内存占用计算方法及优化技巧,包括不同配置下的内存消耗对比、图片信息预读取、图片尺寸压缩和格式转换等。

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

转自: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;

2.图片压缩处理

读取 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);

3.图片格式转换,降低内存消耗

相比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();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值