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:
- *
- * * [ a, b, c, d, e,
- * f, g, h, i, j,
- * k, l, m, n, o,
- * p, q, r, s, t ]
- *
- * *When applied to a color [R, G, B, A], the resulting color
- * is computed as:
- *
- *
- * * 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>
- *
- *
- * That resulting color [R', G', B', A']</code>
- * then has each channel clamped to the 0 to 255
- * range.
- *
- */
由此上面注释我们可以知颜色矩阵 m,和颜色分量矩阵 C。
即新的颜色分量 C'是颜色矩阵 m 乘以颜色分量矩阵新加一列值为 1 的 5x1 的矩阵所得的 4x1 矩阵,矩阵乘法公式可看注解
由此可见新的颜色色值和处理之前的颜色色值之间的关系,矩阵 m 中各行的前四个分别决定新色值的 RGBA,各行的第五个系数为新色值分量的偏移量。初始的颜色矩阵为:
在使用时颜色矩阵的值是以一个一维 float 类型数组的形式来存储的,以下是一个通过 ColorMatrix 处理 Bitmap 图片的方法,实际上是 ColorMatrix 中初始化的矩阵,所以图片没变化,可自己更改数组。
- private float[] mColorMatrix = new float[20];
- private Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.mipmap.maidou);
- public void reset() {
- final float[] a = mArray;
- Arrays.fill(a, 0);
- a[0] = a[6] = a[12] = a[18] = 1;
- }
- private Bitmap setImageMatrix(Bitmap bitmap){
- reset();
- Bitmap bmp = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Bitmap.Config.ARGB_8888);
- ColorMatrix colorMatrix = new ColorMatrix();
- colorMatrix.set(mColorMatrix);
- Canvas canvas = new Canvas(bmp);
- Paint paint = new Paint();
- paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
- canvas.drawBitmap(bitmap,0,0,paint);
- return bmp;
- }
由于 Android 系统不允许直接对原图做修改,因此先创建一个副本图片,再通过 ColorMatrix 的 set 方法设置颜色矩阵,使用 Paint 类的 setColorFilter()方法,传入一个带有 ColorMatrix 对象的 ColorMatrixColorFilter 对象,使用这支修饰过的画笔在 Canvas 上绘制原图,从而使颜色矩阵作用在原图上。
我们使用照相机时往往能看到不同的照相效果,如:灰度、怀旧等其实也是通过改变图像的色值来显示效果。而改变色值不同的效果有不同的颜色矩阵,举例有:灰度效果(a)、图像反转(b)、怀旧效果(c)、高饱和度(d)
preConcat(ColorMatrix prematrix) 和 postConcat(ColorMatrix postmatrix) 两个方法分别是将目标效果矩阵放在本矩阵之前和放在本矩阵之后,由于矩阵的乘法一般不满足交换律,因此前后关系会对效果有不同的影响。
当亮度为 0 时图片呈黑色。
其中:
这个方法只改颜色部分即左上九个参数, 有一定的公式,大致为如下:
效果分别为:
来源: http://www.bubuko.com/infodetail-1947521.html