我有一个存储在数据库中的颜色十六进制字符串,如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值来转换它,假设背景总是白色?
答案 0 :(得分:3)
HTML颜色没有Alpha
组件。
很遗憾,在不丢失ARGB
组件的情况下,无法将RGB
转换为HTML Alpha
。
如果你想根据你的alpha值将你的颜色与白色混合......
答案 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);
}