原标题:Android滤镜效果实现及原理分析
摘要: Android在处理图片时,最常使用到的数据结构是位图(Bitmap),它包含了一张图片所有的数据。整个图片都是由点阵和颜色值组成的,所谓点阵就是一个包含像素的矩阵,每一个元素对应着图片的一个像素。而颜色值——ARGB,分别对应着透明度、红、绿、蓝这四个通道分量,他们共同决定了每个像素点显示的颜色。
Android在处理图片时,最常使用到的数据结构是位图(Bitmap),它包含了一张图片所有的数据。整个图片都是由点阵和颜色值组成的,所谓点阵就是一个包含像素的矩阵,每一个元素对应着图片的一个像素。灰度图像数据量而颜色值——ARGB,分别对应着透明度、红、绿、蓝这四个通道分量,他们共同决定了每个像素点显示的颜色。下图是ARGB的模型图。

色彩矩阵分析
在Android中,系统使用一个颜色矩阵-ColorMatrix来处理图像的色彩效果。对于图像的每个像素点,都有一个颜色分量矩阵用来保存颜色的RGBA值(下图矩阵C),Android中的颜色矩阵是一个 4×5 的数字矩阵,它用来对图片的色彩进行处理(下图矩阵A)。

在Android系统中,如果想要改变一张图像的色彩显示效果,可以使用矩阵的乘法运算来修改颜色分量矩阵的值。上面矩阵A就是一个 4×5 的颜色矩阵。在Android中,它会以一维数组的形式来存储[a,b,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t],而C则是一个颜色矩阵分量。在处理图像时,使用矩阵乘法运算AC来处理颜色分量矩阵,如下:

利用线性代数知识可以得到如下等式:
R1 = aR + bG + cB + dA + e;G1 = fR + gG + hB + iA + j;B1 = kR + lG + mB + nA + o;A1 = pR + qG + rB + sA + t;
从上面的等式可以发现:
第一行的 abcde 用来决定新的颜色值中的R——红色
第二行的 fghij 用来决定新的颜色值中的G——绿色
第三行的 klmno 用来决定新的颜色值中的B——蓝色
第四行的 pqrst 用来决定新的颜色值中的A——透明度
矩阵A中第五列——ejot 值分别用来决定每个分量中的 offset ,即偏移量 这样一说明,大家对这个公司就明白了。
初始颜色矩阵
接下来,我们重新看一下矩阵变换的计算公式,以R分量为例。
R1 = aR + bG + cB + dA + e;
如果令 a=1,b、c、d、e都等于0,则有 R1=R 。同理对第二、三、四、行进行操作,可以构造出一个矩阵,如下:

把这个矩阵代入公式 R=AC,根据矩阵乘法运算法则,可得R1=R,G1=G,B1=B,A1=A。即不会对原有颜色进行任何修改,所以这个矩阵通常被用来作为初始颜色矩阵。
改变颜色值
如果想要改变颜色值的时候,通常有两种方法:
改变颜色的 offset(偏移量)的值;
改变对应 RGBA 值的系数。
1.改变偏移量
从前面的分析中可知,改变颜色的偏移量就是改变颜色矩阵的第五列的值,其他保持初始矩阵的值即可。如下示例:

上面的操作中改变了 R、G 对应的颜色偏移量,那么结果就是图像的红色和绿色分量增加了100,即整体色调偏黄显示。

其中,左边为原图,右边为改变 偏移量后的效果。
2.改变颜色系数
假如我们队颜色矩阵做如下操作。

改变 G 分量对应的系数 g 的值,增加到2倍,这样在矩阵运算后,图像会整体色调偏绿显示。

通过前面的分析,我们知道调整颜色矩阵可以改变图像的色彩效果,图像的色彩处理很大程度上就是在寻找处理图像的颜色矩阵。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-84905-1.html
海警
太牛叉了
够你喝十天足够了