Μετατρέποντας ARBG να RGB με άλφα ανάμειξης

ψήφοι
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εφαρμογή «s;

Δημοσιεύθηκε 05/08/2008 στις 21:12
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
16

Αυτό λέγεται alpha blending .

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

Σημείωση: θα πρέπει πιθανώς να είναι λίγο (περισσότερα) προσεκτικοί σχετικά με floating-point / int τα μαθηματικά και τα θέματα στρογγυλοποίησης, ανάλογα με τη γλώσσα. Cast ενδιάμεσα αναλόγως

Επιμέλεια να προσθέσει:

Αν δεν έχετε ένα χρώμα φόντου με μία άλφα του 255, η άλγεβρα παίρνει πολύ περισσότερο περίπλοκη. Το έχω κάνει στο παρελθόν και είναι μια άσκηση διασκέδαση αριστερά για τον αναγνώστη (αν πραγματικά χρειάζεται να γνωρίζετε, ρωτήστε άλλη ερώτηση :).

Με άλλα λόγια, ποια C χρώμα ταιριάζει σε κάποιο υπόβαθρο η ίδια όπως ανάμειξη Α, στη συνέχεια, ανάμιξη Β Αυτό είναι είδος σαν υπολογισμού Α + Β (η οποία δεν είναι το ίδιο με το Β + Α).

Απαντήθηκε 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

αν δεν χρειάζεται να το γνωρίζουν αυτό πριν καθιστούν, μπορείτε πάντα να χρησιμοποιήσετε τη μέθοδο Win32 της getpixel, πιστεύω.

Σημείωση: πληκτρολογώντας στο iPhone στη μέση του Μιζούρι που δεν έχουν πρόσβαση inet. Θα αναζητήσετε σε πραγματικό win32 παράδειγμα και να δούμε αν υπάρχει ένα ισοδύναμο .net.

Σε περίπτωση που κάποιος ενδιαφέρεται και δεν θέλετε να χρησιμοποιήσετε το (εξαιρετικό) απάντηση δημοσιεύτηκε παραπάνω, μπορείτε να πάρετε την τιμή χρώματος ενός pixel σε .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