Exécution ToArgb ()
-
01-10-2019 - |
Question
System.Drawing.Color a une méthode ToArgb () pour renvoyer la représentation de la couleur Int.
Dans Silverlight, je pense que nous devons utiliser System.Windows.Media.Color. Il a A, R, G, B membres, mais pas de méthode pour retourner une valeur unique.
Comment puis-je mettre en œuvre ToArgb ()? Dans System.Drawing.Color, ToArgb () consiste en
return (int) this.Value;
System.Windows.Media.Color a une méthode FromArgb (octet A, R octet, l'octet G, octet B). Comment puis-je décomposer le Int retourné par ToArgb () à utiliser avec FromArgb ()?
Merci pour tous les pointeurs ...
La solution
court et rapide. Sans un 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));
Autres conseils
On dirait que vous vous posez deux questions ici, permettez-moi de prendre un autre coup à lui. Peu importe, vous aurez envie de regarder dans la BitConverter
classe.
De cette page :
L'ordre des octets du ARVB 32 bits La valeur est AARRGGBB.
Alors, pour mettre en œuvre ToArgb()
, vous pouvez écrire un méthode d'extension 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 pouvez 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);
Hope this helps.
Juste une petite 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 dans la réponse marquée. Donc, si vous avez accès à .ToArgb (), utilisez toujours!
Le créateur de fil a déclaré qu'il n'a pas accès, donc bien sûr la réponse marquée est toujours correcte, Juse ne pas confondre les « opérations revendiquées rapide » en elle.
Il suffit de garder à l'esprit. La couleur de l'instance couleur est interne déjà enregistrée en tant que valeur int, alors ToArgb () est juste de retour, tout en accédant à chaque octet unique à (par des propriétés .A .R,. G., .B), puis les ré-ensemble se déplace par un peu opérateurs de bits dans un cercle.