Domanda

Come convertire una tupla di colore RGBA, esempio (96, 96, 96, 202), nella corrispondente tupla di colore RGB?

Modificare:

Quello che voglio è ottenere un valore RGB che sia visivamente molto simile alla tupla RGBA su sfondo bianco.

È stato utile?

Soluzione

Ho votato a favore della risposta di Johannes perché ha ragione su questo.

* Sono stati sollevati alcuni commenti secondo cui la mia risposta originale non era corretta.Funzionava se i valori alfa erano invertiti rispetto al normale.Per definizione, tuttavia, questo non funzionerà nella maggior parte dei casi.Ho quindi aggiornato la formula seguente affinché sia ​​corretta per il caso normale.Questo finisce per essere uguale alla risposta di @ hkurabko di seguito *

Una risposta più specifica, tuttavia, incorpora il valore alfa nel risultato cromatico effettivo basato su un colore di sfondo opaco (o "opaco" come viene chiamato).

Esiste un algoritmo per questo (da Questo collegamento a Wikipedia):

  • Normalizza i valori RGBA in modo che siano tutti compresi tra 0 e 1: per farlo basta dividere ciascun valore per 255.Chiameremo il risultato Source.
  • Normalizza anche il colore opaco (nero, bianco qualunque).Chiameremo il risultato BGColor Nota - se anche il colore di sfondo è trasparente, dovrai prima ripetere il processo (di nuovo, scegliendo un mascherino) per ottenere l'RGB di origine per questa operazione.
  • Ora, la conversione è definita come (nel codice pseudo completo qui!):

    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)
    

Per ottenere i valori finali 0-255 per Target moltiplichi semplicemente tutti i valori normalizzati per 255, assicurandoti di impostare un limite a 255 se uno qualsiasi dei valori combinati supera 1,0 (si tratta di sovraesposizione e ci sono algoritmi più complessi che si occupano di questo che implicano l'elaborazione dell'intera immagine, ecc.) .

MODIFICARE:Nella tua domanda hai detto che vuoi uno sfondo bianco: in tal caso fissa semplicemente BGColor su 255.255.255.

Altri suggerimenti

hm ... riguardo a

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

soluzione fornita da Andras Zoltan dovrebbe essere leggermente modificata in:

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)

Questa versione modificata funziona bene per me, perché in prev. versione RGBA (0,0,0,0) con matte rgb (ff, ff, ff) sarà cambiato a rgb (0,0,0).

Questo dipende dallo spazio colore più usato. Se il RGBA è in fase di pre-moltiplicato colore-spazio ed è semi-trasparente, è necessario dividere le alfa per ottenere il corretto colore RGB. Se il colore è nella non-colore spazio pre-moltiplicato, allora si può solo scartare il canale alfa.

Nel mio caso, ho voluto convertire un'immagine RGBA per RGB e il seguente lavorato proprio come previsto:

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

Ecco una comoda funzione di SASS secondo Andras' e le risposte di 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);
}

Utilizzo:

$my_color: rgba(red, 0.5); // build a color with alpha for below

#a_div {
  background-color: rgba_blend($my_color, white);
}

Ecco il codice java (funziona su 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);

funzione:

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top