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

你可能感兴趣的:(图片缩放,directshow,directshow,directshow,StretchDIBits,AlphaBlend,ARGB32)