अल्फा सम्मिश्रण के साथ आरजीबी को ARBG परिवर्तित

वोट
19

मान लीजिए कि हम एक ARGB रंग करते हैं:

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

जब यह एक मौजूदा रंग के शीर्ष पर चित्रित है, रंग मिश्रण होगा। इसलिए, जब सफेद के साथ मिश्रित किया जाता है, जिसके परिणामस्वरूप रंग है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के कार्यान्वयन?

05/08/2008 को 21:12
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
16

यह कहा जाता है अल्फा सम्मिश्रण

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

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

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

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

दूसरे शब्दों में, क्या रंग सी, एक सम्मिश्रण के रूप में ही कुछ पृष्ठभूमि में मिश्रित होने तो सम्मिश्रण बी इस तरह की गणना के ए + बी की तरह है (जो बी के समान नहीं है + A)।

05/08/2008 को 21:16
का स्रोत उपयोगकर्ता

वोट
4

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

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));
}
26/06/2013 को 11:52
का स्रोत उपयोगकर्ता

वोट
2

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

नोट: कोई मंत्रिमंडल का उपयोग के साथ मिसौरी के बीच में iPhone पर टाइपिंग। असली Win32 उदाहरण देखो और अगर वहाँ एक .net बराबर है देखेंगे।

मामले किसी को भी परवाह करता है, और (उत्कृष्ट) जवाब ऊपर तैनात उपयोग करने के लिए नहीं चाहता है में, आप इस लिंक के माध्यम से नेट में एक पिक्सेल के रंग मूल्य प्राप्त कर सकते हैं MSDN उदाहरण

06/08/2008 को 07:39
का स्रोत उपयोगकर्ता

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