2011-11-29 31 views
5

enter image description hereC# Conversión delphi TColor al color (Hex)

Estos números se almacenan en la base de datos. Se originan a partir del código Delphi. Aunque supongo que siguen algún tipo de estándar. He tratado Color.FromArgb(255);

pero sé que es un hecho que la primera es de color rojo (en el lado Delphi), mientras que en ASP.NET se piensa que es azul Color [A=0, R=0, G=0, B=255]

Quiero que estos números en hexadecimal de todos modos. Es decir. # 000000, # FFFF99 etc. etc.

Cualquiera sabe cómo convertir estos enteros (ver imagen de DB) a hexadecimal.

Respuesta

20

Los colores Delphi (TColor) son XXBBGGRR cuando no son de una paleta o un color especial.

Ver this article para más detalles sobre el formato (y otros casos especiales). The article señalado por Christian.K también contiene algunos detalles sobre los casos especiales.

Colores estándar

Convertir en un color estándar que puedes usar algo como:

var color = Color.FromArgb(0xFF, c & 0xFF, (c >> 8) & 0xFF, (c >> 16) & 0xFF); 

Para convertir a hexadecimal:

string ColorToHex(Color color) 
{ 
    return string.Format("#{0:X2}{1:X2}{2:X2}", 
     color.R, color.G, color.B); 
} 

colores del sistema

Para el sistema colores (valores negativos en su base de datos), son simplemente las ventanas consta nts enmascarado por 0x80000000.

Gracias a David Heffernan por la información.

Código de ejemplo

Color DelphiColorToColor(uint delphiColor) 
{ 
    switch((delphiColor >> 24) & 0xFF) 
    { 
     case 0x01: // Indexed 
     case 0xFF: // Error 
      return Color.Transparent; 

     case 0x80: // System 
      return Color.FromKnownColor((KnownColor)(delphiColor & 0xFFFFFF)); 

     default: 
      var r = (int)(delphiColor & 0xFF); 
      var g = (int)((delphiColor >> 8) & 0xFF); 
      var b = (int)((delphiColor >> 16) & 0xFF); 
      return Color.FromArgb(r, g, b); 
    } 
} 

void Main() 
{ 
    unchecked 
    { 
     Console.WriteLine(DelphiColorToColor((uint)(-2147483646))); 
     Console.WriteLine(DelphiColorToColor(
       (uint)KnownColor.ActiveCaption | 0x80000000 
      )); 
     Console.WriteLine(DelphiColorToColor(0x00FF8000)); 
    } 
} 
+6

La mejor manera de convertir un color del sistema a RGB es hacer como el VCL hace. Llame [ 'GetSysColor()'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724371 (v = vs.85).aspx) pasando 'c & 0x000000FF'. En otras palabras, estos no están definidos por VCL, están * sistema * definidos. –

+1

@David, en su comentario proporcionó la respuesta exacta, ¿no lo publica como respuesta? –

+1

@PA. El comentario es solo una pequeña parte de la respuesta. Espero que VirtualBlackFox incorpore la sugerencia en esta respuesta y así poder eliminar la lista bastante larga y tediosa. –

3

Parece que los números son la representación de base 10 de Delphi TColor values.

Parece que Delphi proporciona algunas funciones de ayuda (por ejemplo, GetRValue) para extraer los respectivos valores de lectura, verde y azul. Tienes que escribir algo similar en C# tú mismo.

Tener los valores que puedan ser reunidas en una cadena hexadecimal.

string.Format("#{0:X2}{1:X2}{2:X2}", redComponent, greenComponent, blueComponent); 

simplemente convertir el valor entero a una cadena hexadecimal, acolchada o no, lo más probable es no hacer lo correcto.

ACTUALIZACIÓN como comentarista James L. señala que el orden de los componentes es realmente diferente para/in delphi. Para generar un valor -como TColor la orden debe ser:

string.Format("#{0:X2}{1:X2}{2:X2}", blueComponent, greenComponent, redComponent); 
+1

Creo que su pedido está al revés. El rojo debe ser # 0000FF, el verde debe ser # 00FF00 y el azul debe ser # FF0000. Por lo tanto, su orden de color debe cambiarse a Azul Verde Rojo. –