以编程方式减轻颜色
动机
我想找到一种方法来获取任意颜色并减少一些阴影,这样我就可以用编程方式创建一种从单色到较亮版本的渐变效果。 该渐变将用作UI中的背景。
可能性1
很明显,我可以将RGB值分开并逐个增加一定量。 这实际上是我想要的吗?
可能性2
我的第二个想法是将RGB转换为HSV / HSB / HSL(色调,饱和度,数值/亮度/亮度),稍微提高亮度,稍微降低饱和度,然后将其转换回RGB。 这会在一般情况下产生预期效果吗?
我会去第二个选择。 一般来说,RGB空间对于颜色处理(创建从一种颜色到另一种颜色的转换,减淡/变暗颜色等)并不是很好。 以下是我找到的两个站点,可以快速搜索将HSL转换为/从RGB转换为HSL:
正如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