当前位置: 代码迷 >> 综合 >> Android滤镜--ColorMatrixColorFilter--ColorMatrix
  详细解决方案

Android滤镜--ColorMatrixColorFilter--ColorMatrix

热度:30   发布时间:2023-09-14 07:25:58.0

之前用到ColorMatrixColorFilter,其中除了传入一个五阶矩阵外,还可以使用ColorMatrix,调用其成员函数

/*** Set this colormatrix to scale by the specified values.*/public void setScale(float rScale, float gScale, float bScale,float aScale) {final float[] a = mArray;for (int i = 19; i > 0; --i) {a[i] = 0;}a[0] = rScale;a[6] = gScale;a[12] = bScale;a[18] = aScale;}
该方法为设置颜色缩放,可以实现颜色增强效果
@Overrideprotected void onDraw(Canvas canvas) {//画原图Paint paint = new Paint();RectF rectF = new RectF(100, 100, 100 + bitmap.getWidth() / 2, 100 + bitmap.getHeight() / 2);canvas.drawBitmap(bitmap, null, rectF, paint);//画设置ColorFilter效果后的图rectF = new RectF(600, 100, 600 + bitmap.getWidth() / 2, 100 + bitmap.getHeight() / 2);ColorMatrix colorMatrix = new ColorMatrix();//和颜色增强效果相同colorMatrix.setScale(1.2f, 1.2f, 1.2f, 1);paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));canvas.drawBitmap(bitmap, null, rectF, paint);}
Android滤镜--ColorMatrixColorFilter--ColorMatrix
缩放运算---乘法 -- 颜色增强.jpg

/*** Set the matrix to affect the saturation of colors.** @param sat A value of 0 maps the color to gray-scale. 1 is identity.*/public void setSaturation(float sat) {reset();float[] m = mArray;final float invSat = 1 - sat;final float R = 0.213f * invSat;final float G = 0.715f * invSat;final float B = 0.072f * invSat;m[0] = R + sat; m[1] = G;       m[2] = B;m[5] = R;       m[6] = G + sat; m[7] = B;m[10] = R;      m[11] = G;      m[12] = B + sat;}
设置饱和度
Android滤镜--ColorMatrixColorFilter--ColorMatrix
setSaturation.gif

/*** Set the rotation on a color axis by the specified values.* <p>* <code>axis=0</code> correspond to a rotation around the RED color* <code>axis=1</code> correspond to a rotation around the GREEN color* <code>axis=2</code> correspond to a rotation around the BLUE color* </p>*/public void setRotate(int axis, float degrees) {reset();double radians = degrees * Math.PI / 180d;float cosine = (float) Math.cos(radians);float sine = (float) Math.sin(radians);switch (axis) {// Rotation around the red colorcase 0:mArray[6] = mArray[12] = cosine;mArray[7] = sine;mArray[11] = -sine;break;// Rotation around the green colorcase 1:mArray[0] = mArray[12] = cosine;mArray[2] = -sine;mArray[10] = sine;break;// Rotation around the blue colorcase 2:mArray[0] = mArray[6] = cosine;mArray[1] = sine;mArray[5] = -sine;break;default:throw new RuntimeException();}}
参数aixs为 0 红色轴,1,绿色,2,蓝色; 参数degrees为旋转的角度
Android滤镜--ColorMatrixColorFilter--ColorMatrix
setRotate.gif

/*** Set this colormatrix to the concatenation of the two specified* colormatrices, such that the resulting colormatrix has the same effect* as applying matB and then applying matA.* <p>* It is legal for either matA or matB to be the same colormatrix as this.* </p>*/public void setConcat(ColorMatrix matA, ColorMatrix matB) {float[] tmp;if (matA == this || matB == this) {tmp = new float[20];} else {tmp = mArray;}final float[] a = matA.mArray;final float[] b = matB.mArray;int index = 0;for (int j = 0; j < 20; j += 5) {for (int i = 0; i < 4; i++) {tmp[index++] = a[j + 0] * b[i + 0] +  a[j + 1] * b[i + 5] +a[j + 2] * b[i + 10] + a[j + 3] * b[i + 15];}tmp[index++] = a[j + 0] * b[4] +  a[j + 1] * b[9] +a[j + 2] * b[14] + a[j + 3] * b[19] +a[j + 4];}if (tmp != mArray) {System.arraycopy(tmp, 0, mArray, 0, 20);}}
组合效果,将两个ColorMatrix 的效果组合
  相关解决方案