我正试图在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
答案 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-over
和SVG 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)
其他混合模式(乘法,差异,屏幕等)是稍微复杂的公式,但每种模式的概念都是相同的:
如果你仍然对此感兴趣,我一直在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混合模式,我非常感谢他们的帮助!)