2011-11-29 17 views
5

enter image description hereC# Conversione Delphi TColor al colore (Hex)

Questi numeri sono memorizzati nel database. Originano dal codice di Delfi. Anche se presumo seguano una sorta di standard. Ho provato Color.FromArgb(255);

ma so per un fatto che il primo è ROSSO (nel lato Delphi), dove come in ASP.NET pensa il suo blu Color [A=0, R=0, G=0, B=255]

Voglio che questi numeri in esadecimale comunque. Cioè # 000000, # FFFF99 etc etc

Qualcuno sa come conver questi numeri interi (vedi DB Picture) a esadecimale.

risposta

20

colori Delphi (TColor) sono XXBBGGRR quando non da una tavolozza o un colore speciale.

Vedere this article per ulteriori dettagli sul formato (e altri casi speciali). The article indicato da Christian.K contiene anche alcuni dettagli sui casi speciali.

Colori standard

da convertire in un colore standard si dovrebbe usare qualcosa di simile a:

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

Per convertire in esadecimale,:

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

Colori di sistema

Per il sistema colori (valori negativi nel tuo database), sono semplicemente i Windows Consta nts mascherati da 0x80000000.

Grazie a David Heffernan per le informazioni.

codice di esempio

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

Il modo migliore per convertire un colore di sistema RGB è quello di fare come la VCL fa. Chiama ['GetSysColor()'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724371 (v = vs.85).aspx) passando 'c e 0x000000FF'. In altre parole, questi non sono definiti VCL, sono * sistemi * definiti. –

+1

@David, nel tuo commento hai fornito la risposta esatta, non la postesti come risposta? –

+1

@PA. Il commento è solo una piccola parte della risposta. Spero che VirtualBlackFox includa il suggerimento in questa risposta e sia quindi in grado di rimuovere la lista piuttosto lunga e noiosa. –

3

Sembra che i numeri sono la rappresentazione in base 10 di Delphi TColor values.

Delphi sembra fornire alcune funzioni di supporto (ad esempio GetRValue) per estrarre i rispettivi valori di lettura, verde e blu. Devi scrivere qualcosa di simile in C# te stesso.

Avendo i valori è possibile assemblarli in una stringa esadecimale.

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

semplicemente convertire il valore intero a un esagono-string, imbottito o no, è molto probabile che non fare la cosa giusta.

UPDATE come fa notare il commentatore James L., l'ordine dei componenti è in realtà diverso per/in delphi. Per generare un valore -come TColor l'ordine deve essere:

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

Penso che il tuo ordine sia a ritroso. Il rosso dovrebbe essere # 0000FF, il verde dovrebbe essere # 00FF00 e il blu dovrebbe essere # FF0000. Quindi il tuo ordine dei colori dovrebbe essere cambiato in Blu Verde Rosso. –