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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值