当前位置:网站首页>你居然不懂Bitmap和Drawable? 相关知识大扫盲
你居然不懂Bitmap和Drawable? 相关知识大扫盲
2022-08-01 21:28:00 【代码与思维】
Bitmap是什么
Bitmap的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。
Bitmap 是位图信息的存储,即⼀个矩形图像每个像素的颜⾊信息的存储器。
Android从基础底层到架构成长的全套笔记,有需要完整版的朋友,可点击这里查看获取方式或者留言【Android】领取!
Drawable是什么
Drawable是一种可以在Canvas上进行绘制的抽象的概念,颜色、图片等都可以是一个Drawable。Drawable可以通过XML定义,或者通过代码创建。Android中Drawable是一个抽象类,每个具体的Drawable都是其子类。简单来讲,其可以理解为:图像。
Drawable 内部存储的是绘制规则,这个规则可以是⼀个具体的 Bitmap,也可以是⼀个纯粹的颜⾊,甚⾄可以是⼀个抽象的、灵活的描述。Drawable 可以不含有具体的像素信息,只要它含有的信息⾜以在 draw(Canvas) ⽅法被调⽤时进⾏绘制就够了。由于 Drawable 存储的只是绘制规则,因此在它的 draw() ⽅法被调⽤前,需要先调⽤ Drawable.setBounds() 来为它设置绘制边界。
Drawable的优点:
- 使用简单,比自定义View成本低
- 非图片类的drawable所占空间小,能减小apk大小
Bitmap和Drawable的相互转换
//drawable convert bitmap
public static Bitmap drawableToBitmap(Drawable drawable) {
Bitmap bitmap = null;
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
if (bitmapDrawable.getBitmap() != null) {
return bitmapDrawable.getBitmap();
}
}
if ((drawable.getIntrinsicWidth() <= 0) || (drawable.getIntrinsicHeight() <= 0)) {
bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
}
else {
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
//bitmap convert drawable
public static Drawable bitmapToDrawable(Context context, Bitmap bitmap) {
return new BitmapDrawable(context.getResources(), bitmap);
}
事实上,由于 Bitmap 和 Drawable 是两个不同的概念,因此确切地说它们并不是互相「转换」,⽽是从其中⼀个获得另⼀个的对象:
- Bitmap -> Drawable:创建⼀个 BitmapDrawable。
- Drawable -> Bitmap:如果是 BitmapDrawable,使⽤BitmapDrawable.getBitmap() 直接获取;如果不是,创建⼀个 Bitmap和⼀个 Canvas,使⽤ Drawable 通过 Canvas 把内容绘制到 Bitmap 中。
作者:Arrom
转载平台:掘金
链接:https://juejin.cn/post/7126798240573292558
边栏推荐
猜你喜欢
作业8.1 孤儿进程与僵尸进程
JS Improvement: Handwritten Publish Subscriber Model (Xiaobai)
MySQL related knowledge
虚拟内存与物理内存之间的关系
磷酸化甘露糖苷修饰白蛋白纳米粒/卵白蛋白-葡聚糖纳米凝胶的
365天挑战LeetCode1000题——Day 046 生成每种字符都是奇数个的字符串 + 两数相加 + 有效的括号
包含吲哚菁绿的多聚体白蛋白纳米球/载马钱子碱纳米粒的牛血清白蛋白微球的制备
Based on php online music website management system acquisition (php graduation design)
C Expert Programming Chapter 1 C: Through the Fog of Time and Space 1.4 K&R C
【Jmeter常用断言组件】
随机推荐
Chapter 12, target recognition of digital image processing
PyQt5 + MySQL5.8 【学生信息管理系统】【增删改查】
Spark shuffle调优
Scala practice questions + answers
AI应用第一课:支付宝刷脸登录
【Jmeter常用断言组件】
51.【结构体初始化的两种方法】
[@synthesize in Objective-C]
Day016 类和对象
Spark练习题+答案
牛血清白蛋白刺槐豆胶壳聚糖缓释纳米微球/多西紫杉醇的纳米微球DTX-DHA-BSA-NPs
基于php在线学习平台管理系统获取(php毕业设计)
”sed“ shell脚本三剑客
JS Improvement: Handwritten Publish Subscriber Model (Xiaobai)
LeetCode·32.最长有效括号·栈·动态规划
sizeof的详细解说和与strlen的区别
JS hoisting: how to break the chain of Promise calls
方舟生存进化是什么游戏?好不好玩
方舟开服需要知道的那些事
FusionGAN:A generative adversarial network for infrared and visible image fusion article study notes