【问题标题】:What code would I use to get the value of a color when an alpha at about half transparency is applied? [duplicate]当应用大约一半透明度的 alpha 时,我将使用什么代码来获取颜色的值? [复制]
【发布时间】:2012-12-17 07:02:45
【问题描述】:

可能重复:
What code would I use to get the hex value of a color when an alpha at about half transparency is applied?

如果我有一个可视元素(可以是文本或带有颜色填充的 div,没关系)并且颜色设置为黑色,0x000000,并且它的 alpha 设置为 .4.5 并且背景是纯白色0xFFFFFF,结果将是灰色。我们可以在 Photoshop 中进行测试。

我想知道我将使用什么代码来获得该结果?

我正在寻找诸如方程式之类的东西:

newColor = foregroundColor * alpha * backgroundColor

或者类似 JavaScript、ActionScript 或 VBScript 的东西:

var color:uint = (0x888888 * .5) * 0x000000;

解决这个问题的部分困难在于对十六进制以及它与颜色的关系缺乏充分的理解,无法自行解决。

更新
根据下面的答案,我想出了这个:

// set values
var topColorValue:uint = 0x000000;
var topColorAlphaValue:Number = .5;
var bottomColorValue:uint = 0xFFFFFF;

// get RGB
var redMix:int = ((topColorValue >> 16) & 0xFF);
var greenMix:int = ((topColorValue >> 8) & 0xFF);
var blueMix:int = (topColorValue & 0xFF);

// apply alpha to top color
if (alphaValue<1) {
    var colorPlusAlpha:uint = combineRGB((redMix * (1-alphaValue)), (greenMix*(1-alphaValue)), (blueMix * (1-alphaValue)));
}
else {
    colorPlusAlpha = topColorValue;
}

redMix = ((bottomColorValue >> 16) & 0xFF);
greenMix = ((bottomColorValue >> 8) & 0xFF);
blueMix = (bottomColorValue & 0xFF);

var secondColorPlusAlpha:uint = combineRGB((redMix * (alphaValue)), (greenMix*(alphaValue)), (blueMix * (alphaValue)));

var firstColorPlusSecondColor:uint = colorPlusAlpha + secondColorPlusAlpha;

上述解决方案的问题是它偏离了1。如果顶部颜色为0x999999并且它的alpha为.5并且底部颜色为0xFFFFFF 那么结果是0xCBCBCB。在 Photoshop 中获取该像素或使用滴管时,该值为 0xCCCCCC

【问题讨论】:

  • 重新发布您的问题以忽略接近投票是不合适的。如果您的问题足够切题,则将重新打开另一个问题。
  • 另一个问题被关闭了,因为最初的读者认为它与编程无关。他们没有要求澄清,而是决定关闭它。我添加了新信息。
  • 我认为您正在寻找color composition formulas。它们将取决于您想要的组合类型。我不知道制作一个实现相应公式的 JavaScript 函数是否对您有用。
  • 根据链接,我认为应该是 alpha blending。

标签: javascript actionscript-3 colors hex


【解决方案1】:

IIU Alpha 通道的功能正确,它给出了之前颜色和现在添加的颜色之间的混合分数。这意味着:

colorVisible=colorNew*(1-alpha)+colorOld*alpha

粗略的健全性检查:

  • alpha=0%colorVisible=colorNew 听起来不错
  • alpha=100%=1 给了colorVisible=colorOld 这听起来也不错

【讨论】:

  • 我要补充一点,它只适用于灰色或纯蓝色和黑色。
  • 我正在做一些测试,看起来也是这样。我认为它可能需要提取 r、g 和 b 值并将它们乘以 alpha。尚未确定。试试这个,var finalVisibleColor:uint = topColorValue * (1-alphaValue) + bottomColorValue * alphaValue;
  • 这当然意味着每个频道(R,G,B)!
  • 根据您的代码,我想我找到了一些可行的方法。它已经关闭了 1,所以也许你可以看到我错过了什么。在主帖中发布此信息。
  • 这在我看来有点像四舍五入:99h=153d, 153*0.5=76.5, FFh=255d, 255*0.5=127.5, 127.5+76.5=204=**CCh**。我怀疑 int 乘以 float 0.5 会得到一个向下舍入的值。使用 float 混合值重试并尽可能晚地舍入。
猜你喜欢
  • 2012-12-17
  • 2011-12-12
  • 2020-08-08
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多