Konvertering ARBG til RGB med alfa-blending

stemmer
19

La oss si at vi har en ARGB farge:

Color argb = Color.FromARGB(127, 69, 12, 255); //Light Urple.

Når dette er malt på toppen av en eksisterende farge, vil fargene blandes. Så når det er blandet med hvit, er den resulterende fargenColor.FromARGB(255, 162, 133, 255);

Løsningen skal fungere som dette:

Color blend = Color.White; 
Color argb = Color.FromARGB(127, 69, 12, 255); //Light Urple.      
Color rgb = ToRGB(argb, blend); //Same as Color.FromARGB(255, 162, 133, 255);

Hva er ToRGB's implementering?

Publisert på 05/08/2008 klokken 20:12
kilden bruker
På andre språk...                            


3 svar

stemmer
16

Det kalles alpha blending .

I psuedocode, forutsatt at bakgrunnsfargen (blanding) har alltid 255 alfa. Også foruts alfa er 0-255.

alpha=argb.alpha()
r = (alpha/255)*argb.r() + (1 - alpha/255)*blend.r()
g = (alpha/255)*argb.g() + (1 - alpha/255)*blend.g()
b = (alpha/255)*argb.b() + (1 - alpha/255)*blend.b()

Merk: du sannsynligvis trenger å være litt (mer) forsiktig med flyttalls / int matematikk og avrundingsspørsmål, avhengig av språket. Støpte mellomprodukter tilsvar

Redigert for å legge til:

Hvis du ikke har en bakgrunnsfarge med en alfa 255, algebra blir mye mer komplisert. Jeg har gjort det før, og det er en morsom øvelse overlates til leseren (hvis du virkelig trenger å vite, spør et annet spørsmål :).

Med andre ord, hvilken farge C passer inn noen bakgrunn den samme som blanding A, deretter blanding B. Dette er typen som beregning av A + B (som ikke er den samme som B + A).

Svarte 05/08/2008 kl. 20:16
kilden bruker

stemmer
4

Jeg vet dette er en gammel tråd, men jeg vil legge til dette:

Public Shared Function AlphaBlend(ByVal ForeGround As Color, ByVal BackGround As Color) As Color
    If ForeGround.A = 0 Then Return BackGround
    If BackGround.A = 0 Then Return ForeGround
    If ForeGround.A = 255 Then Return ForeGround
    Dim Alpha As Integer = CInt(ForeGround.A) + 1
    Dim B As Integer = Alpha * ForeGround.B + (255 - Alpha) * BackGround.B >> 8
    Dim G As Integer = Alpha * ForeGround.G + (255 - Alpha) * BackGround.G >> 8
    Dim R As Integer = Alpha * ForeGround.R + (255 - Alpha) * BackGround.R >> 8
    Dim A As Integer = ForeGround.A

    If BackGround.A = 255 Then A = 255
    If A > 255 Then A = 255
    If R > 255 Then R = 255
    If G > 255 Then G = 255
    If B > 255 Then B = 255

    Return Color.FromArgb(Math.Abs(A), Math.Abs(R), Math.Abs(G), Math.Abs(B))
End Function

public static Color AlphaBlend(Color ForeGround, Color BackGround)
{
    if (ForeGround.A == 0)
        return BackGround;
    if (BackGround.A == 0)
        return ForeGround;
    if (ForeGround.A == 255)
        return ForeGround;

    int Alpha = Convert.ToInt32(ForeGround.A) + 1;
    int B = Alpha * ForeGround.B + (255 - Alpha) * BackGround.B >> 8;
    int G = Alpha * ForeGround.G + (255 - Alpha) * BackGround.G >> 8;
    int R = Alpha * ForeGround.R + (255 - Alpha) * BackGround.R >> 8;
    int A = ForeGround.A;

    if (BackGround.A == 255)
        A = 255;
    if (A > 255)
        A = 255;
    if (R > 255)
        R = 255;
    if (G > 255)
        G = 255;
    if (B > 255)
        B = 255;

    return Color.FromArgb(Math.Abs(A), Math.Abs(R), Math.Abs(G), Math.Abs(B));
}
Svarte 26/06/2013 kl. 10:52
kilden bruker

stemmer
2

hvis du ikke trenger å vite dette pre-render, kan du alltids bruke win32 metode for getpixel, tror jeg.

Merk: skrive på iPhone i midten av Missouri uten inet tilgang. Vil se opp virkelig win32 eksempel og se om det er en .net tilsvarende.

I tilfelle noen bryr seg, og ønsker ikke å bruke (utmerket) svar postet ovenfor, kan du få fargen verdien av en piksel i Net via denne linken MSDN eksempel

Svarte 06/08/2008 kl. 06:39
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more