如何有效使用bitmap

本文讨论了在Android应用中使用Bitmap时可能导致的内存溢出问题,并提供了节省内存的方法,包括减小Bitmap大小、避免在UI线程中进行图片解码以及使用AsyncTask进行异步解码。

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

使用bitmap容易遭遇out of memory exception,主要由以下三个原因:

每个android app分配的内存有限;

bitmap比较耗费内存,例如1300w像素图片,每个像素可能占4个字节;

有些view group例如list view,grid view中可能包含很多bitmap。


综上,使用bitmap时主要考虑节省内存,方式主要是减小bitmap的大小,因为UI上的image view往往不是太大,所以可以缩小bitmap,

(另外,当你从文件,硬盘,网络上decode图片时,不要在UI thread执行,可以放在async task中)

上一篇文章拍照的code里面其实已经包含了这部分内容。

/* Get the size of the ImageView */
int targetW = mImageView.getWidth();
int targetH = mImageView.getHeight();
/* Get the size of the image */
BitmapFactory.Options bmOptions = new BitmapFactory.Options();

 //设置BitmapFactory.Option中的这个选项为true,这样在decode的时候会暂不分配内存,只会拿到原来图片的大小
bmOptions.inJustDecodeBounds = true;
//有一系列的decode方法,用来从不同的源decode出图片,decodeFile是从文件中decode出图片

BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
//根据图片大小和image view的确定缩小比例

int scaleFactor = 1;
if ((targetW > 0) || (targetH > 0)) {
scaleFactor = Math.min(photoW/targetW, photoH/targetH);
}

/* Set bitmap options to scale the image decode target */
bmOptions.inJustDecodeBounds = false;//把这个值设置为false重新decode,这样会真正分配内存
bmOptions.inSampleSize = scaleFactor;//缩小比例,如果为2,那长宽都变成原来的一半,面积是原来1/4
bmOptions.inPurgeable = true;

/* Decode the JPEG file into a Bitmap */
Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);




### 如何在Redis中使用Bitmap #### Bitmap简介 Bitmap是一种高效的数据结构,用于处理位级别的操作。通过设置和获取特定位置的比特值来实现高效的内存管理和快速查询。 #### 基本命令介绍 为了有效利用Bitmap,在Redis中有几个核心命令可以用来操作这些位图: - **SETBIT key offset value**: 设置键`key`中的偏移量`offset`处的位为指定的布尔值`value`(0 或 1)[^1]。 - **GETBIT key offset**: 获取键`key`中给定偏移量`offset`上的位值[^1]。 - **BITCOUNT key [start end]**: 计算位于`key`所指向字符串内被设定位的数量(即计算'1'的数量),可选参数[start end]表示范围。 - **BITOP operation destKey srcKey [srcKey ...]**: 执行按位逻辑运算(`AND`, `OR`, `XOR`)并将结果存储到目标键`destKey`中;源键可以是一个或多个。 #### 实际应用案例 假设有一个场景需要记录某天有多少用户访问过网站,并且要知道具体哪些用户的ID曾经登录过,则可以通过以下方式使用BitMap: ```python import redis r = redis.Redis(host='localhost', port=6379, db=0) def record_user_login(user_id): day_key = f"user_logins:{datetime.now().strftime('%Y-%m-%d')}" r.setbit(day_key, user_id, 1) def check_if_logged_in_today(user_id): day_key = f"user_logins:{datetime.now().strftime('%Y-%m-%d')}" return bool(r.getbit(day_key, user_id)) ``` 此代码片段展示了如何基于日期创建不同的键名以便于区分不同日子的情况,以及怎样标记和检查单个用户的登陆状态。 #### 关联配置文件说明 对于更复杂的部署环境,可能涉及到跨服务器共享相同的配置项等问题时,可以在redis.conf里加入INCLUDE指令引入外部配置文件[^2]。这有助于维护统一的标准模板并允许针对每台机器做个性化调整而不必修改主配置文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值