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

时间:2011-06-01 02:28:52

标签: c# rgb alphablending argb

我有一个存储在数据库中的颜色十六进制字符串,如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值来转换它,假设背景总是白色?

3 个答案:

答案 0 :(得分:3)

HTML颜色没有Alpha组件。

很遗憾,在不丢失ARGB组件的情况下,无法将RGB转换为HTML Alpha

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

  • 将每个十六进制组件(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)

答案 1 :(得分: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));

答案 2 :(得分:-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);
}