使用Alpha混合白色背景将ARBG转换为RGB

我有一个颜色hex字符串存储在数据库中,如0x78dce6b0 ; 我可以使用以下方法将其转换为ARGB颜色:

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

现在我想将其转换为在HTML页面中使用,因此我需要转换为像#cc3388这样的HTML值。 如果我使用ColorTranslator.ToHtml(colorTL)直接转换,我会丢失alpha混合值。 假设背景总是白色,我如何通过考虑alpha值来转换它?

HTML颜色没有Alpha组件。

不幸的是,在不丢失Alpha组件的情况下将ARGB转换为HTML RGB是不可能的。

如果你想根据你的alpha值将你的颜色与白色混合……

  • 将每个Hex组件(A,R,G,B)转换为0到255之间的值,其中FF的值等于255,00等于0。
  • 我们将这些0-255的值命名为A,R,G,B
  • 我们假设Alpha值为255表示“完全透明”,Alpha值为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)

所有提议都没有为我工作,但后来使用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)); 

所以你真正做的是将白色背景与半透明前景色组合,并计算得到的显示颜色。 这似乎是一个重复的问题, 从2种颜色计算得到的RGB,一个是透明的 ,其中贴出了合适的答案。 要将它应用到您的情况,它将类似于以下(注意,我还没有测试此代码):

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