浅谈 Bitmap 和 BitmapDrawable

相信参加工作几年的小伙伴,在工作闲暇之时,总想找点东西看看,一方面可能是为了弥补自己的知识短板,另一方面可能是为了扩大知识领域,进阶为资深或高级开发者。本人也是这样,今天在看李赞红老师的 Android 自定义组件开发详解pdf 中,看到了Bitmap 类和 BitmapDrawable 类  的介绍,特此记录下,方便日后查阅。

 学习一个东西,无非就是了解它是什么,怎么用,有什么好处,带着这样的疑问,咱们一起来看看

一、Bitmap 类

Bitmap 官译为 位图,主要用于存储 png,jpg,gif 等格式的图片数据,在Android开发中针对图片的处理,说白了就是对Bitmap对象进行操作,那么怎么将一张图片转为Bitmap呢?

 Android中对图片进行处理,需要先将图片读入 Bitmap 对象,接着调用相关的 API 对图片进行处理和加工,图片读取操作是由 BitmapFactory 类完成的,该类定义了若干方法用于读取图片数据:

1、public    static    Bitmap    decodeStream(InputStream    is)
从输入流中读取图片数据并转换成 Bitmap 对象
2、 public    static    Bitmap    decodeByteArray(byte[]    data,    int    offset,    int    length)
从字节数组中读取图片数据并转换成 Bitmap 对象
3、 public    static    Bitmap    decodeResource(Resources    res,    int    id)
从 Android 的 drawable 资源(res/drawable)目录中读取图片数据并转换成 Bitmap 对象
4、 public    static    Bitmap    decodeFile(String    pathName)
从图片文件中读取图片数据并转换成 Bitmap 对象

二、Bitmap 如何创建一张空白图片

 Bitmap简单创建一张图片,只需指定宽度、高度和存储格式(ARGB_4444、ARGB_8888、ALPHA_8)等信息,最简单的方法是 public    static    Bitmap    createBitmap(int    width,    int    height,    Config    config),该方法是 static 方法,不需要创建 Bitmap 对象即可直接调用。

Bitmap bmp = Bitmap.createBitmap(400,400,Config.ARGB_8888);

特别注意的是

位于 res/drawable 目录下的图片读成 Bitmap 对象后是无法修改的,若要修改必须复制一张新的图片并设置可修改标记,Bitmap 类的 copy()方法能完成该功能,方法签名如下:public    Bitmap    copy(Config    config,    boolean    isMutable)
参数 isMutable 为 true 表示复制的新位图可以修改

三、Bitmap 回收

 Bitmap 是一种非常占用资源的对象,不管是什么手机,如果没有处理好很容易导致 App 崩溃,所以,及时回收 Bitmap 内存是一个好习惯,涉及到的方法有两个:

1、 public    final    boolean    isRecycled()
判断是否已回收,返回 true 表示内存已被回收
2、 public    void    recycle()
回收 Bitmap 内存,同一个 Bitmap 对象不能连续回收多次,所以在回收之前最好是判断。不过从源码中发现其实该方法已经自己判断过了。常见的回收 Bitmap 资源的代码形如(bmp 为 Bitmap 对象):
if(bmp!= null&&!bmp.isRecycled()){
bmp.recycle();
System.gc();//ᨀ醒 JVM 释放资源
bmp = null;
}

四、BimapDrawable与 Bitmap区别

BimapDrawable 是 Android 的一种通用位图格式,我们可以简单粗暴地理解成 Bitmap 的另外一种表现形式。但是和 Bitmap 相比 BimapDrawable 占用资源更少、性能更高。

Bitmap 和 BitmapDrawable 在一些情况下需要相互转换,BitmapDrawable 的构造方法 public BitmapDrawable(Resources   res,   Bitmap bitmap)用于将Bitmap转换成BitmapDrawable,而getBitmap()方法则用于将 BitmapDrawable 转换成 Bitmap。

Bitmap 和 BitmapDrawable 都能获得位图的宽度和高度,对比如下:
Bitmap       
int    getWidth()            int    getIntrinsicWidth()
BitmapDrawable                
int    getHeight()           int    getIntrinsicHeight()
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值