c# - Conversion d'ARBG en RVB avec fusion alpha

Translate

Disons que nous avons une couleur ARVB:

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

Lorsqu'il est peint sur une couleur existante, les couleurs se mélangent. Ainsi, lorsqu'il est mélangé avec du blanc, la couleur résultante estColor.FromARGB(255, 162, 133, 255);

La solution devrait fonctionner comme ceci:

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

Quel estToRGBla mise en œuvre?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

C'est appelémélange alpha.

Dans psuedocode, en supposant que la couleur d'arrière-plan (mélange) a toujours 255 alpha. Suppose également que l'alpha est de 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()

note: vous devez probablement être un peu (plus) prudent avec les maths en virgule flottante / int et les problèmes d'arrondi, selon la langue. Cast intermédiaires en conséquence

Modifié pour ajouter:

Si vous n'avez pas de couleur d'arrière-plan avec un alpha de 255, l'algèbre devient beaucoup plus compliquée. Je l'ai déjà fait et c'est un exercice amusant laissé au lecteur (si vous avez vraiment besoin de savoir, posez une autre question :).

En d'autres termes, la couleur C se fond dans un arrière-plan de la même manière que le mélange A, puis le mélange B. C'est un peu comme calculer A + B (ce qui n'est pas la même chose que B + A).

La source
Translate

Je sais que c'est un vieux fil, mais je veux ajouter ceci:

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));
}
La source
Translate

si vous n'avez pas besoin de connaître ce pré-rendu, vous pouvez toujours utiliser la méthode win32 de getpixel, je crois.

Remarque: saisie sur iPhone au milieu du Missouri sans accès inet. Rechercher un exemple réel de win32 et voir s'il existe un équivalent .net.

Au cas où quelqu'un se soucierait et ne voudrait pas utiliser la (excellente) réponse publiée ci-dessus, vous pouvez obtenir la valeur de couleur d'un pixel dans .Net via ce lienExemple MSDN

La source