1. 程式人生 > >windows Api AlphaBlend的使用方法

windows Api AlphaBlend的使用方法

原文連結: http://www.cnblogs.com/sosopop/p/3412962.html

很早的時候公司裡開發了個c++客戶端軟體,需要支援windows2000,要求簡單小巧,並且不希望引入其他介面庫,圖形引擎之類的東西,像gdi+之類的,於是對於美工做出來的一些介面,需要有alpha通道的圖片渲染很麻煩,自己寫的效率還有些低.於是從msdn找到了alphablend這個函式,來做影象的alpha混合,剛開始的時候,以為這個函式只能夠處理整個圖片的整體透明度,不能處理32點陣圖像每個畫素的透明度,後來仔細研究,發現是可以做到的,配置如下引數:

  BLENDFUNCTION _blendfunction = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };

  但是渲染出來的顏色總是不對.從網上搜索也找不到答案,後來再仔細研究了下msdn,其中有個單詞引起了我的注意premultiply, 那什麼是預乘alpha值呢.我們先看一下alpha混合的公式:

  Color = ( SrcRGB * SrcAlpha ) + ( DestRGB * ( 1 - SrcAlpha ) )

  其中( SrcRGB * SrcAlpha )這一步是在渲染,或者載入之前就可以計算出來的,影象重新重新整理渲染的時候,可以直接使用已經計算好的預乘alpha數值,而不用計算這一步乘法,從而加渲染速度.因此普通包含alpha通道的影象需要做特殊處理才可以使用alphablend渲染到dc.

  那怎樣將影象預乘alpha的影象在渲染前準備好呢?一種是在載入完影象後遍歷每一個畫素,進行alpha預乘運算.還有一種是讓美工直接輸出已經預乘完畢的alpha影象.第一種方式程式設計師都會,第二種方式呢,可能程式設計師和美工都不知道怎麼弄,這裡講一下第二種方式吧,上圖.

首先載入帶alpha資訊的png,或者自己設計的psd

將圖層複製一個新的

選擇剛剛複製的圖層,按ctrl+u,調整明度到100,確定後全選並複製.

在通道面板新建一個通道,然後將剛才複製的白蘋果貼上到這個新建的通道上

返回圖層面板,刪除掉圖層面板裡的白蘋果,並在彩色蘋果下面新建一個圖層,並填充成黑色.

另存為bmp影象,色彩深度選擇32位,這樣我們就做好了預乘alpha的影象.

這是一個簡單的例子程式碼.

http://pan.baidu.com/s/11j9OJ