Frage

Wie ein RGBA-Farb Tupel zu konvertieren, zB (96, 96, 96, 202), um RGB-Farb Tupel entspricht?

Edit:

Was ich will, ist einen RGB-Wert zu erhalten, die zu der RGBA-Tupel am ähnlichsten ist visuell auf weißen Hintergrund.

War es hilfreich?

Lösung

Ich habe Johannes' Antwort upvoted weil er recht.

* Ein paar Anmerkungen wurden geäußert, dass meine ursprüngliche Antwort war nicht korrekt. Es funktionierte, wenn Alpha-Werte von den normalen invertiert wurden. Per Definition wird dies jedoch nicht den meisten Fällen arbeiten. Ich habe daher die Formel unten als richtig für den Normalfall aktualisiert. Dies endet mit gleich @ hkurabko Antwort unten *

Eine spezifischere Antwort jedoch enthält den Alpha-Wert in das tatsächliche Farbergebnis basierend auf einer opake Hintergrundfarbe (oder ‚Matte‘, wie es bezeichnet wird).

Es gibt einen Algorithmus für diesen (von diesem Wikipedia-Link):

  • Normalisieren der RGBA-Werte, so dass sie alle zwischen 0 und 1 sind - nur jeden Wert dividieren von 255, dies zu tun. Wir werden das Ergebnis Source nennen.
  • Normalisieren auch die matte Farbe (schwarz, weiß was auch immer). Wir werden das Ergebnis BGColor rufen Hinweis - wenn die Hintergrundfarbe auch transparent ist, dann werden Sie den Prozess für die erste müssen Rekursion (wieder ein mattes Auswahl), um die Quelle RGB für diese zu erhalten Betrieb.
  • Nun wird die Umwandlung definiert als (in völligem Pseudo-Code hier!):

    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)
    

Um die letzten 0-255 Werte für Target erhalten Sie multiplizieren Sie einfach alle normierten Werte von 255 bis hinten an, um sicher verschließen Sie bei 255, wenn eine der kombinierten Werte 1,0 überschreiten (dies ist eine Überbelichtung und es sind komplexer Algorithmen Umgang mit diesem der Vollbildverarbeitung usw. beinhalten.).

EDIT:. In Ihrer Frage, die Sie sagen, Sie einen weißen Hintergrund wollen - in diesem Fall nur BGColor beheben zu 255.255.255

Andere Tipps

hm ... in Bezug auf

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

Lösung von Andras Zoltan bereitgestellt sollte etwas geändert werden:

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)

Diese veränderte Version funktioniert gut für mich, denn in i. Version rgba (0,0,0,0) mit mattem rgb (ff, ff, ff) auf rgb geändert werden (0,0,0).

Dies hängt von dem Farbraum Sie verwenden. Wenn die RGBA in pre-multiplizierten Farbraum und ist halbtransparent, müssen Sie Alpha teilen, um die richtige RGB-Farbe zu erhalten. Wenn die Farbe in nicht vorge multiplizierte Farbraum ist, dann können Sie nur den Alpha-Kanal verwerfen.

In meinem Fall wollte ich ein RGBA Bild auf RGB und die folgende arbeitete wie erwartet konvertieren:

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

Hier ist eine bequeme SASS Funktion gemäß Andras' und hkurabko die Antworten.

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

Verbrauch:

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

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

Hier einig Java-Code (Arbeiten auf 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);

Funktion:

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top