¿Cómo convertir una tupla de color RGBA, por ejemplo (96, 96, 96, 202), a la tupla de color RGB correspondiente?
Editar:
Lo que quiero es obtener un valor RGB que sea más similar a la tupla RGBA visualmente sobre fondo blanco.
¿Cómo convertir una tupla de color RGBA, por ejemplo (96, 96, 96, 202), a la tupla de color RGB correspondiente?
Editar:
Lo que quiero es obtener un valor RGB que sea más similar a la tupla RGBA visualmente sobre fondo blanco.
Respuestas:
He votado a favor de la respuesta de Johannes porque tiene razón en eso.
* Se han hecho algunos comentarios de que mi respuesta original no era correcta. Funcionó si los valores alfa se invirtieran de lo normal. Sin embargo, por definición, esto no funcionará en la mayoría de los casos. Por lo tanto, actualicé la fórmula a continuación para que sea correcta para el caso normal. Esto termina siendo igual a la respuesta de @ hkurabko a continuación *
Sin embargo, una respuesta más específica incorpora el valor alfa en el resultado de color real basado en un color de fondo opaco (o 'mate' como se le conoce).
Hay un algoritmo para esto (de este enlace de wikipedia):
Source
.BGColor
Nota : si el color de fondo también es transparente, primero tendrá que repetir el proceso (nuevamente, eligiendo un mate) para obtener el RGB de origen para esta operación.Ahora, la conversión se define como (¡en código psuedo completo aquí!):
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)
Para obtener los valores finales de 0-255 Target
, simplemente multiplique todos los valores normalizados de nuevo por 255, asegurándose de limitar a 255 si alguno de los valores combinados excede 1.0 (esto es sobreexposición y hay algoritmos más complejos que se ocupan de esto que involucran procesamiento de imagen completa, etc.).
EDITAR: En su pregunta, dijo que desea un fondo blanco; en ese caso, simplemente fije BGColor en 255,255,255.
hm ... con respecto a
http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
La solución proporcionada por Andras Zoltan debe cambiarse ligeramente a:
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)
Esta versión modificada funciona bien para mí, porque en la anterior. la versión rgba (0,0,0,0) con matte rgb (ff, ff, ff) se cambiará a rgb (0,0,0).
En mi caso, quería convertir una imagen RGBA a RGB y lo siguiente funcionó como se esperaba:
rgbImage = cv2.cvtColor(npimage, cv2.COLOR_RGBA2RGB)
Aquí hay una función SASS conveniente de acuerdo con las respuestas de Andras y hkurabko.
@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);
}
Uso:
$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)
Aquí hay un código de Java (funciona en 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);
función:
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;
}