2012-02-07 3 views
1

ColorMatrix를 사용하여 이미지의 밝기를 조정하려고합니다 (색조를 조정하려고 할 때 Photoshop에서이 옵션을 볼 수 있으며 밝기와 밝기도 두 가지 기능 임) 이것을 달성하기 위해 바꾼다. ColorMatrix를 사용하여 밝기 조정

은 현재 내가

public static void adjustHue(ColorMatrix cm, float value) 
    { 
     value = cleanValue(value, 180f)/180f * (float) Math.PI; 
     if (value == 0) 
     { 
      return; 
     } 
     float cosVal = (float) Math.cos(value); 
     float sinVal = (float) Math.sin(value); 
     float lumR = 0.213f; 
     float lumG = 0.715f; 
     float lumB = 0.072f; 
     float[] mat = new float[] 
     { 
       lumR + cosVal * (1 - lumR) + sinVal * (-lumR), lumG + cosVal * (-lumG) + sinVal * (-lumG), lumB + cosVal * (-lumB) + sinVal * (1 - lumB), 0, 0, 
       lumR + cosVal * (-lumR) + sinVal * (0.143f), lumG + cosVal * (1 - lumG) + sinVal * (0.140f), lumB + cosVal * (-lumB) + sinVal * (-0.283f), 0, 0, 
       lumR + cosVal * (-lumR) + sinVal * (-(1 - lumR)), lumG + cosVal * (-lumG) + sinVal * (lumG), lumB + cosVal * (1 - lumB) + sinVal * (lumB), 0, 0, 
       0f, 0f, 0f, 1f, 0f, 
       0f, 0f, 0f, 0f, 1f }; 
     cm.postConcat(new ColorMatrix(mat)); 
    } 

내가 같은 방식으로 밝기를 변경하려면 colormatrix를 사용하는 방법을 이해하려면이 코드를 사용하여 색조를 변경할 수 있어요. 이것을 달성하는 다른 방법이 있다면, 나는 해결책을 위해 열려있다 :

답변

3

좋아 .. 그래서 나는 이것을 마침내 발견했다.

밝기 여기 제가

public static PorterDuffColorFilter applyLightness(int progress) { 

    if(progress>0) 
    { 
     int value = (int) progress*255/100; 
     return new PorterDuffColorFilter(Color.argb(value, 255, 255, 255), Mode.SRC_OVER); 
    } else { 
     int value = (int) (progress*-1)*255/100; 
     return new PorterDuffColorFilter(Color.argb(value, 0, 0, 0), Mode.SRC_ATOP); 
    } 

} 

사용하고있어서 년대 PorterDuffColorFilter 클래스

를 사용하여 조절 될 수 진행 값은 -100 (어두운)로부터

100 (밝은)이고

Photoshop에서와 같이 값을이 메서드로 전달하기 만하면됩니다. 필터는 페인트와 캔버스와 함께 사용할 수 있습니다.

희망이 있으면 도움이됩니다.

2

당신은 당신은 here 자세한 내용을보실 수 있습니다 가벼움을

public static void adjustLightness(ColorMatrix cm, float value) 
{ 
    value = cleanValue(value, 100); 
    if (value == 0) 
    { 
     return; 
    } 

    float[] mat = new float[] 
      { 
        1,0,0,0,value, 
        0,1,0,0,value, 
        0,0,1,0,value, 
        0,0,0,1,0, 
        0,0,0,0,1 
      }; 
    cm.postConcat(new ColorMatrix(mat)); 
} 

//Helper method 
protected static float cleanValue(float p_val, float p_limit) 
{ 
    return Math.min(p_limit, Math.max(-p_limit, p_val)); 
} 

을 변경하려면이 사용할 수 있습니다,하지만 난 당신이 때문에 그것의 속도가 RenderScript를 사용하는 것이 좋습니다 것입니다.