2010-04-22 9 views
9

System.Drawing.Color tiene un método ToArgb() para devolver la representación Int del color.
En Silverlight, creo que tenemos que usar System.Windows.Media.Color. Tiene miembros A, R, G, B, pero no hay método para devolver un solo valor.
¿Cómo puedo implementar ToArgb()? En System.Drawing.Color, ToArgb() consta deImplementando ToArgb()

return (int) this.Value; 

System.Windows.Media.Color tiene un método FromArgb (byte A, byte R, byte G, byte B). ¿Cómo descompongo el Int devuelto por ToArgb() para usar con FromArgb()?

Gracias por cualquier punteros ...

Respuesta

30

Corto y rápido. Sin una llamada de método adicional, pero con operaciones rápidas.

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

Resultados en una excepción OverflowException en VB.NET. 'CByte ((iCol >> 24) And & HFF)' funciona. – mbomb007

5

parece que estás haciendo dos preguntas aquí, vamos a poner otro puñalada en ella. De todos modos, querrás estudiar usando la clase BitConverter.

De this page:

El byte-ordenamiento de la ARGB valor de 32 bits es aarrggbb.

Así, para implementar ToArgb(), se podría escribir un extension method que hace algo como esto:

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

Y para "descomponer el Int devuelto por ToArgb() para usar con FromArgb()", se podría hacer esto:

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

Espero que esto ayude.

+0

Muy útil, gracias. – Number8

+0

Creo que tienes las matrices al revés. 'El orden de bytes del valor de ARGB de 32 bits es AARRGGBB. Se refiere a los dígitos de un valor de 8 dígitos hexadecimales. En little endian (probablemente el caso más común) su código es incorrecto, el azul es lo primero. – Zarat

+0

@ Zarat, tiene razón para los chips compatibles con Intel. BitConverter no cambia el endian-ness de su orden de bytes, por lo que el mismo código puede tener los bytes ordenados de manera diferente según el orden de endian. –

1

Sólo una breve nota:

Recuperando la representación entera de un objeto "color" parece ser 4 veces más rápido para mí al llamar color.ToArgb() directamente en lugar de utilizar los BitShift-operaciones en la respuesta marcada Entonces, si tiene acceso a .ToArgb(), siempre use eso.

El creador de subprocesos indicó que no tiene acceso a él, por lo que, por supuesto, la respuesta marcada sigue siendo correcta, juse no se confunda por las "operaciones rápidas" reclamadas en el mismo.

Solo tenga en cuenta: El color de la instancia de Color ya se ha guardado internamente como valor int, por lo que ToArgb() simplemente lo está devolviendo, al acceder a cada byte individual (por propiedades .A, .R. .G., .B) y luego reensamblarlos mediante el cambio de bits se mueve un poco en un círculo.

+1

System.Windows.Media.Color no tiene un método ToArgb ni almacena el color internamente como un int. Parece que no leíste la pregunta. – Zarat