Android图像处理技巧理论

导语

书上讲的很细,还讲了一些原理,原理需要一些线性代数的知识,线代都忘光了,主要看后面的实例就Ok了,看实例戳我

主要内容

  • 色彩特效处理
  • 图形特效处理
  • 画笔特效处理
  • SurfaceView

具体内容

Android对于图片的处理,最常使用到的数据结构是位图——Bitmap,它包含了一张图片所有的数据。
整个图片都是由点阵和颜色值组成的,所谓点阵就是一个包含像素的矩阵,第一个元素对应着图片的一个像素。而颜色值——ARGB,分别对应透明度、红、绿、蓝这四个通道分量,它们共同决定了每个像素点显示的颜色。

色彩特效处理

Bitmap图片都是由点阵和颜色值组成的,所谓点阵就是一个包含像素的矩阵,每一个元素对应着图片的一个像素。而颜色值——ARGB,分别对应透明度、红、绿、蓝这四个通道分量,它们共同决定了每个像素点显示的颜色。

色彩矩阵分析

在色彩处理中,我们通常用三个角度描述一张图片:
- 色调:物体传播的颜色。
- 饱和度:颜色的纯度,从0(灰)-100%(饱和)来进行描述。
- 亮度:颜色的相对明暗程度。

而在Android中,系统会使用一个颜色矩阵——ColorMatrix,来处理这些色彩的效果,Android中的颜色矩阵是4X5的数字矩阵,他用来对颜色色彩进行处理,而对于每一个像素点,都有一个颜色分量矩阵来保存ARGB值。

根据前面对矩阵A、C的定义,通过矩阵乘法运算法则,可以得到:

矩阵运算的乘法计算过程如下:

我们观察颜色矩阵A:

从这个公式可以发现:
- 第一行的abcde用来决定新的颜色值R——红色。
- 第二行的fghij用来决定新的颜色值G——绿色。
- 第三行的kimno用来决定新的颜色值B——蓝色。
- 第四行的pqrst用来决定新的颜色值A——透明度。
- 矩阵A中的第五列——ejot值分别用来决定每个分量中的offset,即偏移量。

通过一个小例子来讲解:
首先重新看一下矩阵变换计算公式,以R分量为例,计算过程如下:

R1 = a * R + b* G + c*B+d *A + e

如果让a = 1,b、c、d、e都等于0,那么计算的结果为R1 = R,因此我们可以构建一个矩阵:

如果把这个矩阵公式带入R1 = AC,那么根据矩阵的乘法运算法则,可以得到R1 = R。因此,这个矩阵通常是用来作为初始的颜色矩阵来使用,他不会对原有颜色进行任何变化。
那么当我们要变换颜色值的时候,通常有两种方法。一个是直接改变颜色的offset,即偏移量的值来修改颜色的分量。另一种方法直接改变对应RGBA值的系数来调整颜色分量的值。
从前面的分析中,可以知道要修改R1的值,只要将第五列的值进行修改即可。即改变颜色的偏移量,其它值保存初始矩阵的值,如图:

在上面这个矩阵中,我们修改了R、G所对应的颜色偏移量,那么最后的处理结果就是图像的红色、绿色分别增加了100。而我们知道,红色混合绿色会得到黄色,所以最终的颜色处理结果就是让整个图片的色调偏黄色。

如果修改颜色分量中的某个系数值,而其他只依然保存初始矩阵的值,如图:

在上面这个矩阵中,改变了G分量所对应的系数g,这样在矩形运算后G分量会变成以前的两倍,最终效果就是图像的色调更加偏绿。

下面通过实例看看如何通过矩阵改变图像的色调、饱和度和亮度:

  • 色调:setRotate(int axis, float degree),第一个参数分别使用0、1、2代表Red、Green、Blue三种颜色,第二参数需要处理的值。
ColorMatrix hueMatrix = new ColorMatrix();
hueMatrix.setRotate(0, hue);
hueMatrix.setRotate(1, hue);
hueMatrix.setRotate(2, hue);
  • 饱和度:setSaturation(float sat),参数代表设置饱和度的值。
ColorMatrix saturationMatrix = new ColorMatrix();
saturationMatrix.setSaturation(saturation);
  • 亮度:setScale(float rscale,float gscale,float bscale,float ascale),参数分别是红、绿、蓝、透明度的亮度大小值。
ColorMatrix lumMatrix = new ColorMatrix();
lumMatrix.setScale(lum, lum, lum, 1);
  • 除了单独使用上面三种方式来进行颜色效果处理之外,还提供了postConcat()方法来将矩阵的作用效果混合,从而叠加处理效果。
ColorMatrix imageMatrix = new ColorMatrix();
imageMatrix.postConcat(hueMatrix);
imageMatrix.postConcat(saturationMatrix);
imageMatrix.postConcat(lumMatrix);
常用图像颜色矩阵处理效果
  • 灰色效果:

  • 图像反转:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值