Android bitmap讲解与实践

来源:互联网 发布:安卓与php服务器端 编辑:程序博客网 时间:2024/06/07 00:07

一、概述



          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 的一些属性,那么下面就列举一些属性:

booleaninBitmap :如果设置了这个属性为 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 的大部分的知识,如果不是做图片处理,这些知识基本够用了,本文如有什么问题欢迎指出,共同进步。




原创粉丝点击