C# 使用带有白色背景的alpha混合将ARBG转换为RGB

C# 使用带有白色背景的alpha混合将ARBG转换为RGB,c#,rgb,alphablending,argb,C#,Rgb,Alphablending,Argb,我在数据库中存储了一个彩色十六进制字符串,如0x78dce6b0;我可以使用以下方法将其转换为ARGB颜色: string colorString=0x78dce6b0; int hexColor = Convert.ToInt32(colorString ?? "0", 16); Color colorTL = Color.FromArgb(hexColor); 现在我想将其转换为在HTML页面中使用,因此需要将其转换为HTML值,如#cc3388。如果我使用ColorTranslator.

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

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

现在我想将其转换为在HTML页面中使用,因此需要将其转换为HTML值,如
#cc3388
。如果我使用
ColorTranslator.ToHtml(colorTL)
直接转换,我将丢失alpha混合值。假设背景始终为白色,如何将其转换为alpha值?

HTML颜色没有
alpha
组件

不幸的是,要将
ARGB
转换为HTML
RGB
而不丢失
Alpha
组件是不可能的

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

  • 将每个十六进制分量(A、R、G、B)转换为0到255之间的值,其中FF的值等于255,00等于0
  • 我们将这些0-255个值命名为A、R、G、B
  • 我们假设Alpha值255表示“完全透明”,Alpha值0表示“完全不透明”
  • 新规则=新规则((255-R)*(A/255.0)+R)
  • 新的(255-G)(A/255.0)+G
  • 新的B=CInt((255-G)*(A/255.0)+B)
  • 最后一个HTML颜色字符串是:“#”&cstr(New#R)&cstr(New#G)&cstr(New#B)

  • 因此,您真正要做的是将白色背景与半透明前景色相结合,并计算得到的显示颜色。这似乎是一个重复的问题,在哪里张贴了合适的答案。要将其应用于您的情况,它将类似于以下内容(注意,我尚未测试此代码):


    这些建议对我来说都不管用,但后来用了 要得出这个结论:

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

    这不需要考虑到它背后的颜色吗?它总是白色的吗?背景色将是白色的。我不想保留alpha分量,我确信当你将给定的alpha值应用于一种颜色时,有一种方法可以计算出结果的颜色。例如:RGB+alpha=新RGB这只有在考虑到背景色的情况下才可能Hi-谢谢我尝试了这个公式,然而,它似乎无法正确转换…因此,Alpha=120、R=220、G=230、B=176的颜色应转换为R=239、G=243、B=218或#EFF3DA,但使用建议的公式有点不正确。您的“应转换为”数字来自哪里?这是我在游戏中编写的代码,在photoshop或其他类似程序中看起来很好,添加一个颜色=220,G=230,B=176..然后对该颜色应用alpha=120。在任何图形上使用该颜色,然后在该颜色上使用颜色选择器。颜色选择器将显示“有效”rgb颜色。希望这是有意义的。我已经更新了代码,以便它这次能够编译:-)变量分别是输出颜色的红色、绿色和蓝色值。最后一行中硬编码的“1”指定了一个不透明的最终输出。嗯……谢谢……但是公式似乎给出了R_c,G_c,B_c的负值……我用{Color[a=120,R=220,G=230,B=176]}进行了尝试。对不起,假设a表示为0到1之间的小数。试试(每年255英镑)/100英镑。我马上就要编辑了。嗯……很抱歉,它现在看起来全是黑色的。似乎不起作用。这很有效,谢谢!提出了一种扩展方法:
    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));