2011-11-29 125 views
5

enter image description hereC#將delphi TColor轉換爲彩色(Hex)

這些數字存儲在數據庫中。他們起源於Delphi代碼。雖然我認爲他們遵循某種標準。我曾嘗試Color.FromArgb(255);

但我知道一個事實,首先是紅色(在Delphi側),其中在ASP.NET它認爲它的藍色Color [A=0, R=0, G=0, B=255]

我想這些數字爲十六進制反正。即#000000,#FFFF99等等

任何人都知道如何將這些整數(請參閱DB圖片)轉換爲十六進制。

回答

20

德爾福顏色(TColor)是XXBBGGRR當不是從調色板或特殊顏色。

有關格式(和其他特殊情況)的更多詳細信息,請參閱this article。由Christian.K指出的The article也包含一些關於特例的細節。

標準顏色

要轉換成你應該使用類似標準顏色:

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

要轉換爲十六進制,:

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

系統顏色

對於系統顏色(數據庫中的負值),它們只是窗口consta nts被0x80000000掩蓋。

感謝David Heffernan的信息。

示例代碼

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

到系統的顏色轉換爲RGB,最好的辦法是做像VCL一樣。調用['GetSysColor()'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms724371(v = vs.85)。aspx)傳遞'c&0x000000FF'。換句話說,這些不是VCL定義的,它們是* system *定義的。 –

+1

@David,在你的評論中,你提供了確切的答案,不要將它作爲答案發布嗎? –

+1

@PA。評論只是答案的一小部分。我希望VirtualBlackFox將這個建議融入到這個答案中,因此能夠刪除相當長和煩人的列表。 –

3

它看起來像數是Delphi TColor values基10表示。

德爾福本身似乎提供了一些幫助函數(例如GetRValue)來提取相應的讀取,綠色和藍色值。你必須自己寫一些類似於C#的東西。

具有可以將它們組合爲十六進制字符串的值。

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

只是將整數值轉換爲一個十六進制字符串,不管是否填充,都很可能不會做正確的事情。

更新作爲評論員James L.指出,組件的順序在delphi中實際上是不同的。要生成TColor樣值的順序必須是:

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

我認爲你的訂單是倒退的。紅色應該是#0000FF,綠色應該是#00FF00,藍色應該是#FF0000。所以你的顏色順序應該改成藍綠紅。 –