专栏首页静晴轩Drawable.Bitmap.Canvas.Paint.Matrix

Drawable.Bitmap.Canvas.Paint.Matrix

由于对Drawable、Bitmap、Canvas、Paint和 Matrix

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

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

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

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

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

1. Drawable to–> Bitmap

BitmapDrawable 继承自 Drawable

//方法一    
Resources res;    
InputStream is=res.openRawResource(R.drawable.pic);    
BitmapDrawable bitmapDrawable=new BitmapDrawable(is);    
Bitmap bmp=bitmapDrawable.getBitmap();    

//方法二    
Resources res;    
BitmapDrawable bitmapDrawable=(BitmapDrawable)res.getDrawable(R.drawable.pic);    
Bitmap bmp=bitmapDrawable.getBitmap();    

//方法三    
ImageView image;    
image.setImageBitmap(BitmapFactory.decodeStream(~~~~));    
BitmapDrawable bitmapDrawable=(BitmapDrawable)image.getDrawable();    
Bitmap bmp=bitmapDrawable.getBitmap();  

2. Bitmap to–> Drawable

Drawable d = new BitmapDrawable(bitmap);

3. 从资源中获取Bitmap

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

Resources res=getResources();  
Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);  
② 通过BitmapFactory.decodeStream方法,创建出一个bitmap (推荐)
InputStream is = context.getResources().openRawResource(R.drawable.app_sample_code);  
Bitmap bmp = BitmapFactory.decodeStream(is);  

4. Bitmap to–> byte[]

private byte[] Bitmap2Bytes(Bitmap bm){     
    ByteArrayOutputStream byteos = new ByteArrayOutputStream();       
    bm.compress(Bitmap.CompressFormat.PNG, 100, byteos);       
    return byteos.toByteArray();     
}  

5. byte[] to–> Bitmap

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

6. Matrix

Matrix为矩阵的意思,一般用来与Bitmap配合,实现图像的缩放、变形、扭曲等操作。

public static Bitmap scaleBitmap(Bitmap bitmap, int scalWidth, int scaleHeight) {      
    int w = bitmap.getWidth();      
    int h = bitmap.getHeight();      
    // 创建操作图片用的Matrix对象      
    Matrix matrix = new Matrix();      
    // 计算缩放比例      
    float sx= ((float) scaleWidth / w);      
    float sy= ((float) scaleHeight / h);      
    // 设置缩放比例      
    matrix.postScale(sx, sy);      
    // 建立新的bitmap,其内容是对原bitmap的缩放后的图     
    Bitmap scaleBmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);      
    return scaleBmp;      
}

Matrix类的其他典型方法。

boolean  postScale(float sx, float sy)//缩放    
boolean     postSkew(float kx, float ky)//扭曲    
boolean     postTranslate(float dx, float dy)//转换    
boolean     preConcat(Matrix other)//合并    
boolean     preRotate(float degrees)//旋转

原文链接地址

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Git常用命令备忘

    Git配置 git config --global user.name "robbin" git config --global user.email ...

    晚晴幽草轩轩主
  • lua表排序

    Lua作为一种很强大且轻量级脚本语言的存在,对于掌握其几乎无所不能的Table(其实就是一个Key Value的数据结构,它很像Javascript中的Obje...

    晚晴幽草轩轩主
  • Webpack 打包优化之速度篇

    在前文 Webpack 打包优化之体积篇中,对如何减小 Webpack 打包体积,做了些探讨;当然,那些法子对于打包速度的提升,也是大有裨益。然而,打包速度之于...

    晚晴幽草轩轩主
  • android bitmap的内存分配和优化

    首先Bitmap在Android虚拟机中的内存分配,在Google的网站上给出了下面的一段话  ? 大致的意思也就是说,在Android3.0之前,Bitmap...

    xiangzhihong
  • Android中的Bitmap序列化失败的解决方法

    之前写了个User类(实现了Serializable接口),类变量里有Bitmap类型的头像图片,Bitmap导致序列化不成功,报 “android.graph...

    砸漏
  • 美图分布式Bitmap实践:Naix

    大数据技术和应用系统目前已经在各个行业中发挥着巨大的作用,各种各样的开源技术也给大数据从业人员带来了很大的便利。Bitmap 作为一种大数据需求下产生的计算体系...

    美图数据技术团队
  • 对Bitmap的内存优化

    在Android应用里,最耗费内存的就是图片资源。而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出...

    xiangzhihong
  • Android实现合并生成分享图片功能

    有时候分享功能都是很需要分享一个当前屏幕的界面的截图因,以前做校内APP的时候用到过,拿出来分享分享, 用以前写过的自定义课表软件。

    砸漏
  • Android处理图像数据全记录

    Android中处理图像是一件很常见的事情,这里记录备忘一些亲身使用过的处理图片数据的方法。

    技术小黑屋
  • 百度 Deep Voice 实现文本到语音的实时转换;迄今最强核弹 GTX 1080 TI | 开发者头条

    ▲ 内容预览: 百度实现文本到语音的实时转换 Facebook 发布支持 90 种语言的预训练词向量 英伟达发布迄今为止最强核弹 GTX 1080 TI 每日...

    AI研习社

扫码关注云+社区

领取腾讯云代金券