【问题标题】:Converting ARBG to RGB with alpha blending with a White Background使用带有白色背景的 alpha 混合将 ARBG 转换为 RGB
【发布时间】:2011-06-01 02:28:51
【问题描述】:

我有一个颜色十六进制字符串存储在数据库中,例如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 值进行转换?

【问题讨论】:

  • 那不是要考虑它背后的颜色吗?它总是白色的吗?
  • 背景颜色为白色。

标签: c# rgb alphablending argb


【解决方案1】:

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)

【讨论】:

  • 我不想保留 alpha 分量,我确信当您将给定的 alpha 值应用于颜色时,有一种方法可以确定生成的颜色是什么......类似于:RGB + Alpha = 新 RGB
  • 只有考虑到背景颜色才有可能
  • 嗨- 谢谢我试过这个公式,但它似乎没有正确转换......所以 Alpha=120,R=220,G=230,B=176 的颜色应该转换为 R =239,G=243,B=218 或 #EFF3DA 但使用建议的公式有点偏离。
  • 你的“应该转换成”的数字是从哪里来的?这就是我在游戏中编码的方式,看起来不错
  • 在 Photoshop 或任何其他类似程序中,添加颜色=220,G=230,B=176..然后将 alpha=120 应用于该颜色。在任何图形上使用该颜色,然后在该颜色上使用颜色选择器。颜色选择器将向您显示“有效”的 rgb 颜色。希望这是有道理的。
【解决方案2】:

建议中的任何一个都不适合我,但后来使用了 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));

【讨论】:

【解决方案3】:

因此,您真正要做的是将白色背景与半透明前景色结合起来,并计算生成的显示颜色。这似乎是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);
}

【讨论】:

  • 我已经更新了代码,以便这次可以实际编译 :-) 变量分别是输出颜色的红色、绿色和蓝色值。最后一行中硬编码的“1”指定了一个不透明的最终输出。
  • hmm...谢谢..但公式似乎给出了 R_c、G_c、B_c 的负值...我用 {Color [A=120, R=220, G= 230, B=176]}
  • 抱歉,假设 A 表示为 0 到 1 之间的小数。试试 (255-A.A)/100。我稍后会编辑。
  • hmm..对不起,它现在似乎全是黑色。似乎没有工作。
猜你喜欢
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 2023-03-24
  • 2019-12-13
  • 1970-01-01
  • 2011-11-19
  • 2013-09-17
相关资源
最近更新 更多