一、Bitmap和BitmapFactory
1. Bitmap代表一张位图,BitmapDrawable里封装的图片是一个Bitmap对象,开发者为了把一个Bitmap对象包装成BitmapDrawable对象,可以调用BitmapDrawable的构造器:
//把一个Bitmap对象包装成BitmapDrawable对象
BitmapDrawable drawable =new BitmapDrawable(bitmap);
2 . 如果需要获取BitmapDrawable所包装的Bitmap对象,则可调用BitmapDrawable的getBitmap()方法,如下面的代码所示:
//获取一个BitmapDrawable所包装的Bitmap对象
Bitmap bitmap =drawable.getBitmap();
3. 除此之外,Bitmap还提供了一些静态方法来创建新的Bitmap对象,例如,如下常用方法:
3.1 //从源位图的指定坐标点(给点x,y)开始,从中”挖取”宽width,高heigth的 一块出来,创建新的Bitmap对象
bitmap.createBitmap(source, x, y, width, height)
3.2 对源位图src进行缩放,缩放成宽dstWidth,高dstHeight的新位图
bitmap.createScaledBitmap(src, dstWidth, dstHeight, filter)
3.3 创建一个宽width,高height的新位图
bitmap.createBitmap(width, height, config)
3.4 从源位图source的指定坐标点(给定x,y)开始,从中『挖取』宽width,高height的一块出来,创建新的Bitmap对象,并按Matrix指定的规则进行变换
bitmap.createBitmap(source, x, y, width, height, m, filter)
4. BitmapFactory是一个工具类,它提供了大量的方法,这些方法可用于从不同的数据源来解析,创建Bitmap对象,BitmapFactory包含了如下方法:
4.1 从指定字节数组的offset位置开始,将长度为length的字节数据解析成Bitmap对象
BitmapFactory.decodeByteArray(data, offset, length)
4.2 从pathName指定的文件中解析,创建Bitmap对象
BitmapFactory.decodeFile(pathName)
4.3 用于从FileDescriptor对应的文件中解析,创建Bitmap对象
BitmapFactory.decodeFileDescriptor(fd)
4.4 用于根据给定的资源ID从指定资源中解析,创建Bitmap对象
BitmapFactory.decodeResource(res, id)
4.5 从指定的输入流中解析,创建Bitmap对象
BitmapFactory.decodeStream(is)
5. 注意:大部分时候,我们只要把图片放在/res/drawable-mdpi目录下,就可以在程序中通过该图片对应的资源ID来获取封装该图片的Drawable对象,可能由于手机系统的内存比较小,如果系统不停地去解析,创建Bitmap对象,可能由于前面创建Bitmap所占用的内存没有
回收,而导致程序运行时引发OutOfMemory错误。
Android为Bitmap提供了两种方法来判断它是否已回收,以及强制Bitmap回收自己,
bitmap.isRecycled(); 返回该Bitmap对象是否已被回收的状态 bitmap.recycle(); 强制一个Bitmap对象立即回收自己。
除此之外,Android应用需要访问其他存储路劲(比如SD卡中)里的图片,都需要借助BitmapFactory来解析,创建Bitmap对象。