2011-06-01 108 views
1

我有一個存儲在數據庫中的顏色十六進制字符串,如0x78dce6b0;我可以將此轉換爲使用ARGB顏色:將ARBG轉換爲RGB,並使用白色背景進行alpha混合

string colorString=0x78dce6b0; 
int hexColor = Convert.ToInt32(colorString ?? "0", 16); 
Color colorTL = Color.FromArgb(hexColor); 

現在我想這個轉換在HTML頁面中使用,所以我需要轉換成像#cc3388的HTML值。如果我直接使用ColorTranslator.ToHtml(colorTL)進行轉換,則會丟失alpha混合值。假設背景總是白色,我怎樣通過考慮阿爾法值來轉換它?

+4

會不會考慮到它背後的顏色?它總是白色的? – 2011-06-01 02:31:42

+0

背景顏色將爲白色。 – ace 2011-06-01 16:51:48

回答

2

HTML顏色沒有Alpha組件。

很不幸,我們無法將ARGB轉換爲HTML RGB而不會丟失Alpha組件。

如果你想用白色,根據你的阿爾法值的混合顏色...

  • 轉換每個十六進制組分(A,R,G,B)轉換成從0到255的值,其中FF的值等於255,00等於0.
  • 我們將這些0-255的值命名爲A,R,G,B
  • 我們將假設Alpha值255意味着「完全透明「並且α值爲0意味着」完全不透明「
  • New_R = CInt((255-R)*(A/255.0)+ R)
  • New_G = CINT((255 - G)*(A/255.0)+ G)
  • New_B = CINT((255 - G)*(A/255.0)+ B)
  • 你最後的HTML顏色字符串將是:「#」 & CSTR(New_R)& CSTR(New_G)& CSTR(New_B)
+0

我不想堅持的alpha組件,我敢肯定有一種方法來弄清楚,當你給一個給定的alpha值的顏色,結果顏色是什麼...如下所示:RGB + Alpha = new RGB – ace 2011-06-01 17:46:20

+0

這就是隻有在考慮背景顏色的情況下才可能 – 2011-06-01 17:51:23

+0

背景總是白色 – ace 2011-06-01 19:30:20

-1

所以你真正做的是結合了白色背景半透明前景色並計算得到的顯示顏色。這似乎是Calculate resulting RGB from 2 colors, one is transparent的重複問題,其中發佈了合適的答案。將它應用到你的情況,這將是類似如下(注意,我還沒有測試此代碼):

public static Color FromTransparentWithWhiteBG(Color A) 
{ 
    // Assuming Alpha is a value between 0 and 254... 
    var aFactor = (A.A/254); 
    var bgAFactor = (1-(A.A/254)); 
    var background = Color.White; 
    var R_c = (Int32)(Math.Ceiling((Double)A.R * aFactor) + Math.Ceiling ((Double)background.R * (1 - bgAFactor))); 
    var G_c = (Int32)(Math.Ceiling((Double)A.G * aFactor) + Math.Ceiling ((Double)background.G * (1 - bgAFactor))); 
    var B_c = (Int32)(Math.Ceiling((Double)A.B * aFactor) + Math.Ceiling ((Double)background.B * (1 - bgAFactor))); 
    return Color.FromArgb(1, R_c, G_c, B_c); 
} 
+0

什麼是R_c變量? – ace 2011-06-01 19:33:39

+0

我已經更新了代碼,以便它實際編譯這次:-)這些變量分別是輸出顏色的紅色,綠色和藍色值。最後一行中的硬編碼「1」指定了不透明的最終輸出。 – 2011-06-01 19:41:02

+0

嗯...謝謝..但公式似乎給R_c,G_c,B_c的負值...我試着{顏色[A = 120,R = 220,G = 230,B = 176]} – ace 2011-06-01 19:59:21

1

無的建議爲我工作,但後來使用 http://en.wikipedia.org/wiki/Alpha_compositing 上來與此:

var useColor = Color.FromArgb(
       (int)((theStructureColor.R) * (theStructureColor.A/255.0) + 255 - theStructureColor.A), 
       (int)((theStructureColor.G) * (theStructureColor.A/255.0) + 255 - theStructureColor.A), 
       (int)((theStructureColor.B) * (theStructureColor.A/255.0) + 255 - theStructureColor.A)); 
+0

這個作品,謝謝!做了一個擴展方法:https://pastebin.com/90SCi3Jk – salle55 2017-05-11 12:32:18