Converta cor RGBA em RGB

Como converter uma tupla de cor RGBA, exemplo (96, 96, 96, 202), para a tupla de cor RGB correspondente?

Editar:

O que eu quero é obter um valor RGB que seja mais semelhante à tupla RGBA visualmente no fundo branco.

Eu melhorei a resposta de Johannes porque ele está certo sobre isso.

* Alguns comentários foram levantados que minha resposta original não estava correta. Funcionou se valores alfa foram invertidos do normal. Por definição, no entanto, isso não funcionará na maioria dos casos. Portanto, atualizei a fórmula abaixo para estar correta para o caso normal. Isso acaba sendo igual a resposta do @ hkurabko abaixo *

Uma resposta mais específica, no entanto, incorpora o valor alfa no resultado de cor real com base em uma cor de fundo opaca (ou “matte”, como é referido).

Existe um algoritmo para isso ( deste link da wikipedia):

  • Normalize os valores RGBA para que estejam todos entre 0 e 1 – basta dividir cada valor em 255 para fazer isso. Vamos ligar para o resultado Source .
  • Normalize também a cor fosca (preto, branco o que for). Nós chamaremos o resultado BGColor Note – se a cor de fundo também for transparente, então você terá que reciclar o processo para aquele primeiro (novamente, escolhendo um matte) para obter o RGB de origem para esta operação.
  • Agora, a conversão é definida como (no código completo do psuedo aqui!):

     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 obter os valores finais de 0-255 para Target basta multiplicar todos os valores normalizados por 255, certificando-se de limitar a 255 se algum dos valores combinados exceder 1,0 (isso é superexposição e há algoritmos mais complexos lidando com isso envolve processamento de imagens inteiras etc.).

EDIT: Em sua pergunta você disse que quer um fundo branco – nesse caso, basta fixar BGColor para 255,255,255.

hm … em relação a

http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending

solução fornecida por Andras Zoltan deve ser ligeiramente alterada para:

 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 versão alterada funciona bem para mim, porque em prev. a versão rgba (0,0,0,0) com rgb mate (ff, ff, ff) será alterada para rgb (0,0,0).

Isso depende do espaço de colors que você usa. Se o RGBA estiver no espaço de colors pré-multiplicado e for semitransparente, será necessário dividir o alfa para obter a cor RGB correta. Se a cor estiver em um espaço de colors não pré-multiplicado, você poderá descartar o canal alfa.

No meu caso, eu queria converter uma imagem RGBA em RGB e o seguinte funcionava como esperado:

 rgbImage = cv2.cvtColor(npimage, cv2.COLOR_RGBA2RGB) 

Aqui está uma function SASS conveniente de acordo com as respostas de Andras e 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); } 

Aqui está um código java (funciona na API do Android 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); 

function:

 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; }