当前位置: 首页 > news >正文

Drawable、Bitmap、Canvas和Paint的关系以及部分使用方法

首先让我们理解下Android平台中的显示类是View,但是还提供了底层图形类android.graphics,今天所说的这些均为graphics底层图形接口。

Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565、RGB888。作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低。我们理解为一种存储对象比较好。

Drawable - 作为Android平下通用的图形对象,它可以装载常用格式的图像,比如GIF、PNG、JPG,当然也支持BMP,当然还提供一些高级的可视化对象,比如渐变、图形等。

Canvas - 名为画布,我们可以看作是一种处理过程,使用各种方法来管理Bitmap、GL或者Path路径,同时它可以配合Matrix矩阵类给图像做旋转、缩放等操作,同时Canvas类还提供了裁剪、选取等操作。

Paint - 我们可以把它看做一个画图工具,比如画笔、画刷。他管理了每个画图工具的字体、颜色、样式。 如果涉及一些Android游戏开发、显示特效可以通过这些底层图形类来高效实现自己的应用。

1.Drawable -> Bitmap ((BitmapDrawable)res.getDrawable(R.drawable.youricon)).getBitmap();

2.Bitmap -> Drawable
  Drawable d = new BitmapDrawable(bitmap);

3.从资源中获取Bitmap

   a.通过decodeResource,这种方式不可取

   因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。

   Resources res=getResources();   

   Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);  

  b.通过BitmapFactory.decodeStream方法,创建出一个bitmap

   InputStream is = context.getResources().openRawResource(R.drawable.app_sample_code);
   Bitmap bmp = BitmapFactory.decodeStream(is);

4.Bitmap → byte[]

复制代码
private byte[] Bitmap2Bytes(Bitmap bm){   
    ByteArrayOutputStream baos = new ByteArrayOutputStream();     
    bm.compress(Bitmap.CompressFormat.PNG, 100, baos);     
    return baos.toByteArray();   
}  
复制代码

5.byte[] → Bitmap

复制代码
private Bitmap Bytes2Bimap(byte[] b){   
            if(b.length!=0){   
                return BitmapFactory.decodeByteArray(b, 0, b.length);   
            }   
            else {   
                return null;   
            }   
 }  
复制代码

6. Bitmap → Drawable

public static Drawable bitmap2Drawable(Bitmap bitmap){  
        return new BitmapDrawable(bitmap) ;  
}  

7.Drawable → Bitmap

Drawable 转 bitmap时需要区分drawable是属于哪一类的图标,如果是NinePatchDrawable就不能直接转为BitmapDrawable来取得Bitmap了。

复制代码
    public static Bitmap drawable2Bitmap(Drawable drawable){  
        if(drawable instanceof BitmapDrawable){  
            return ((BitmapDrawable)drawable).getBitmap() ;  
        }else if(drawable instanceof NinePatchDrawable){  
            Bitmap bitmap = Bitmap  
                    .createBitmap(  
                            drawable.getIntrinsicWidth(),  
                            drawable.getIntrinsicHeight(),  
                            drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888  
                                    : Bitmap.Config.RGB_565);  
            Canvas canvas = new Canvas(bitmap);  
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),  
                    drawable.getIntrinsicHeight());  
            drawable.draw(canvas);  
            return bitmap;  
        }else{  
            return null ;  
        }  
    }  
复制代码

 

 


本文转自java豆子博客园博客,原文链接:http://www.cnblogs.com/error404/archive/2011/08/16/2140203.html,如需转载请自行联系原作者

相关文章:

  • 嫌访问速度慢?教你秒速打开你的WordPress
  • 玩转Bootstrap(JS插件篇)-第1章 模态弹出框 :1-1导入JavaScript插件
  • 借用Snippet插件美化博客中的代码
  • Python的CSV模块
  • IT运维管理之自动化运维篇
  • zookeeper分布式安装
  • 百度面试题:求绝对值最小的数
  • 3-9 读写缓存流 ——BufferedStream类
  • Java线程:线程私有变量
  • 使用Seam-gen生成基础项目骨架
  • 计算机中的颜色XII——快速计算纯色的色相值(新的公式)
  • juniper交换机 mac地址和端口绑定
  • asp.net开发必备51种代码(非常实用)
  • 06.GitHub实战系列~6.过滤器过滤掉的文件如何上传
  • 交换机QOS 的测试
  • 网络传输文件的问题
  • #Java异常处理
  • [译] React v16.8: 含有Hooks的版本
  • angular2 简述
  • Bytom交易说明(账户管理模式)
  • ES6 ...操作符
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java 最常见的 200+ 面试题:面试必备
  • js
  • Leetcode 27 Remove Element
  • Python3爬取英雄联盟英雄皮肤大图
  • Spring框架之我见(三)——IOC、AOP
  • Vue小说阅读器(仿追书神器)
  • yii2权限控制rbac之rule详细讲解
  • 爬虫模拟登陆 SegmentFault
  • 区块链分支循环
  • 删除表内多余的重复数据
  • 一天一个设计模式之JS实现——适配器模式
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 06-01 点餐小程序前台界面搭建
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​香农与信息论三大定律
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #NOIP 2014#Day.2 T3 解方程
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $$$$GB2312-80区位编码表$$$$
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (汇总)os模块以及shutil模块对文件的操作
  • (一)插入排序
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • ***通过什么方式***网吧
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Core中的去虚
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .net经典笔试题
  • .Net面试题4
  • .net专家(张羿专栏)