将RGBA颜色转换为RGB
如何将RGBA颜色元组(例如(96,96,96,202))转换为相应的RGB颜色元组?
编辑:
我想要的是在白色背景上获得与RGBA元组最相似的RGB值。
我赞成Johannes的回答,因为他是对的。
*有人提出了一些意见,我原来的回答是不正确的。 如果alpha值从正常状态倒转,它就会起作用。 然而,根据定义,这在大多数情况下不起作用。 因此,我更新了下面的公式,对于正常情况是正确的。 这最终等于@ hkurabko的答案在下面*
但是,更具体的答案是,将alpha值结合到基于不透明背景颜色(或称为“无光泽”)的实际颜色结果中。
有一个这样的algorithm(来自维基百科链接):
- 规范RGBA值,使他们都在0和1之间 – 只要将每个值除以255来做到这一点。 我们将调用结果
Source
。 - 还规范了哑光的颜色(黑色,白色)。 我们将调用
BGColor
Note的结果 – 如果背景颜色也是透明的,那么您必须首先为该操作recursion处理(再次select遮罩)以获得源RGB。 -
现在,转换被定义为(在这里完整的伪代码!):
Source => Target = (BGColor + Source) = Target.R = ((1 - Source.A) * BGColor.R) + (Source.A * Source.R) Target.G = ((1 - Source.A) * BGColor.G) + (Source.A * Source.G) Target.B = ((1 - Source.A) * BGColor.B) + (Source.A * Source.B)
要获得Target
的最终0-255值,只需将所有归一化值乘以255即可,如果任何一个组合值超过1.0,则确保将其设为255(这是过度曝光,还有更复杂的algorithm处理这涉及整个image processing等)。
编辑:在你的问题,你说你想要一个白色的背景 – 在这种情况下,只是修复BGColor 255,255,255。
嗯…关于
http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
Andras Zoltan提供的解决scheme应该稍微改为:
Source => Target = (BGColor + Source) = Target.R = ((1 - Source.A) * BGColor.R) + (Source.A * Source.R) Target.G = ((1 - Source.A) * BGColor.G) + (Source.A * Source.G) Target.B = ((1 - Source.A) * BGColor.B) + (Source.A * Source.B)
这个改变的版本适合我,因为在prev。 版本rgba(0,0,0,0)与磨砂rgb(ff,ff,ff)将被更改为rgb(0,0,0)。
这取决于你使用的色彩空间。 如果RGBA处于预先倍增的色彩空间并且是半透明的,则需要将alpha分开以获得正确的RGB颜色。 如果颜色处于不是预先倍增的颜色空间,那么您可以放弃Alpha通道。
在我的情况下,我想将一个RGBA图像转换为RGB,以下工作正如所料:
rgbImage = cv2.cvtColor(npimage, cv2.COLOR_RGBA2RGB)
按照Andras和hkurabko的回答,这是一个方便的SASSfunction。
@function rgba_blend($fore, $back) { $ored: ((1 - alpha($fore)) * red($back) ) + (alpha($fore) * red($fore)); $ogreen: ((1 - alpha($fore)) * green($back) ) + (alpha($fore) * green($fore)); $oblue: ((1 - alpha($fore)) * blue($back) ) + (alpha($fore) * blue($fore)); @return rgb($ored, $ogreen, $oblue); }
用法:
$my_color: rgba(red, 0.5); // build a color with alpha for below #a_div { background-color: rgba_blend($my_color, white); }