Android图片处理(Matrix,ColorMatrix,深入讲解Android

前言

马上快到金三银四都春招阶段了,在这本就是跳槽、找工作的年后黄金时间,大多数求职者都早早做好年后求职的准备,其中不乏有年前早早辞了工作准备年后跳槽的有经验的职场老人们,也有一批即将毕业的应届毕业生的职场新人们。

但是受此次“新冠肺炎”疫情影响之后,“金三银四”逐渐演变成千军万马过独木桥,一边是摩拳擦掌有经验的职场老人们,而另一边则是即将毕业跃跃欲试的新鲜血液,只会让求职人才们越积越多,面对这样岗位少求职者多的情况下,竞争力可想而知,再加上企业的招聘计划调整,侧面也是加剧了求职的难度。

25  private  Button.OnClickListener l = new  Button.OnClickListener(){ 26

27  @Override 28  public   void  onClick(View arg0) { 29  //  TODO Auto-generated method stub

30     getValues(); 31  sv.setValues(carray); 32  sv.invalidate(); 33  } 34

35  }; 36  public   void  getValues(){ 37  for ( int  i = 0 ;i < 20 ;i ++ ){ 38

39  carray[i] = Float.valueOf(et[i].getText().toString()); 40  } 41

42  } 43

44

45  } 46  MyImage类继承自View类: 47  public   class  MyImage  extends  View { 48  private  Paint mPaint  =   new  Paint(Paint.ANTI_ALIAS_FLAG); 49  private  Bitmap mBitmap; 50  private   float  [] array = new   float [ 20 ]; 51

52  private   float  mAngle; 53

54  public  MyImage(Context context,AttributeSet attrs) { 55  super (context,attrs); 56

57  mBitmap  =  BitmapFactory.decodeResource(context.getResources(), 58  R.drawable.test); 59  invalidate(); 60  } 61

62

63  public   void  setValues( float  [] a){ 64  for ( int  i = 0 ;i < 20 ;i ++ ){ 65  array[i] = a[i]; 66  } 67

68  } 69

70  @Override  protected   void  onDraw(Canvas canvas) { 71  Paint paint  =  mPaint; 72

73

74

75  paint.setColorFilter( null ); 76  canvas.drawBitmap(mBitmap,  0 ,  0 , paint); 77

78  ColorMatrix cm  =   new  ColorMatrix(); 79  // 设置颜色矩阵

80  cm.set(array); 81  // 颜色滤镜,将颜色矩阵应用于图片

82  paint.setColorFilter( new  ColorMatrixColorFilter(cm)); 83  // 绘图

84  canvas.drawBitmap(mBitmap,  0 ,  0 , paint); 85  Log.i( " CMatrix " ,  " --------->onDraw " ); 86

87

88  } 89

90  }

复制代码

