2009-08-25 10 views
8

J'ai une valeur ARGB stockée en tant que type int. Il a été stocké en appelant ToArgb.diviser ARGB en valeurs d'octet

Je veux maintenant les valeurs d'octet des différents canaux de couleur à partir de la valeur int.

par exemple

int mycolor = -16744448; 
byte r,g,b,a; 

GetBytesFromColor(mycolor,out a, out r, out g, out b); 

Comment voulez-vous mettre en œuvre GetBytesFromColor?

Pour donner le contexte, je passe une valeur de couleur persistante dans DB comme int à une application Silverlight qui a besoin des valeurs d'octets individuels pour construire un objet de couleur.

System.Windows.Media.Color.FromArgb(byte a, byte r, byte g, byte b) 

Répondre

13

Vous êtes après les 4 morceaux successifs de 8 bits d'un entier de 32 bits; si une combinaison de masquage et de décalage:

b = (byte)(myColor & 0xFF); 
g = (byte)((myColor >> 8) & 0xFF); 
r = (byte)((myColor >> 16) & 0xFF); 
a = (byte)((myColor >> 24) & 0xFF); 
+0

Comment ce processus inversé? – nebkat

+0

'mycolor = (a << 24) + (r << 16) + (g << 8) + b;' –

2
public void GetBytesFromColor(int color, out a, out r, out g, out b) 
{ 
    Color c = Color.FromArgb(color); 
    a = c.A; 
    r = c.R; 
    g = c.G; 
    b = c.B; 
} 
+1

-1. Silverlight n'a pas cette surcharge de FromArgb. – AnthonyWJones