如何将RGBA颜色元组(例如96、96、96、202)转换为相应的RGB颜色元组?
编辑:
我想要得到的RGB值在视觉上在白色背景上与RGBA元组最相似。
如何将RGBA颜色元组(例如96、96、96、202)转换为相应的RGB颜色元组?
编辑:
我想要得到的RGB值在视觉上在白色背景上与RGBA元组最相似。
Answers:
我赞成约翰尼斯的回答,因为他对此是正确的。
*有人提出我的原始答案不正确的评论。如果alpha值与正常值相反,则可以正常工作。但是,根据定义,这在大多数情况下不起作用。因此,我更新了以下公式以适合正常情况。最终等于@hkurabko在下面的回答*
但是,一个更具体的答案是将alpha值基于不透明的背景色(或称为“遮罩”)合并到实际的颜色结果中。
为此有一个算法(来自此Wikipedia链接):
Source
。BGColor
注” -如果背景颜色也是透明的,则必须首先递归该过程(再次选择遮罩),以获取此操作的源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)
要获得最终的0-255值,Target
只需将所有归一化的值乘以255,并确保如果任何组合值超过1.0,则将上限设置为255(这是过度曝光,并且有更复杂的算法来处理此问题)涉及整个图像处理等)。
编辑:在您的问题中,您说过您想要一个白色背景-在这种情况下,只需将BGColor固定为255,255,255。
嗯...关于
http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
Andras Zoltan提供的解决方案应稍微更改为:
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)
这个变化的版本对我来说很好用,因为在上一版中。带有哑光rgb(ff,ff,ff)的版本rgba(0,0,0,0)将更改为rgb(0,0,0)。
就我而言,我想将RGBA图像转换为RGB,并且以下功能按预期工作:
rgbImage = cv2.cvtColor(npimage, cv2.COLOR_RGBA2RGB)
根据Andras和hkurabko的回答,这是一个便捷的SASS功能。
@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);
}
mix($color, white, $alpha*100)
这是一些Java代码(适用于Android API 24):
//int rgb_background = Color.parseColor("#ffffff"); //white background
//int rgba_color = Color.parseColor("#8a000000"); //textViewColor
int defaultTextViewColor = textView.getTextColors().getDefaultColor();
int argb = defaultTextViewColor;
int alpha = 0xFF & (argb >> 24);
int red = 0xFF & (argb >> 16);
int green = 0xFF & (argb >> 8);
int blue = 0xFF & (argb >> 0);
float alphaFloat = (float)alpha / 255;
String colorStr = rgbaToRGB(255, 255, 255, red, green, blue, alphaFloat);
功能:
protected String rgbaToRGB(int rgb_background_red, int rgb_background_green, int rgb_background_blue,
int rgba_color_red, int rgba_color_green, int rgba_color_blue, float alpha) {
float red = (1 - alpha) * rgb_background_red + alpha * rgba_color_red;
float green = (1 - alpha) * rgb_background_green + alpha * rgba_color_green;
float blue = (1 - alpha) * rgb_background_blue + alpha * rgba_color_blue;
String redStr = Integer.toHexString((int) red);
String greenStr = Integer.toHexString((int) green);
String blueStr = Integer.toHexString((int) blue);
String colorHex = "#" + redStr + greenStr + blueStr;
//return Color.parseColor(colorHex);
return colorHex;
}