Android图片的处理一般是将图片转成位图(Bitmap)来的处理,位图包含着一张图片的所有数据。图片实际上是由很多个单一颜色的点阵组成的,这些点越小图片就越细腻,点的颜色是由色值ARGB,即透明度、红、绿、蓝四个分量决定。而整张图片的处理实际上就是对这些点的分量做调整。
Android系统中提供一个用于调整颜色的矩阵ColorMatrix,这是一个4x5的数字矩阵。而颜色的色值则保存在一个4x1的矩阵中。色值的区间为[0,255]。以下是ColorMatrix部分注解
/**
* 4x5 matrix for transforming the color and alpha components of a Bitmap.
* The matrix can be passed as single array, and is treated as follows:
*
* <pre>
* [ a, b, c, d, e,
* f, g, h, i, j,
* k, l, m, n, o,
* p, q, r, s, t ]</pre>
*
* <p>
* When applied to a color <code>[R, G, B, A]</code>, the resulting color
* is computed as:
* </p>
*
* <pre>
* R' = a*R + b*G + c*B + d*A + e;
* G' = f*R + g*G + h*B + i*A + j;
* B' = k*R + l*G + m*B + n*A + o;
* A' = p*R + q*G + r*B + s*A + t;</pre>
*
* <p>
* That resulting color <code>[R', G', B', A']</code>
* then has each channel clamped to the <code>0</code> to <code>255</code>
* range.
* </p>
*/
由此上面注释我们可以知颜色矩阵m,和颜色分量矩阵C。
m=⎡⎣⎢⎢⎢afkpbglqchmrdinsejot⎤⎦⎥⎥⎥C=⎡⎣⎢⎢⎢RGBA⎤⎦⎥⎥⎥
即新的颜色分量C’是颜色矩阵m乘以颜色分量矩阵新加一列值为1的5x1的矩阵所得的4x1矩阵,矩阵乘法公式可看注解
C′=⎡⎣⎢⎢⎢afkpbglqchmrdinsejot⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢⎢⎢⎢RGBA1⎤⎦⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢aR