图像处理基础

2017-09-27 15:48:50
admin
815
最后编辑:admin 于 2017-09-27 16:41:34

本章主要介绍了Android的图形、图像处理,按照下面思维导图的思路来梳理本章书的内容。重点学习使用简单图片方法;Android丰富的绘图API,包括Canvas、Paint、Path等类;各种图形特效,利用Matrix对图形进行几何变换;最后是Android的动画支持。

Android中的底层图形类:

  • Drawable:通用的图形对象,用于装载常用格式的图像,既可以是PNG,JPG这样的图像,
    也是前面学的那13种Drawable类型的可视化对象!我们可以理解成一个用来放画的——画框
  • Bitmap(位图):我们可以把他看作一个画架,我们先把画放到上面,然后我们可以
    进行一些处理,比如获取图像文件信息,做旋转切割,放大缩小等操作!
  • Canvas(画布):如其名,画布,我们可以在上面作画(绘制),你既可以用Paint(画笔)
    来画各种形状或者写字,又可以用Path(路径)来绘制多个点,然后连接成各种图形!
  • Matrix(矩阵):用于图形特效处理的,颜色矩阵(ColorMatrix),还有使用Matrix进行图像的
    平移,缩放,旋转,倾斜等!





【知识点】
·Bitmap和BitmapFactory
    Bitmap代表一张位图,BitmapDrawable里封装的图片就是一个Bitmap对象。开发者为了把一个Bitmap对象包装成BitmapDrawable对象,可调用BitmapDrawable构造器:
// 把一个Bitmap对象包装成BitmapDrawable对象
BitmapDrawable drawable = new BitmapDrawable(bitmap);
如果需要获取BitmapDrawable所包装的Bitmap对象,则可以调用BitmapDrawable的getBitmap()方法,如下面的代码所示:
 //获取一个BitmapDrawable所包装的Bitmap对象
Bitmap bitmap=drawable.getBitmap();

    BitmapFactory是一个工具类,它用于提供大量的方法,这些方法可用于从不同的数据源来解析、创建Bitmap对象,BitmapFactory包含如下方法:

    手机系统的内存比较小,如果系统不停地去解析、创建Bitmap对象,可能由于前面创建Bitmap所占用的内存还没有回收,从而导致程序运行时引发OutOfMemory错误。Android为Bitmap提供了两个方法来判断它是否已回收,以及强制Bitmap回收自己:
    boolean isRecycled():返回该Bitmap是否已被回收。
    void recycle():强制一个Bitmap对象立即回收自己。
除此之外,如果Android应用需要访问其它存储路径(比如SD卡中)里的图片,都需要借助于BitmapFactory来解析、创建Bitmap对象。

·绘图:
    Android的绘图应该继承View组件,并重写它的onDraw(Canvas canvas)方法即可。重写onDraw(Canvas canvas)方法时涉及一个绘图APICanvas,Canvas代表了“依附”于指定View的画布,它提供了一些方法绘制各种图形。
Canvas还提供了如下方法进行变换:

    Canvas提供的上面的方法还涉及一个API:Paint,Paint代表了Canvas上的画笔,因此Paint类主要用于设置绘制风格,包括画笔颜色、画笔笔触粗细、填充风格等。
    在Canvas提供的绘制方法中还用到了一个API:Path,Path代表任意多条直线连接而成的任意图形,当Canvas根据Path绘制时,它可以绘制出任意的形状。

·使用Matrix控制图像或组件变换步骤:
①获取Matrix对象,该Matrix对象既可创建,也可直接获取其他对象内封装的Matrix;
②调用Matrix的方法进行平移、旋转、缩放、倾斜等;
③将程序对Matrix所做的变换应用到指定图像或组件。


·双缓冲机制
    每次View组件上的图形状态数据发生了改变,都应该通知View组件重写onDraw(Canvas canvas)方法重绘组件。通知View重绘可调用invalidate(在UI线程中)或postInvalidate(非UI线程中)。当程序需要在指定View上进行绘制时,程序并不直接绘制到View组件上,而是先绘制到一个内存中的Bitmap图片(这就是缓冲)上,等到内存中的Bitmap绘制好之后,再一次性地将Bitmap绘制到View组件上。

·逐帧动画
    逐帧(Frame)是最容易理解的动画,它要求开发者把动画过程的每张静态图片都收集起来,然后由Android来控制依次显示这些静态图片。逐帧动画通常也是采用XML资源文件进行定义的。定义逐帧动画非常简单,只要在<animation-list.../>元素中使用<item.../>子元素定义动画的全部帧,并指定各帧的持续时间即可。
    一旦程序获取了AnimationDrawable对象之后,接下来接可用ImageView把AnimationDrawable显示出来----习惯上把AnimationDrawable设成ImageView的背景即可。需要指出的是:AnimationDrawable代表的动画默认是不播放的,必须在程序中启动动画播放才可以。AnimationDrawable提供了入戏两个方法来开始、停止动画:
    start():开始播放动画
    stop():停止播放动画
    • 在线客服
    • 关注微信
    • 联系电话
      • 欢迎咨询
      • 欢迎加入QQ群 303257430
    • 公众号:源宝网络
      • 联系电话及微信号 18902328227