将ARBG转换为RGB,并使用白色背景进行alpha混合



我在数据库中存储了一个颜色十六进制字符串,如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 Colors没有Alpha组件。

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

如果你想根据你的阿尔法值将你的颜色与白色混合

  • 将每个十六进制分量(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)
  • 新_B=CInt((255-G)*(A/255.0)+B)
  • 您的最终HTML颜色字符串将是:"#"&cstr(New_R)&cstr(New_G)&cstr(新_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));

因此,您真正要做的是将白色背景与半透明前景色相结合,并计算得到的显示颜色。这似乎是一个从两种颜色计算RGB结果的重复问题,其中一种是透明的,在那里发布了合适的答案。要将其应用于您的情况,它将类似于以下内容(注意,我还没有测试过此代码):

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);
}

相关内容

  • 没有找到相关文章