天天看點

directshow中使用StretchDIBits和AlphaBlend實作ARGB32圖檔的無損縮放

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