Převod ARBG RGB alfa míchání

hlasů
19

Řekněme, že máme barvu ARGB:

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

Je-li to malované na vrcholu stávající barvy, budou barvy míchat. Takže když se smíchá s bílou, výsledná barva jeColor.FromARGB(255, 162, 133, 255);

Řešení by mělo fungovat takto:

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

Co je ToRGBto implementace?

Položena 05/08/2008 v 21:12
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
16

Je to tzv alfa míchání .

V psuedocode, za předpokladu, že barva pozadí (směsi) má vždy 255 alfa. Také se předpokládá alfa je 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()

Poznámka: pravděpodobně budete muset být trochu (více) pozor na plovoucí desetinnou čárkou / int matematiku a zaokrouhlování problémy, v závislosti na jazyku. V souladu s tím cast meziprodukty

Změněné přidat:

Pokud nechcete mít barvu pozadí s alfa 255, algebra dostane mnohem složitější. Už jsem to udělal dříve a je to zábavné cvičení vlevo pro čtenáře (pokud opravdu potřebujete vědět, položit další otázku :).

Jinými slovy, to, co barvu C zapadá do nějakého pozadí stejné, jako míšení, pak smícháním B. To je něco jako výpočet A + B (který není stejný jako B + A).

Odpovězeno 05/08/2008 v 21:16
zdroj uživatelem

hlasů
4

Vím, že to je stará nit, ale chci dodat toto:

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));
}
Odpovězeno 26/06/2013 v 11:52
zdroj uživatelem

hlasů
2

pokud nepotřebujete to vědět předem činí, můžete vždy použít metodu Win32 GetPixel, věřím.

Poznámka: psaní na iPhone v polovině Missouri bez přístupu inet. Bude vypadat up skutečnou win32 příklad a uvidíme, jestli tam je .net ekvivalent.

V případě, že někdo stará a nechce používat (výborný) odpověď výše vyslán, můžete získat hodnotu barvy pixelu .NET prostřednictvím tohoto odkazu příkladu MSDN

Odpovězeno 06/08/2008 v 07:39
zdroj uživatelem

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