2012-09-25 53 views
1

我已经为饱和度写了下面的矩阵,但它没有给出正确的结果。有人告诉我这里有什么问题吗?Android饱和度过滤器矩阵

ColorMatrix colorMatrix = new ColorMatrix(saturationFilter(0.3f)); 
    ColorMatrixColorFilter matrix = new ColorMatrixColorFilter(colorMatrix); 

    public static float[] saturationFilter(float x){ 

    float lumR = 0.3086f; 
    float lumG = 0.6094f; 
    float lumB = 0.0820f; 
    float matrix[] = {lumR*(1-x)+x,lumG*(1-x),lumB*(1-x), 0, 0, 0,0, 
         lumR*(1-x)+x,lumG*(1-x),lumB*(1-x), 0, 0, 0,0, 
         lumR*(1-x)+x,lumG*(1-x),lumB*(1-x), 0, 0, 0,0, 
         0f, 0f, 0f, 1f, 0f, 
         0f ,0f, 0f, 0f ,1f}; 

    return matrix; 
} 

回答

1

我已经正确地写入矩阵校正的上述功能,因为我在那wrong.This工作正常的所有的情况下增加红色通道。

public static float[] saturationFilter(float saturation){ 

    float p_val = cleanValue(saturation,100); 
    float x = 1+((p_val > 0) ? 3*p_val/100 : p_val/100); 
    float lumR = 0.3086f; 
    float lumG = 0.6094f; 
    float lumB = 0.0820f; 
    float matrix[] = {lumR*(1-x)+x, lumG*(1-x), lumB*(1-x), 0, 0, 
         lumR*(1-x), lumG*(1-x)+x, lumB*(1-x), 0, 0, 
         lumR*(1-x), lumG*(1-x), lumB*(1-x)+x, 0, 0, 
         0f, 0f, 0f, 1f, 0f, 
         0f ,0f, 0f, 0f ,1f}; 

    return matrix; 
    } 

    private static float cleanValue(float p_val, float p_limit){ 
     return Math.min(p_limit, Math.max(-p_limit, p_val)); 
} 
+0

矩阵应该是4x5而不是5x5。 http://developer.android.com/reference/android/graphics/ColorMatrix.html – VinceFior