Alpha合成算法(混合模式)

时间:2011-09-15 22:38:57

标签: algorithm math pdf sass alphablending

我正试图在SASS中实现PDF规范中的混合模式。

PDF规格: http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf

第322页是alpha合成部分。

输入值采用RGBA格式,但现在我正在尝试实现alpha组件的混合。我怎么兴奋地去做呢?根据我的收集,我的值应该介于0.0和1.0之间,这已经完成了。但是根据规格,您似乎应该为每个颜色通道进行混合?我是否只是将其平均以回到我的alpha组件的RGBA表单?

任何帮助都是适当的,我不介意阅读博客,书籍等来得到我的答案,因为这纯粹是一种智力锻炼。

提前致谢,

了Emil

1 个答案:

答案 0 :(得分:12)

SVG规范有很多用于各种混合模式的好方程。是的,您必须为每个频道计算两个新的alpha 新颜色。对于标准混合模式,alpha以这种方式计算:

alpha_final = alpha_bg + alpha_fg - alpha_bg * alpha_fg

注意:我看到你认为alpha介于0和1之间,这很好。 CSS中的Alpha值始终定义为从0到1的浮点值;坚持这个惯例是好的,因为它使计算变得非常容易。

它有助于通过其alpha来“预乘”每个颜色通道;这些对于解释和使用通常的公式更有帮助:

colour_bg_a = colour_bg * alpha_bg

换句话说:

red_bg_a = red_bg * alpha_bg
green_bg_a = green_bg * alpha_bg
blue_bg_a = blue_bg * alpha_bg

然后,对于普通的alpha合成(如覆盖描图纸张,在Porter and Duff's original paper中也称为src-overSVG alpha compositing spec),您可以获取每个通道并进行计算:

colour_final_a = colour_fg_a + colour_bg_a * (1 - alpha_fg)

最后一步是将每个最终颜色通道值“取消”乘以最终的alpha:

colour_final = colour_final_a / alpha_final

并以某种方式将它放入你的混音中:

rgba(red_final, green_final, blue_final, alpha_final)

其他混合模式(乘法,差异,屏幕等)是稍微复杂的公式,但每种模式的概念都是相同的:

  1. 分离前景色和背景色的R,G,B和A值
  2. 使用上面的公式
  3. 计算新的最终颜色的alpha值
  4. 将所有R,G和B值乘以其alpha值
  5. 计算新的最终R,G和B值(此处插入混合模式公式)
  6. 将最终的R,G和B值乘以最终的alpha
  7. 剪切最终的R,G和B值,使它们在0到255之间(某些模式是必需的,但不是全部)
  8. 将颜色重新组合在一起!
  9. 如果你仍然对此感兴趣,我一直在Stylus做这件事。您可以在此处查看我的进度:https://github.com/pdaoust/stylus-helpers/blob/master/blend.styl您可以将它作为自己的Sass mixin的起点。

    我做的第一件事是将所有R,G和B值从0到255的值转换为0 - 1浮点值,以便进行计算。 Dunno,如果这是必要的,它确实需要将它们转换回0 - 255值。对我来说感觉很对,波特和达芙在他们的原始论文中以0 - 1的浮动值工作。

    (我遇到了一些合成模式的问题,它们产生了与SVG规格图片的预期结果完全不同的结果。我怀疑规范给出了错误的方程式。如果有人知道Porter / Duff混合模式,我非常感谢他们的帮助!)