CMatrix类主要负责接收颜色矩阵的设置和重绘,没有要说的。MyImage类中进行绘图工作,首先设置颜色矩阵cm.set(…)从一维数组中读取数据20个数据给颜色矩阵赋值,paint.setColorFilter(…)设置颜色滤镜,然后绘图,效果就出来了(这个过程和PS差不多)如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cOf5IxE6-1649750824054)(http://dev.chinamobile.com/cmdn/wiki/uploads/201004/s_12713818099NMQz4Nl.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yy8AmcVa-1649750824054)(http://dev.chinamobile.com/cmdn/wiki/uploads/201004/s_1271381825XJGiUUGn.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hxPjmTn2-1649750824055)(http://dev.chinamobile.com/cmdn/wiki/uploads/201004/s_1271381842U0m4uTUx.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r4BnL9ZB-1649750824055)(http://dev.chinamobile.com/cmdn/wiki/uploads/201004/s_12713818647kb99802.png)]

看到这里,相信大家对颜色矩阵的作用已经有了一个直观的感受,现在也可以尝试做一个照片特效的软件。

但是各种效果并不能让用户手动调节颜色矩阵,这里需要计算公式,由于本人并不是做图形软件的也不能提供,可以参考这个链接:

[http://www.adobe.com/devnet/flash/articles/matrix_transformations/ColorMatrixDemo.swf](()

[](()

坐标变换矩阵

坐标变换矩阵是一个3*3的矩阵如图2.1,用来对图形进行坐标变化,将原来的坐标点转移到新的坐标点,

因为一个图片是有点阵和每一点上的颜色信息组成的,所以对坐标的变换,就是对每一点进行搬移形成新的图片。

具体的说图形的放大缩小,移动,旋转,透视,扭曲这些效果都可以用此矩阵来完成。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y3mN1duo-1649750824055)(http://dev.chinamobile.com/cmdn/wiki/uploads/201004/s_1271381907wVeuzTD2.png)]

这个矩阵的作用是对坐标x,y进行变换计算结果如下:

x’=a*x+b*y+c

y’=d*x+e*y+f

通常情况下g=h=0,这样使1=0*x+0*y+1恒成立。和颜色矩阵一样,坐标变换矩阵真正使用的参数很少也很有规律。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cREDI82n-1649750824056)(http://dev.chinamobile.com/cmdn/wiki/uploads/201004/s_1271381929fvyejlxl.png)]

上图就是一个坐标变换矩阵的简单例子,计算后发现x’=x+50,y’=y+50.

可见图片的每一点都在x和y方向上平移到了(50,50)点处,这种效果就是平移效果,将图片转移到了(50,50)处。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oYW5UH7E-1649750824056)(http://dev.chinamobile.com/cmdn/wiki/uploads/201004/s_1271381954eNEbYoEI.png)]

计算上面得矩阵x’=2*x,y‘=2*y.经过颜色矩阵和上面转移效果学习,相信读者可以明白这个矩阵的作用了,这个矩阵对图片进行了放大,具体的说是放大了二倍。

下面将介绍几种常用的变换矩阵:

1.      旋转

[[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qrhtadiN-1649750824057)(http://dev.chinamobile.com/cmdn/wiki/uploads/201004/s_1271381984t6X7xcj1.png)]](()

绕原点逆时针旋转θ度角的变换公式是 x’ = xcosθ − ysinθ 与 y。’ = xsinθ +    ycosθ

2.      缩放

[[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VCgbvHa6-1649750824057)(http://dev.chinamobile.com/cmdn/wiki/uploads/201004/s_1271382016TeOFkZ5i.png)]](()

变换后长宽分别放大x’=scale*x;y’=scale*y.

3.         切变

[[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yNc3VPFi-1649750824058)(http://dev.chinamobile.com/cmdn/wiki/uploads/201004/s_1271382046nPrSJD3C.png)]](()

4.         反射

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CUipMP36-1649750824058)(http://dev.chinamobile.com/cmdn/wiki/uploads/201004/s_1271382180iZqxVK85.png)]

( , )单位向量

5.         正投影

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EiLanhT4-1649750824058)(http://dev.chinamobile.com/cmdn/wiki/uploads/201004/s_12713822147vGAWixg.png)]

( , )单位向量

上面的各种效果也可以叠加在一起,既矩阵的组合变换,可以用矩阵乘法实现之,如:R=B(A*C)=(B*A)C,注意一点就是B*A和A*B一般是不等的。

下面将编一个小程序,通过控制坐标变换矩阵来达到控制图形的目的,JavaCode如下:

复制到剪贴板  Java代码

1

复制代码

写在最后

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料

如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包,最后觉得有帮助、有需要的朋友可以点个赞


ndroid面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包**,最后觉得有帮助、有需要的朋友可以点个赞

[外链图片转存中…(img-TGIgP6sK-1649750824059)]

[外链图片转存中…(img-w1LGjLOc-1649750824060)]

[外链图片转存中…(img-Jn1PCuwW-1649750824060)]
Android开发不会这些?如何面试拿高薪!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值