1. 程式人生 > >兩個半透明顏色色的疊加計算方法

兩個半透明顏色色的疊加計算方法

講 Alpha 混合的文章太多了,我並非要說有什麼新的更好的演算法,而是這些 Alpha 混合的文章都是基於一種特定的現實應用:在背景色上疊加一個半透明色。而 OpenPainter 的需求更具一般性:混合兩個半透明顏色。也就是說,原始色也是有透明度的。

為此我首先用 PS 做了不少試驗,試圖推匯出 Alpha 混合的公式。其實,一些簡單的實驗外加一些邏輯推理,成功了找到了 Alpha 混合的方法。這裡為了計算上的方便,全部顏色分量值的取值範圍都是 0 ~ 1。

首先是透明度值的計算。顏色在本質上是光的產物,假設把透明度理解為玻璃的透光性,則一切就變得很easy。比如一個 alpha = 0.2 的顏色,就能夠將其想像為透光率為 80% 的彩色玻璃。我們透過這塊玻璃看去,因為 80% 的光都透過了,因此留下來的顏色僅僅剩 20%,即所謂 0.2 的 alpha。如今我們來做一個混合:將 alpha 為 0.2 和 0.6 的顏色進行疊加。這時,我們有了兩塊玻璃,一塊透光率為 80%,還有一塊為 40%。一道光束穿過,經過 80% 透光率的玻璃時,光線強度剩下 80%,再經過 40% 透光率的玻璃時,光線進一步被削弱,僅僅剩下 80% * 40% = 32%。這意味著有 32% 的透明性,即 alpha = 0.68。

總結上面的演算法,我們能夠得出:

alpha

下一步,是依據已有的透明度來計算每一個通道的顏色分量。這其有用數學推導的方法更easy一些。我們已經知道,在背景色上怎樣疊加半透明色,其 RGB 顏色分量的計算方法為:

solid_and_alpha

那麼,我們能夠通過在背景色上疊加兩個半透明顏色的不同方法來進行公式推導。第一種疊加方式:先在背景色上疊上第一個半透明顏色,再在疊好的結果上疊上第二個半透明顏色;另外一種方式則是先將兩個半透明顏色疊好,再與背景色混合。即:

two_methods

這兩種混合方式的結果應當是全然一致的,則有

image 

整理,得

image

這即是 RGB 模式下的 Alpha 混合公式。對於 CMYK 等其它模式,也能夠用類似的方式推導。

參考:https://www.cnblogs.com/mfryf/p/3401503.html?_t_t_t=0.581313765142113