【问题标题】:Adjusting Lightness using ColorMatrix使用 ColorMatrix 调整亮度
【发布时间】:2012-02-07 11:02:45
【问题描述】:

我正在尝试使用 ColorMatrix 调整图像的亮度(您可以在尝试调整色调时在 Photoshop 中看到此选项,亮度和亮度也是两个不同的功能),但我不知道要更改哪些值来实现这个。

目前我可以使用此代码更改色调

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

我想了解如何使用颜色矩阵以同样的方式改变亮度。如果有任何其他方法可以实现这一点,我愿意提供解决方案:)

【问题讨论】:

    标签: android colormatrix colormatrixfilter


    【解决方案1】:

    好吧..所以我终于想通了。

    可以使用 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(亮)

    只需将 Photoshop 中的值传递给此方法即可。您获得的过滤器可用于绘画和画布。

    希望这对某人有所帮助。

    【讨论】:

    • 这个方法怎么用??
    【解决方案2】:

    你可以用它来改变亮度

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

    你可以阅读更多here,但我建议你使用RenderScript,因为它的速度。

    【讨论】:

    • 您的输入数组中的行数过多。 ColorMatrix 是一个 4x5 矩阵
    猜你喜欢
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多