Android中图像的图形特效处理
之前都是关于图像中色彩处理的特效,后边就是开始关于图像方面的处理。
和之前在处理色彩的时候使用一个4x5的矩阵一样,在进行图像的处理的时候也是使用矩阵进行处理,只是处理图像使用的是3x3的矩阵。对于每一个像素点而言,都有其各自的坐标矩阵来表达其坐标信息。例如对于像素点C而言其坐标矩阵为
⎡⎣⎢XY1⎤⎦⎥
,系统的图形矩阵A为
⎡⎣⎢adgbehcfi⎤⎦⎥
,则像素点C最终显示在屏幕上的位置就是两个矩阵的乘积。即最终显示的点
R=AC=⎡⎣⎢adgbehcfi⎤⎦⎥∗⎡⎣⎢XY1⎤⎦⎥=⎡⎣⎢X1Y11⎤⎦⎥
其中
X1=a∗X+b∗Y+c∗1
Y1
也是同样的计算方法。这就是一般图像显示在屏幕上的计算方法,一般情况下,系统的初始矩阵都是一个单位矩阵
⎡⎣⎢100010001⎤⎦⎥
,这样图像的最开始位置就是其初始的坐标矩阵中的
X和Y
Android中图形特效分类:
常见的图形特效处理有四种:
- 平移变换:图像在屏幕上沿
X轴和Y轴
移动一定距离
X=X0+ΔXY=Y0+ΔY
- 旋转变换:图像按照一某一点旋转一定角度
X0=rcosα,Y=rsinα
旋转了β角度之后
- 缩放变换:图像的X和Y按照一定的缩放比例进行放大或缩小
X=K1∗X0,Y=K2∗Y0
- 错切变换:所有点的X轴坐标不变,Y轴平移一定长度;或者是所有点的Y轴坐标不变,X轴坐标平移一定长度。
X=X0+K1∗Y0Y=K2∗X0+Y0
Android系统同样为我们提供了矩阵运算的方法:
Matrix类中有提供了以上四种变化的设置方法和计算方法:
matrix.setRotate() 设置旋转矩阵
matrix.setTranslate() 设置平移矩阵
matrix.setScale()设置缩放矩阵
matrix.setSkew()设置错切矩阵
matrix.pre()矩阵前乘
matrix.post()矩阵后乘
Android中像素块的处理:
之前的一些操作针对的都是像素点而言,其实Android中也提供了对于像素块的处理方法。其原理和之前相同,只是这次要处理的由单独的一个像素点变成了一片区域内的像素点。
drawBitmapMesh(Bitmap bitmap,int meshWidth ,int meshHeight,float[] verts,int vertOffset,int[] color,int colorOffset,Paint paint):提供了修改像素块的方法
Bitmap bitmap:将要扭曲的Bitmap
int meshWidth:需要的横向网格数目
int meshHeight:需要的纵向网格数目
float[] verts:网格交叉点坐标数组
int vertOffset:数组中开始跳过的(x,y)坐标对的数目
int[] color:颜色数组
int colorOffset:颜色数组中开始跳过的(x,Y)坐标对数目
Paint paint:画笔
步骤:
首先在Bitmap上横纵各画N-1条线,这样就把Bitmap分成了N块,横纵的N-1条线交织得到了N*N个交点,这N*N个交点以 x1,y1,x2,y2....... 的形式存在verts数组中
然后要改变像素块,只需要改变verts数组中交叉点的位置即可,比如说当两个交叉点离得很近时就是一个扭曲的效果。