计算反色的算法

28

我有一组RGB颜色,每个分量的值都在0.0到1.0之间,我需要一个算法来获取该颜色的反色,你有什么好的想法吗?

2个回答

38
newR = 1.0 - r
newG = 1.0 - g
newB = 1.0 - b

如果颜色具有预乘阿尔法值,请使用阿尔法值而不是1.0:

newR = a - r
newG = a - g
newB = a - b

如果颜色是RGBA(1,1,1,1),会怎样? - Ricardo Sanchez
@Ricardo,RGBA(1,1,1,1)的反色是RGBA(0,0,0,1)。有什么回答上让人困惑的地方吗?这不是很明显吗? - Mark Ransom
关于RGBA(1,0,0,0.5),它会变成RGBA(-0.5,0,0,0.5)?这里不应该进行abs()操作吗?还有溢出/下溢(<0 >1)的限制吗? - Aquarius Power
3
请注意,我说的是“预乘”alpha通道,这意味着R、G、B三个通道中的任何一个值都不能大于A通道的值。如果初始值在范围内,反转后的值也将在范围内,无需检查溢出/下溢情况。 - Mark Ransom
如果您的意图是制作对比鲜明的颜色(例如,在深色背景上使用亮字体),那么在接近50%灰度的颜色上会导致差劲的对比度。 - Paulo Carvalho
@PauloCarvalho 没错,这就是为什么我在如何根据背景颜色决定字体颜色?上有一个答案的原因。 - Mark Ransom

10

如果您使用的是 RGB 值到 255,则可以像这样操作:

newR = 255 - r;
newG = 255 - g;
newB = 255 - b;
为了理解这个概念,请将每个值想象成一个从0到255的数线。如果你在该数线上绘制一个数字,那么该数字距离数线的起点就是该数字本身。为了取反它,该数字必须移动到数线的另一端。该算法基本上翻转了数线而不移动其起点或终点。我们的数线是从0到255,因此,如果数字距离开头有10(10),现在它将距离结尾有10(245),从而对颜色进行取反。

2
对于 RGB =(127,127,127)周围的值怎么处理? - Carl H
@CarlH 有什么问题?255-127 = 128,这是在0...255(256调色板)范围内的有效颜色值。 - rbaleksandar
越接近127,127,127,反比例越接近原始值。 127,127,127的反比例将是128,128,128,这几乎是相同的颜色。 - Carl H
@CarlH 我仍然不明白这里的问题。 "几乎相同的颜色" 与反转过程有什么关系?据我所知,它的目的是反转而不是向图像添加更多颜色。 :P - rbaleksandar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接