एआरबीजी को अल्फा ब्लेंडिंग के साथ आरजीबी में कनवर्ट करना

मान लें कि हमारे पास एक एआरजीबी रंग है:

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

When this is painted on top of an existing color, the colors will blend. So when it is blended with white, the resulting color is Color.FromARGB(255, 162, 133, 255);

समाधान इस तरह काम करना चाहिए:

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

ToRGB का कार्यान्वयन क्या है?

0
जोड़ा संपादित
विचारों: 4
मैं सिर्फ यह कहना चाहता हूं कि मुझे यह आश्चर्यजनक लगता है कि "लाइट यूपल" 4 संपादन से बच गया है।
जोड़ा लेखक Matt Dawdy, स्रोत

3 उत्तर

इसे अल्फा ब्लेंडिंग कहा जाता है।

Psuedocode में, पृष्ठभूमि रंग (मिश्रण) मानते हुए हमेशा 255 अल्फा है। यह भी मानता है कि अल्फा 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()

नोट: भाषा के आधार पर आपको शायद फ़्लोटिंग-पॉइंट / int गणित और गोल करने वाले मुद्दों के बारे में थोड़ा (अधिक) सावधान रहना होगा। तदनुसार इंटरमीडिएट कास्ट करें

जोड़ने के लिए संपादित:

यदि आपके पास 255 के अल्फा के साथ पृष्ठभूमि रंग नहीं है, तो बीजगणित बहुत जटिल हो जाता है। मैंने इसे पहले किया है और पाठक को यह एक मजेदार अभ्यास है (यदि आपको वास्तव में जानना है, तो एक और सवाल पूछें :)।

दूसरे शब्दों में, कुछ रंग सी में ब्लेंडिंग ए के समान रंग क्या होता है, फिर बी को मिलाकर यह ए + बी (जो बी + ए के समान नहीं है) की तरह है।

0
जोड़ा

अगर आपको इस प्री-रेंडर को जानने की आवश्यकता नहीं है, तो आप हमेशा getpixel की Win32 विधि का उपयोग कर सकते हैं, मुझे विश्वास है।

नोट: मिसौरी के बीच में आईफोन पर कोई इनसेट एक्सेस नहीं है। असली win32 उदाहरण देखेंगे और देखें कि क्या .net समकक्ष है या नहीं।

In case anyone cares, and doesn't want to use the (excellent) answer posted above, you can get the color value of a pixel in .Net via this link MSDN example

0
जोड़ा

मुझे पता है कि यह एक पुराना धागा है, लेकिन मैं इसे जोड़ना चाहता हूं:

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));
}
0
जोड़ा