Conversion ARBG RGB avec mélange alpha

voix
19

Disons que nous avons une couleur ARVB:

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

Lorsque cela est peint sur le dessus d'une couleur existante, les couleurs se mélangent. Alors, quand 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);

Qu'est - ce que ToRGBla mise en œuvre?

Créé 05/08/2008 à 21:12
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
16

Il est appelé alpha blending .

Dans psuedocode, en supposant que la couleur de fond (mélange) présente toujours 255 alpha. suppose également alpha est 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()

Remarque: vous devez probablement être un peu (plus) attention à virgule flottante / math int et les problèmes d'arrondi, selon la langue. intermédiaires en conséquence coulés

Sous la direction d'ajouter:

Si vous ne disposez pas d'une couleur de fond avec un alpha de 255, l'algèbre devient beaucoup plus compliqué. Je l'ai fait avant et il est un exercice amusant laissé au lecteur (si vous avez vraiment besoin de savoir, poser une autre question :).

En d'autres termes, quelle couleur C se fond dans une arrière-plan le même que le mélange A, puis le mélange B. Ceci est un peu comme le calcul A + B (ce qui est le même que B + A).

Créé 05/08/2008 à 21:16
source utilisateur

voix
4

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));
}
Créé 26/06/2013 à 11:52
source utilisateur

voix
2

si vous n'avez pas besoin de savoir ce Prérendu, vous pouvez toujours utiliser la méthode win32 de getPixel, je crois.

Remarque: taper sur iPhone au milieu du Missouri sans accès iNet. Est-ce que regarder exemple réel win32 et voir s'il y a un équivalent .net.

Dans le cas où quelqu'un se soucie, et ne veut pas utiliser le (excellent) réponse affiché ci - dessus, vous pouvez obtenir la valeur de couleur d'un pixel en .Net via ce lien par exemple MSDN

Créé 06/08/2008 à 07:39
source utilisateur

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