Регулировка яркости с помощью ColorMatrix - PullRequest
3 голосов
/ 07 февраля 2012

Я пытаюсь отрегулировать яркость изображения (вы можете видеть эту опцию в 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));
    }

Я хочу понять, как использовать цветовую матрицу для изменения яркости таким же образом. Если есть какой-то другой способ добиться этого, я открыт для решений:)

Ответы [ 2 ]

3 голосов
/ 10 февраля 2012

Хорошо ... Итак, я наконец понял это.

Яркость можно отрегулировать с помощью класса PorterDuffColorFilter

Вот метод, который я использую

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

}

Значение прогресса от -100 (темное) до 100 (светлое)

Просто передайте значения, как в фотошопе, этому методу.Полученный фильтр можно использовать с краской и холстом.

Надеюсь, это кому-нибудь поможет.

2 голосов
/ 28 ноября 2014

Вы можете использовать это, чтобы изменить яркость

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 из-за его скорости.

...