之前使用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工作了,如果有更好的方法,欢迎指出。