hexadecimal google convertir color image colors rgb

image - google - rgba color



Conversión de color RGBA a RGB (6)

Aquí hay algunos códigos 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; }

¿Cómo convertir una tupla de color RGBA, 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 visualmente a la tupla RGBA sobre fondo blanco.


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


En mi caso, quería convertir una imagen RGBA a RGB y lo siguiente funcionó tal como se esperaba:

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


Esto depende del espacio de color que use. Si el RGBA está en espacio de color pre-multiplicado y es semitransparente, debe dividir alfa para obtener el color RGB correcto. Si el color está en un espacio de color no pre-multiplicado, entonces puedes descartar el canal alfa.


He actualizado la respuesta de Johannes porque tiene razón al respecto.

* Algunos comentarios se han planteado que mi respuesta original no era correcta. Funcionó si los valores alfa se invirtieron de lo normal. Por definición, sin embargo, esto no funcionará en la mayoría de los casos. Por lo tanto, he actualizado 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 *

Una respuesta más específica, sin embargo, incorpora el valor alfa en el resultado de color real basado en un color de fondo opaco (o "mate" como se lo denomina).

Hay un algoritmo para esto (de this enlace de wikipedia):

  • Normalice los valores de RGBA para que estén todos entre 0 y 1 - solo divida cada valor por 255 para hacer esto. Llamaremos el resultado Source .
  • Normaliza también el color mate (negro, blanco). Llamaremos al resultado BGColor Note : si el color de fondo también es transparente, entonces deberá repetir el proceso por ese primero (de nuevo, eligiendo un mate) para obtener el RGB de origen para esta operación.
  • Ahora, la conversión se define como (¡en código de 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 para Target , simplemente multiplique todos los valores normalizados por 255, asegurándose de que el límite sea 255 si alguno de los valores combinados excede 1.0 (esto es sobreexposición y existen algoritmos más complejos que tratan con esto implica el procesamiento de imágenes completas, etc.).

EDIT: en tu pregunta dijiste que querías un fondo blanco, en ese caso simplemente arregla BGColor a 255,255,255.


hm ... con respecto a

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

La solución provista 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 prev. la versión rgba (0,0,0,0) con rgb mate (ff, ff, ff) se cambiará a rgb (0,0,0).