Android bitmap讲解与实践

本文详细介绍了Android中Bitmap的创建、操作及内存管理方法,包括BitmapFactory的使用技巧和注意事项。

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

一、概述



          bitmap 相信我们在 android 开发中都不陌生,那么这个 bitmap 到底是什么呢,总结起来就是两个字:位图。

     bitmap可以对图片进行裁剪,缩放,旋转等操作,在 Android 图像处理中有着非常重要的地位。



二、Bitmap 的创建



          说到 bitmap ,首先要说一下这个 bitmapDrawable ,这个 BitmapDrawable 是管理和存储 bitmap 的一个类。

     下面看一段代码:     
BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap);
        bitmap = bitmapDrawable.getBitmap();

          可以看到 bitmap 和 bitmapDrawable 之间的转换是非常轻松的。其实 bitmapDrawable 中还有很多方法获取一些信息。
     例如是否过滤,位置信息,是否抗锯齿等。

          说完了 bitmapDrawable,下面说一下 bitmap 的创建。bitmap 的大部分创建都是由 BitmapFactory 来完成的,不过 bitmap 自      身也是可以创建 bitmap 的。


     下面看一段代码:
Bitmap bitmap1 = Bitmap.createBitmap(bitmap,1,1,40,40);
                ivSeePicture.setImageBitmap(Bitmap.createScaledBitmap(bitmap,400,400,true)); //这个false作用是是否需要过滤

第一个方法创建 bitmap 是从源 bitmap 的(1,1)点开始截取长度为 40 的图片。
第二个方法是对 bitmap 进行缩放,把原位图缩放为宽高为 400 的位图。

总所周知,bitmap 是非常消耗内存的,那么 Google 给我们提供了回收 bitmap 的方法。首先我们可以通过 isRecycle 来判断这个 bitmap 的是否被回收了,如果没被回收,我们可以通过 recycle() 进行回收。所以当我们不确定这个 bitmap 是否使用的时候,我们可以通过这两个方法回收 bitmap。
        


下面说一个方法:Bitmap.createBitmap(int width,int height,Config config)
这个方法创建的是一个空的 Bitmap ,那么通过这个方法创建的 Bitmap 是需要通过 Canvas 去对这个 Bitmap 进行绘制的。
可以看到这个方法中有一个 config 的参数,这个 config 有以下几种:
          
Bitmap.config:可以设置 bitmap 位图的配置,可以决定位图的色彩,透明度,像素如何。
  1. Bitmap.Config ALPHA_8 :如果浮层可以使用这个配置。每个像素 1 字节
  2. Bitmap.Config RGB_565 :没有透明度的位图 每个像素2字节 5 6 5红绿蓝
  3. Bitmap.Config ARGB_4444 :质量差一点,但是还需要设置透明度可以用这个 2字节。
  4. Bitmap.Config ARGB_8888:质量特别高每个像素4个字节。 
最后说一个方法:bitmap.createBitmap(bitmap,x,y,width,height, Matrix m,boolean filter) 从原位图获取长宽的位图
并按 Matrix 规则进行变换。这个boolean 值代表是否过滤,通过这个方法可以对 bitmap 进行 Matrix 的转换,答到一
些炫酷的效果。
     

bitmap 的方法基本上介绍的差不多了下面就介绍一下获取 bitmap 的强大工具类,BitmapFactory。



三、BitmapFactory 创建 Bitmap

          

bitmapFactory 的主要部分就是如何获取 bitmap,我们先看几个 API:
          
1、decodeByteArray :从指定字节开始截取 length 长度的字节数据解析成 bitmap。
2、decodeFile(pathName):从 pathName 解析出并创建对象。
3、decodeFileDescriptor(FileDescriptor fd):从 FileDescriptor 对应的文件中解析创建 bitmap 对象。
4、decodeStream:从输入流中解析创建 bitmap 对象。
5、descodeResource(Resource resource,int id):从 drawable 获取 bitmap 。

其实不仅仅这几个方法,BitmapFactory 还有很多方法能获取到 bitmap,不过总结一下获取 bitmap 一共有五个地方,分别是
字节,文件名,文件描述符,流中,drawable。那基本上 bitmapFactory 的知识点也就这么多,不过在BitmapFactory 中有一个
重要的内容,那就是 option,下面我们看一下这个 option 有什么功能。

bitmapFactory.option :在通过 bitmapFactory 获取 bitmap 的时候可以去设置一个 option,那么根据这个 option 可以去设置
得到的 bitmap 的一些属性,那么下面就列举一些属性:

