ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 1. 前言 在这个目录下将记录关于Bitmap的一些操作。首先来对比一下Bitmap和Drawable的区别。 # 2. Bitmap和Drawable Bitmap 称作位图,一般位图的文件格式扩展名为.bmp,当然编码器也有很多,如RGB565、 RGB8888。作为一种逐像素的显示对象,其执行效率高;但缺点也很明显,即存储效率低。 Drawable 作为 Android 下通用的图形对象,它可以装载常用格式的图像,比如 GIF、PNG、 JPG,当然也支持 BMP,还提供了一些高级的可视化对象,比如渐变、图形等。 也就是说,Bitmap 是 Drawable,而 Drawable 不一定是 Bitmap。 ![](https://img.kancloud.cn/e4/34/e434010454e501243089f337281d83df_1003x167.png) Drawable 在占用**内存和绘制速度**这两个非常关键的点上胜过 Bitmap,这也是在 Android UI 系统中普遍使用 Drawable 的原因之一。**Drawable 有很多派生类**,通过这些派生类**可以很容易地生成渐变、层叠等效果**。单从这 一方面而言,Drawable 比 Bitmap 有优势。但如果仅仅用作空白画布来绘图,那么 Drawable 构造和使用起来则不如 Bitmap 方便。 ## 2.1 Bitmap和Drawable相互转换 ### 1. Bitmap => Drawable 将 Bitmap 转换为 BitmapDrawable 对象,然后转换为 Drawable 使用。即: ~~~kotlin // 创建Bitmap对象 val bm = Bitmap.createBitmap(width, width, Bitmap.Config.ARGB_8888); val canvas = Canvas(bm) val paint = Paint(Paint.ANTI_ALIAS_FLAG) paint.color = Color.BLACK // 绘制一个红色的圆到画布,即Bitmap上 canvas.drawColor(Color.RED) canvas.drawCircle(width / 2f, width / 2f, (width/2).toFloat(), paint) // 转换 val bitmapDrawable = BitmapDrawable(resources, bm) as Drawable ~~~ ### 2. Drawable => Bitmap 最简单的做法也是借助BitmapDrawable对象,直接使用: ~~~ // 创建Bitmap对象 val drawable = resources.getDrawable(R.drawable.circle, null) val bitmap = (drawable as BitmapDrawable).bitmap ~~~ 也可以使用画布的方式来完成,比如: ~~~ // 创建Bitmap对象 val drawable = resources.getDrawable(R.drawable.circle, null) val w = drawable.intrinsicWidth val h = drawable.intrinsicHeight val createBitmap = Bitmap.createBitmap( w, h, Bitmap.Config.ARGB_8888 ) val canvas = Canvas(createBitmap) drawable.setBounds(0, 0, w, h) drawable.draw(canvas) // return createBitmap ~~~