2010-04-22 15 views
9

System.Drawing.Color possède une méthode ToArgb() pour renvoyer la représentation Int de la couleur.
Dans Silverlight, je pense que nous devons utiliser System.Windows.Media.Color. Il a A, R, G, B membres, mais aucune méthode pour retourner une seule valeur.
Comment puis-je implémenter ToArgb()? Dans le procédé System.Drawing.Color, ToArgb() est constitué d'Implémentation de ToArgb()

return (int) this.Value; 

System.Windows.Media.Color a une FromArgb (octet A, R octet, l'octet G, octet B). Comment décomposer l'Int retourné par ToArgb() pour l'utiliser avec FromArgb()?

Merci pour tous les pointeurs ...

Répondre

30

Court et rapide. Sans appel de méthode supplémentaire, mais avec des opérations rapides.

// To integer 
int iCol = (color.A << 24) | (color.R << 16) | (color.G << 8) | color.B; 

// From integer 
Color color = Color.FromArgb((byte)(iCol >> 24), 
          (byte)(iCol >> 16), 
          (byte)(iCol >> 8), 
          (byte)(iCol)); 
+0

Résultats dans une exception OverflowException dans VB.NET. 'CByte ((iCol >> 24) Et & HFF)' fonctionne. – mbomb007

5

On dirait que vous vous posez deux questions ici, permettez-moi de prendre un autre coup à lui. Peu importe, vous voudrez regarder dans l'utilisation de la classe BitConverter.

De this page:

L'ordre des octets de 32 bits ARGB valeur est AARRGGBB.

Ainsi, pour mettre en œuvre ToArgb(), vous pouvez écrire un extension method qui fait quelque chose comme ceci:

public static int ToArgb(this System.Windows.Media.Color color) 
{ 
    byte[] bytes = new byte[] { color.A, color.R, color.G, color.B }; 
    return BitConverter.ToInt32(bytes, 0); 
} 

Et pour "décomposer le Int retourné par ToArgb() à utiliser avec FromArgb()", vous pourrait faire ceci:

byte[] bytes = BitConverter.GetBytes(myColor.ToArgb()); 
byte aVal = bytes[0]; 
byte rVal = bytes[1]; 
byte gVal = bytes[2]; 
byte bVal = bytes[3]; 

Color myNewColor = Color.FromArgb(aVal, rVal, gVal, bVal); 

Espérons que cela aide.

+0

Très utile, merci. – Number8

+0

Je pense que vous avez les tableaux en arrière. 'L'ordre des octets de la valeur ARGB 32 bits est AARRGGBB.» Se réfère aux chiffres d'un nombre de huit chiffres hexadécimaux. En petit boutiste (probablement le cas le plus commun) votre code est faux, le bleu vient en premier. – Zarat

+0

@Zarat, vous avez raison pour les puces compatibles Intel. BitConverter ne modifie pas l'endian-ness de votre ordre d'octets, donc le même code peut avoir des octets ordonnés différemment en fonction de l'ordre endian. –

1

Juste une courte note:

Récupération de la représentation entière d'un objet « Couleur » semble être 4 fois plus rapide pour moi lorsque vous appelez color.ToArgb() au lieu d'utiliser les opérations de BitShift-en la réponse marquée. Donc, si vous avez accès à .ToArgb(), utilisez toujours ça!

Le créateur de thread a déclaré qu'il n'y avait pas accès, donc bien sûr la réponse marquée est toujours correcte, pour ne pas être dérouté par les "opérations rapides" revendiquées. N'oubliez pas: La couleur de l'occurrence de Color est déjà enregistrée en interne en tant que valeur int, donc ToArgb() ne fait que la renvoyer, tout en accédant à chaque octet de celle-ci (par les propriétés .A, .R., .G., .B), puis les réassembler par bitshifting est un peu en mouvement dans un cercle.

+1

System.Windows.Media.Color n'a pas de méthode ToArgb et ne stocke pas la couleur en interne en tant qu'int. On dirait que vous n'avez pas lu la question. – Zarat