alfa harmanlama ile RGB'ye ARBG dönüştürme

oy
19

ismindeki bir ARGB rengi var diyelim:

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

Bu varolan bir rengin üzerine boyalı zaman, renkler uyum olacaktır. beyaz ile harmanlanması durumunda Yani, ortaya çıkan renktirColor.FromARGB(255, 162, 133, 255);

Solüsyon bu gibi çalışması gerekir:

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

Nedir ToRGB'ın uygulanması?

Oluştur 05/08/2008 saat 21:12
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
16

Deniyor alfa harmanlama .

psuedocode olarak, arka plan rengi (karışım) varsayarak, her zaman 255 alfa yer alır. Ayrıca alfa 0-255 olduğunu varsayar.

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

not: muhtemelen kayan nokta / int matematik ve dile bağlı olarak yuvarlama sorunları, hakkında biraz (diğer) dikkatli olmak gerekir. buna göre dökme ara

Eklemek Düzenlendi:

Eğer 255 bir alfa bir arka plan rengi yoksa, cebir çok daha karmaşık oluyor. Ben daha önce de yaptık ve onu gerçekten bilmek gerekiyorsa, başka bir soru :) sormak (eğlenceli bir egzersiz okuyucuya sol var.

Diğer bir deyişle, hangi renk Cı sonra bu tür bir A + B hesaplama gibi B karıştırma, bir arka plana A karıştırma aynı karışımları (B ile aynı değildir + U).

Cevap 05/08/2008 saat 21:16
kaynak kullanıcı

oy
4

Bu eski bir iplik olduğunu biliyorum, ama ben eklemek istiyorum:

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));
}
Cevap 26/06/2013 saat 11:52
kaynak kullanıcı

oy
2

Bu önceden görüntülemesini bilmek gerekmez, her zaman GetPixel win32 yöntemi kullanabilirsiniz, inanıyorum.

Not: inet erişimi olan Missouri ortasında iPhone'da yazarak. Gerçek Win32 örneği bakmak ve bir .net eşdeğer olup olmadığını görecek.

Herkes umurunda ve yukarıda yayınlanmıştır (mükemmel) cevabını kullanmak istemeyen durumda, bu bağlantı, üzerinden .NET bir pikselin renk değeri elde edebilirsiniz MSDN örnek

Cevap 06/08/2008 saat 07:39
kaynak kullanıcı

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