公司的國防役最近看我在寫一些特殊的程式他也想參一腳,前幾天問了我一個問題…如何做出一個透明的視窗?
嗯,Windows GDI裡有解答,我以前玩過GDI裡的函式,有一些很fancy的東西可以呼叫。在給他看一個我做過的sample之後他馬上問了一個問題,那如何做出半透明的呢? 這是個好問題,全透明用region allocate + multi-mask即可辦到想要的透明區域及視窗形狀,半透明的話就沒那個簡單了。
首先程式得知道該視窗的背景是什麼東西(ex: 背景是桌面或其他視窗…),所以得截取整個螢幕畫面的raw data(此raw data不包含該視窗本身,是一張2D的Bitmap圖像,以下簡稱Background),接下來截取該視窗在螢幕上的X-Y座標以及該視窗的長寬(以下簡稱Position-X, Position-Y, Duration-X, Duration-Y),然後:
從Background中截取一張圖像,起始位置從Position-X及Position-Y開始,長寬為Duration-X及Duration-Y,如此便會獲得一張新圖(以下簡稱Shade)。
此時如果直接把Shade設定為視窗背景的話那麼這就是全透明,除了視窗上的物件(ex: 按扭)不透明之外其餘會看到該視窗的背面(也就是桌面或其他視窗…),當然還得將上述整個動作放在視窗移動或mouse down及move等event之中才會視窗移動時即時改變的效果。
但…如果是半透明的話呢? 這就牽涉到一個色彩學問題了(ex: 什麼顏色 + 什麼顏色 = 什麼顏色),而且又要半透明的話(牽涉到透光率)。
噹瑯~~~ 在不考慮色相相加之下的半透明演算法如下:
A = 原底圖
B = 遮罩圖
C = 新成像圖
alpha = 透光率(0 ≦ alpha ≦ 1, 0為全遮住, 1為全透明)
rgb = red, green, blue
Cr = Br × (1 - alpha) + Ar × alpha
Cg = Bg × (1 - alpha) + Ag × alpha
Cb = Bb × (1 - alpha) + Ab × alpha
所以當我們得知Shade(A),我們也知道要用何種透明遮罩(B),經由上述的公式即可算出C,最後再將C設定為底圖,這樣就大功告成了。
付上一張自行繪製的圖像供參考如下:
補充: 在數位影像中一個色點(pixel)由3個原色所組成(rgb),以24-bit色階為例一個pixel有2的24次方種可能,即由3個byte的RGB所組成0xXX 0xXX 0xXX,where XX = 0 ~ 255;所以有256 x 256 x 256 = 16777216種可能。
- May 26 Sat 2007 02:13
半透明演算法
close
全站熱搜
留言列表
發表留言