以编程方式减轻颜色

动机

我想找到一种方法来获取任意颜色并减少一些阴影,这样我就可以用编程方式创建一种从单色到较亮版本的渐变效果。 该渐变将用作UI中的背景。

可能性1

很明显,我可以将RGB值分开并逐个增加一定量。 这实际上是我想要的吗?

可能性2

我的第二个想法是将RGB转换为HSV / HSB / HSL(色调,饱和度,数值/亮度/亮度),稍微提高亮度,稍微降低饱和度,然后将其转换回RGB。 这会在一般情况下产生预期效果吗?


我会去第二个选择。 一般来说,RGB空间对于颜色处理(创建从一种颜色到另一种颜色的转换,减淡/变暗颜色等)并不是很好。 以下是我找到的两个站点,可以快速搜索将HSL转换为/从RGB转换为HSL:

  • 从“计算机图形学基础”
  • 一些C#中的源代码 - 应该很容易适应其他编程语言。

  • 正如Wedge所说,你想要使事情变得更加明亮,但只有其中一种颜色变得饱和(即击中255或更大)才会起作用。 此时,您可以将值限制在255,但您会轻微改变色调。 要保持色调,您想要保持(中低 - 最低)/(最高 - 最低)的比例。

    以下是Python中的两个函数。 第一种方法实现了简单的方法,只需将RGB值限制在255即可。 第二个重新分配多余的值以保持色调完好。

    def clamp_rgb(r, g, b):
        return min(255, int(r)), min(255, int(g)), min(255, int(b))
    
    def redistribute_rgb(r, g, b):
        threshold = 255.999
        m = max(r, g, b)
        if m <= threshold:
            return int(r), int(g), int(b)
        total = r + g + b
        if total >= 3 * threshold:
            return int(threshold), int(threshold), int(threshold)
        x = (3 * threshold - total) / (3 * m - total)
        gray = threshold - x * m
        return int(gray + x * r), int(gray + x * g), int(gray + x * b)
    

    我创建了一个以RGB值(224,128,0)开始的渐变,并将其乘以1.0,1.1,1.2等直到2.0。 上半部分是使用clamp_rgb的结果,下半部分是redistribute_rgb的结果。 我认为很容易看到重新分配溢出会产生更好的结果,而不必离开RGB色彩空间。

    作为比较,这里是HLS和HSV颜色空间中的相同渐变,由Python的colorsys模块实现。 只有L组件被修改,并且对所得到的RGB值执行了钳位。 结果是相似的,但需要为每个像素进行色彩空间转换。


    在C#中:

    public static Color Lighten(Color inColor, double inAmount)
    {
      return Color.FromArgb(
        inColor.A,
        (int) Math.Min(255, inColor.R + 255 * inAmount),
        (int) Math.Min(255, inColor.G + 255 * inAmount),
        (int) Math.Min(255, inColor.B + 255 * inAmount) );
    }
    

    我在各地都用过这个。

    链接地址: http://www.djcxy.com/p/87395.html

    上一篇: Programmatically Lighten a Color

    下一篇: TextView Color for Android