Android 合并两个ColorMatrix或在Imageview上同时应用两个或多个ColorMatrix

Android 合并两个ColorMatrix或在Imageview上同时应用两个或多个ColorMatrix,android,image-processing,android-imageview,android-image,colormatrix,Android,Image Processing,Android Imageview,Android Image,Colormatrix,我正在更改ImageView的亮度、对比度、饱和度和色调。我在上面找了很多 我得到了一些与ColorMatrix一起工作的代码。 [1.]对于亮度而言,ColorMatrix类似于 float brightness = (-50F * 1.5F); ColorMatrix cmB = new ColorMatrix(); cmB.set(new float[] { 1, 0, 0, 0, brightness, 0, 1, 0, 0,brightness,

我正在更改ImageView的亮度、对比度、饱和度和色调。我在上面找了很多

我得到了一些与ColorMatrix一起工作的代码。

[1.]对于亮度而言,ColorMatrix类似于

    float brightness = (-50F * 1.5F);
    ColorMatrix cmB = new ColorMatrix();
    cmB.set(new float[] { 1, 0, 0, 0, brightness,
    0, 1, 0, 0,brightness,
    0, 0, 1, 0, brightness,
    0, 0, 0, 1, 0 });
    myImageView.setColorFilter(new ColorMatrixColorFilter(cmB));
它工作正常

[2.]对于对比度而言,ColorMatrix是不同的,它也能正常工作

但是,所有这些ColorMatrix单独工作。意味着上次应用的ColorMatrix的效果是ImageView上唯一的场景,因为它确实做到了这一点,消除了先前应用的ColorMatrix的效果,并设置上次应用ColorMatrix


现在我想同时合并或混合所有颜色矩阵。意味着要在亮度/饱和度/色调的颜色矩阵的效果上应用对比度的颜色矩阵。

如果要应用两个颜色矩阵,只需将它们相乘即可

如果有颜色矩阵A和颜色矩阵B,则:

C = B * A;
outpixel = C * inpixel 
相当于

outpixel = B * A * inpixel
编辑


我只是注意到这些是5x4矩阵(最初我认为它们是4x4)。由于不能直接相乘,我认为在相乘之前向两个矩阵添加第五个标识行(0,0,0,0,1)是合适的(使它们都为5x5),并在相乘后丢弃第五行。

您可以这样应用多个矩阵:

ColorMatrix colorFilterMatrix = new ColorMatrix();
colorFilterMatrix.postConcat(getContrastMatrix(contrast));
colorFilterMatrix.postConcat(getBrightnessMatrix(brightness));

imageView.setColorFilter(new ColorMatrixColorFilter(colorFilterMatrix));