Domanda

System.Drawing.Color ha un metodo ToArgb () per restituire la rappresentazione Int del colore.
In Silverlight, penso che dobbiamo usare System.Windows.Media.Color. Ha A, R, G, B membri, ma nessun metodo per restituire un singolo valore.
Come posso implementare ToArgb ()? In System.Drawing.Color, ToArgb () è costituito da

return (int) this.Value;  

System.Windows.Media.Color ha un metodo FromArgb (byte A, byte R, G byte, byte B). Come faccio a scomporre l'Int restituito da ToArgb () per l'uso con FromArgb ()?

Grazie per tutti i puntatori ...

È stato utile?

Soluzione

breve e veloce. Senza una chiamata di metodo in più, ma con operazioni veloci.

// 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));

Altri suggerimenti

Sembra che tu stai chiedendo due domande qui, mi permetta di prendere un altro tentativo. Indipendentemente da ciò, ti consigliamo di considerare di usare il BitConverter classe.

questa pagina :

  

Il byte-ordinamento del ARGB a 32 bit   valore è aarrggbb.

Quindi, per implementare ToArgb(), si potrebbe scrivere un href="http://msdn.microsoft.com/en-us/library/bb383977.aspx" rel="nofollow noreferrer"> metodo di estensione che fa qualcosa di simile:

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);
}

E per "scomporre l'Int restituito da ToArgb () per l'uso con FromArgb ()", si potrebbe fare questo:

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);

Spero che questo aiuti.

Solo una breve nota:

Recuperare la rappresentazione intera di un oggetto "Colore" sembra essere 4 volte più veloce per me quando si chiama color.ToArgb () direttamente invece di utilizzare i Bitshift-operazioni nella risposta segnata. Quindi, se si ha accesso a .ToArgb (), utilizzare sempre quella!

Il creatore filo dichiarato che non ha accesso ad esso, così naturalmente la risposta contrassegnato è ancora corretta, juse non farsi confondere dalle rivendicati "operazioni veloci" in esso.

Basta tenere a mente:. Il colore dell'istanza colore è internamente già memorizzato come valore int, così ToArgb () è solo tornando esso, mentre l'accesso ogni singolo byte di esso per (da proprietà .A, .r,. G., .B) e poi ri-Ensemble bitshifting è un pò muovendosi in un cerchio.

scroll top