boolean inBitmap :如果设置了这个属性为 true,那么就会复用 bitmap 对象,复用的操作分为两步,首先保存废弃的 bitmap,使用保
存的bitmap。
int density:通过这个属性可以设置获取 bitmap 的像素密度属性。
int inSample:如果设置为值> 1,请求解码器子样品原始图像,返回一个较小的图像以节省内存。例如,inSampleSize = 4返回一
个对象是1/4的宽度/高度,和1/16像素的bitmap。任何值<= 1 和 1 一样对待。注意:这个值一定是 2 的幂次方,,其他任何值将
被四舍五入到最近的2的幂。最后总结一下,这个值可以设置 bitmap 占用内存的大小。多用于图片的压缩。
inJustDecodeBounds:通过设置此属性,然后获取到的 bitmap 的对象时 null,但是可以通过 option 获取图标的大小的属性。


下面看一段代码:
BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ditu,options);
        int width = options.outWidth;
        int heigth = options.inDensity;
        if(options.inSampleSize > 1){
            //对图片进行压缩然后在重新可以直接对 inSampleSize 直接进行赋值还有outWidth 然后重新去通过decodeResource 获取图片设置 option 就可以达到缩放的功能
            options.inSampleSize = options.inSampleSize / 2;
            Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(),R.drawable.ditu,options);
        }

     可以看到这段代码显示通过设置 injustDecodeBounds 属性来获取 drawable 的相关信息,然后通过判断 inSampleSize 属性
     来判断图片是否过大,如果过大重新设置 option,然后再去加载,这样就可以防止 ANR 的产生。其实还可以通过 width和
     heigth来判断的图片的大小的。在去重新设置。


四、使用中的注意



1、当我们用这些方法去加载图片到内存的时候,有可能 ANR ,因为加载的时间是不可测的,所以我们不要在 UI 线程中加载
图片,我们可以通过 AnsyncTask 去加载图片

2、在我们使用 Bitmap 的时候是一定要缓存的,缓存之后加载速度会非常的快。

3、确认图片不在使用的时候应该尽早释放图片的内存。也就是当我们不用这个 Bitmap 的时候我们需要去判断一下这
Bitmap是否被回收了,如果没回收调用 recycle 去回收。




总结:




           本文讲了 bitmap 的大部分的知识,如果不是做图片处理,这些知识基本够用了,本文如有什么问题欢迎指出,共同进步。




1. 用户与权限管理模块 角色管理: 学生:查看实验室信息、预约设备、提交耗材申请、参与安全考核 教师:管理课题组预约、审批学生耗材申请、查看本课题组使用记录 管理员:设备全生命周期管理、审核预约、耗材采购与分发、安全检查 用户操作: 登录认证:统一身份认证(对接学号 / 工号系统,模拟实现),支持密码重置 信息管理:学生 / 教师维护个人信息(联系方式、所属院系),管理员管理所有用户 权限控制:不同角色仅可见对应功能(如学生不可删除设备信息) 2. 实验室与设备管理模块 实验室信息管理: 基础信息:实验室编号、名称、位置、容纳人数、开放时间、负责人 功能分类:按学科(计算机实验室 / 电子实验室 / 化学实验室)标记,关联可开展实验类型 状态展示:实时显示当前使用人数、设备运行状态(正常 / 故障) 设备管理: 设备档案:名称、型号、规格、购置日期、单价、生产厂家、存放位置、责任人 全生命周期管理: 入库登记:管理员录入新设备信息,生成唯一资产编号 维护记录:记录维修、校准、保养信息(时间、内容、执行人) 报废处理:登记报废原因、时间,更新设备状态为 "已报废" 设备查询:支持按名称、型号、状态多条件检索,显示设备当前可用情况 3. 预约与使用模块 预约管理: 预约规则:学生可预约未来 7 天内的设备 / 实验室,单次最长 4 小时(可设置) 预约流程:选择实验室→选择设备→选择时间段→提交申请(需填写实验目的) 审核机制:普通实验自动通过,高危实验(如化学实验)需教师审核 使用记录: 签到 / 签退:到达实验室后扫码签到,离开时签退,系统自动记录实际使用时长 使用登记:填写实验内容、设备运行情况(正常 / 异常),异常情况需详细描述 违规管理:迟到 15 分钟自动取消预约,多次违规限制预约权限 4. 耗材与安全管理模块 耗材管理: 耗材档案:名称、规格、数量、存放位置、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值