自定义View-Bitmap和BitmapDrawable

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32113133/article/details/66969311
Bitmap 译为“位图”,用于存储 png、jpg、gif 等格式的图片数据,很多时候如果需要在 Android中对图片进行处理,需要先将图片读入 Bitmap 对象,接着调用相关的 API 对图片进行处理和加工,图片读取操作是由 BitmapFactory 类完成的,该类定义了若干方法用于读取图片数据:
public static Bitmap decodeStream(InputStream is)

从输入流中读取图片数据并转换成 Bitmap 对象

public static Bitmap decodeByteArray(byte[] data,int offset,int length)

从字节数组中读取图片数据并转换成 Bitmap 对象

public static Bitmap decodeResource(Resources res,int id)

从 Android 的 drawable 资源(res/drawable)目录中读取图片数据并转换成 Bitmap 对象

public static Bitmap decodeFile(String pathName)

从图片文件中读取图片数据并转换成 Bitmap 对象


我们也可以创建一张空白图片,空白图片需要指定宽度、高度和存储格式(ARGB_4444、ARGB_8888、ALPHA_8)等信息,Bitmap 中用来创建空白图片最简单的方法是
public static Bitmap createBitmap(int width,int height,Config config),该方法是 static 方法,不需要创建 Bitmap 对象即可直接调用。
下列的代码创建了一个 400*400 的 ARGB_8888 类型的空白位图对象:
Bitmap bmp = Bitmap.createBitmap(400, 400,Config.ARGB_8888);
位于 res/drawable 目录下的图片读成 Bitmap 对象后是无法修改的,若要修改必须复制一张新的图片并设置可修改标记,Bitmap 类的 copy()方法能完成该功能,方法签名如下:
public Bitmap copy(Config config,boolean isMutable)

参数 isMutable 为 true 表示复制的新位图可以修改。Bitmap 是一种非常占用资源的对象,不管是什么手机,如果没有处理好很容易导致 App 崩溃,所以,及时回收 Bitmap 内存是一个好习惯,涉及到的方法有两个:

public final boolean isRecycled()

判断是否已回收,返回 true 表示内存已被回收


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

绘图中 Bitmap 是一个很重要的类,为了提高绘图的性能,通常会使用“双缓存”技术,“双缓存”技术就是先将图绘制在 Bitmap 上,再统一显示出来;另外,在绘图软件的开发中,Bitmap 常用于保存绘制结果,而用户看到的绘制过程是需要和结果分离的。BimapDrawable 是 Android 的一种通用位图格式,我们可以简单粗暴地理解成 Bitmap 的另外一种表现形式。但是和 Bitmap 相比 BimapDrawable 占用资源更少、性能更高。


Bitmap 和 BitmapDrawable 在一些情况下需要相互转换,BitmapDrawable 的构造方法:

public BitmapDrawable(Resources res,Bitmap bitmap)

用于将Bitmap转换成BitmapDrawable,而getBitmap()方法则用于将 BitmapDrawable 转换成 Bitmap。


Bitmap 和 BitmapDrawable 都能获得位图的宽度和高度,对比如下:
Bitmap: getWidth()   getHeight()
BitmapDrawable:  getIntrinsicWidth() getIntrinsicHeight()

猜你喜欢

转载自blog.csdn.net/qq_32113133/article/details/66969311