سؤال

لنفترض أن لدينا لون 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تنفيذ؟

هل كانت مفيدة؟

المحلول

تسمى مزج ألفا.

في الكود الكاذب، بافتراض أن لون الخلفية (المزج) يحتوي دائمًا على 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، يصبح الجبر أكثر تعقيدًا.لقد قمت بذلك من قبل وهو تمرين ممتع متروك للقارئ (إذا كنت تريد حقًا أن تعرف، اطرح سؤالاً آخر :).

بمعنى آخر، ما هو اللون C الذي يتم مزجه في بعض الخلفية بنفس طريقة مزج A، ثم مزج B.هذا يشبه حساب A+B (وهو ليس مثل B+A).

نصائح أخرى

أعرف أن هذا موضوع قديم، ولكن أريد أن أضيف هذا:

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

إذا لم تكن بحاجة إلى معرفة هذا العرض المسبق، فيمكنك دائمًا استخدام طريقة win32 الخاصة بـ getpixel، على ما أعتقد.

ملحوظة:الكتابة على iPhone في وسط ولاية ميسوري دون الوصول إلى شبكة الإنترنت.سيتم البحث عن مثال حقيقي لـ win32 ومعرفة ما إذا كان هناك ما يعادل .net.

في حال كان أي شخص يهتم، ولا يريد استخدام الإجابة (الممتازة) المذكورة أعلاه، يمكنك الحصول على قيمة اللون للبيكسل في .Net عبر هذا الرابط مثال MSDN

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top