1

飽和度について次のマトリックスを作成しましたが、適切な結果が得られません。誰かがここで何が問題なのか教えてもらえますか?

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

1 に答える 1

1

私は間違っていたすべてのケースで赤いチャンネルを増やしていたので、行列を正しく書くことによって上記の関数を修正しました.これはうまくいきます.

   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));
}
于 2012-09-25T12:06:03.387 に答える