原文鏈接: 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