2010-04-22 9 views
9

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 membri A, R, G, B, ma nessun metodo per restituire un singolo valore.
Come posso implementare ToArgb()? In System.Drawing.Color, ToArgb() è costituito da un metodo ha FromArgb (byte A, byte R, G byte, byte B)Implementazione di ToArgb()

return (int) this.Value; 

System.Windows.Media.Color. Come faccio a scomporre l'Int restituito da ToArgb() da utilizzare con FromArgb()?

Grazie per tutti i puntatori ...

risposta

30

Breve e veloce. Senza una chiamata di metodo aggiuntiva, 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)); 
+0

Risultati in una OverflowException in VB.NET. 'CByte ((iCol >> 24) And & HFF)' funziona. – mbomb007

5

Suona come si sta chiedendo due domande qui, mi permetta di prendere un altro tentativo. Indipendentemente da ciò, ti consigliamo di esaminare la classe BitConverter.

Da this page:

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

Così, per implementare ToArgb(), si potrebbe scrivere un extension method 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 a "scomporre l'Int restituito da ToArgb() da usare con FromArgb()", è 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.

+0

Molto utile, grazie. – Number8

+0

Penso che hai ottenuto gli array all'indietro. 'L'ordinamento dei byte del valore ARGB a 32 bit è AARRGGBB. Si riferisce alle cifre di un uint a 8 cifre esadecimali. In little endian (probabilmente il caso più comune) il tuo codice è sbagliato, il blu viene prima di tutto. – Zarat

+0

@Zarat, sei corretto per i chip compatibili Intel. BitConverter non modifica l'endianità dell'ordine dei byte, quindi lo stesso codice può avere i byte ordinati in modo diverso a seconda dell'ordine endian. –

1

Solo una breve nota:

Recupero della 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 in la risposta contrassegnata. Quindi se hai accesso a. ToArgb(), usa sempre quello!

Il creatore del thread ha dichiarato che non ha accesso ad esso, quindi ovviamente la risposta contrassegnata è ancora corretta, la juse non viene confusa dalle "operazioni rapide" rivendicate in essa.

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 quindi riassemblarli con il bitshifting è come spostarsi in un cerchio.

+1

System.Windows.Media.Color non ha né un metodo ToArgb né memorizza il colore internamente come un int. Sembra che tu non abbia letto la domanda. – Zarat