zoukankan      html  css  js  c++  java
  • Bitmap、BitmapDrawable、BitmapFactory、Matrix类之间的关系

    1.BitmapFactory是一个工具类

       Bitmap实现在android.graphics包中。但是Bitmap类的构造函数是私有的,外面并不能实例化,只能是通过JNI实例化。这必然是 某个辅助类提供了创建Bitmap的接口,而这个类的实现通过JNI接口来实例化Bitmap的,这个类就是BitmapFactory。BitmapFactory提供了大量的方法,从不同的数据源来解析、创建Bitmap对象。

    方法:

    decodeByteArray(byte[] data,int offset,int length)
    //从指定字节数据的offset位置开始,将长度为length的字节数据解析成Bitmap对象
    decideFile(String pathName)
    //从指定文件中解析、创建Bitmap对象
    decodeFileDescriptor(FileDescriptor fd)    FielDescriptor类不知道干什么用的
    //用于从FileDescriptor对应的文件中解析、创建Bitmap
    decodeResource(Resources res,int id)    //Resources res = getAcitivty().getResouces();即可
    //用于根据给定的资源ID从指定资源中解析、创建Bitmap对象。
    decodeStream(InputStream is
    //用于从指定流中机械、创建对象
    
    总结:常用创建Bitmap的方法①系统Resource②文件地址③特定流

       在使用方法decodeFile()/decodeResource()时,都可以指定一个BitmapFacotry.Options
     

    • inPreferredConfig 指定decode到内存中,手机中所采用的编码,可选值定义在Bitmap.Config中。缺省值是ARGB_8888。
    • inJustDecodeBounds 如果设置为true,则返回图片的基本信息(宽,高),从Options.outWidth和Options.outHeight获取宽高而不返回Bitmap对象。如想得到Bitmap对象就需要再设置为false。
    • inSampleSize 设置decode时的缩放比例。

       作用:解决加载大图产生OOM(out of memory)                     OOM:内存不足

       解决方法:http://deep-fish.iteye.com/blog/2021016

    2.Bitmap类

    Bitmap代表了一个原始的位图,并且可以对位图进行一系列的变换操作。

    Android图像处理之Bitmap类

    第一个方法是最终的实现,后两种只是对第一种方法的封装。

    第二个方法可以从源Bitmap中指定区域(x,y, width, height)中挖出一块来实现剪切;

    第三个方法可以把源Bitmap缩放为dstWidth x dstHeight的Bitmap。

    补充:Matrix类

    作用:平移变换(Translate)  旋转变换(Rotate)、  缩放变换(Scale)  错切变换(Skew)

    设置Matrix的Rotate(通过setRotate())或者Scale(通过setScale()),传入第一个方法,可实现旋转或缩放。

    使用:

    Android图像处理之Bitmap类

    保存图片

    Bitmap.compress()方法的参数format可设置JPEG或PNG格式;quality可选择压缩质量;fOut是输出流(OutputStream),这里的FileOutputStream是OutputStream的一个子类。

    使用:

    Android图像处理之Bitmap类

    3.BimtpDrawable类

    继承于Drawable,你可以从文件路径、输入流、XML文件以及Bitmap中创建。

    作用:以Xml方式,可以对原始的位图进行一系列的处理,比如说抗锯齿,拉伸,对齐等等。

    //常用构造函数
    Resources res=getResources();//获取资源 
    public BitmapDrawable(Resources res)  //创建一个空的drawable。(Response用来指定初始时所用的像素密度)//替代public BitmapDrawable()方法(此方法不处理像素密度) 
    public BitmapDrawable(Resources res, Bitmap bitmap)  //Create drawable from a bitmap 
    public BitmapDrawable(Resources res, String filepath)  //Create a drawable by opening a given file path and decoding the bitmap. 
    public BitmapDrawable(Resources res, java.io.InputStream is)  //Create a drawable by decoding a bitmap from the given input stream. 

    Bimtap与BitmapDrawable的区别:

    一个Bitmap对象是一张bitmap格式image的表示(类似于Java.awt.image)。

    一个Drawable对象是“那些能够在其上面图画的任意对象”,它也许是一个bitmap对象,也可能是一个solid color、一个其他Drawable对象的集合,亦或是某种结构。

    包含关系。

    Bimtap的使用方法:

    参考资料http://www.android100.org/html/201506/30/160242.html

                  http://blog.sina.com.cn/s/blog_5a6f39cf0101aqsw.html

  • 相关阅读:
    socket实现一个简单的echo服务
    Netty实现丢弃服务协议(Netty4.X学习一)
    大型情感剧集Selenium:8_selenium网页截图的四种方法
    python原类、类的创建过程与方法
    Flask使用bootstrap为HttpServer添加上传文件功能
    充满含金量的一场云原生Meetup,入场券免费发送中……
    Hadoop伪分布式集群的安装部署
    从缓冲池命中率角度判断自己的MYSQL数据库是否需要扩容内存
    MySQL分区表概述
    如何防止mysql数据库被勒索
  • 原文地址:https://www.cnblogs.com/rookiechen/p/5247498.html
Copyright © 2011-2022 走看看