2012-09-25 3 views
1

J'ai écrit la matrice suivante pour la saturation, mais elle ne donne pas de bons résultats. Est-ce que quelqu'un peut me dire ce qui ne va pas ici?Android Filtre de saturation Matrice

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; 
} 

Répondre

1

J'ai corrigé la fonction ci-dessus en écrivant la matrice correctement depuis que je croissait canal rouge dans tous les cas qui a été wrong.This fonctionne bien.

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

La matrice doit être 4x5, pas 5x5. http://developer.android.com/reference/android/graphics/ColorMatrix.html – VinceFior