之前使用StretchDIBits遇到一個很棘手的問題,就是不能處理alpha通道,都會預設填充零,那麼這種情況下,都是透明也就不能正常顯示特效了。後來查資料,發現了AlphaBlend可以添加透明度,如果源與目的size不同,則會縮放源,将alpha通道寫入。
直接上核心實作代碼:
BITMAPINFOHEADER bih;
memset( &bih, 0, sizeof( bih ) );
bih.biSize = sizeof( bih );
bih.biWidth = nSrcWidth;
bih.biHeight = nSrcHeight;
bih.biPlanes = 1;
bih.biBitCount = 32;
SetStretchBltMode(hMemDC, COLORONCOLOR);
StretchDIBits(
hMemDC, 0,0,
nDesWidth, nDesHeight,
0, 0, nSrcWidth, nSrcHeight,
pSrcData,
(BITMAPINFO*) &bih,
NULL,
SRCCOPY );
BLENDFUNCTION blend;
memset( &blend, 0, sizeof( blend) );
blend.BlendOp= AC_SRC_ALPHA;
AlphaBlend(hMemDC,0,0,nDesWidth,nDesHeight,hDC,0,0,nSrcWidth,nSrcHeight,blend);
重要參數說明:hMemDC與指定的裝置環境相關的裝置相容的DC;hDC:源DC。
ps:謝謝樓下評論,如果是DC直接加載帶透明度的圖檔,那麼隻需要執行alphablend操作即可,一步到位,壓縮和透明度渲染都沒問題。但是如果傳遞的參數是BYTE數組,隻能執行兩次MemDc的cpy工作了,如果有更好的方法,歡迎指出。