directshow中使用StretchDIBits和AlphaBlend实现ARGB32图片的无损缩放

来源:互联网 发布:蒋大为国籍 知乎 编辑:程序博客网 时间:2024/05/22 03:01

原文地址:http://blog.csdn.net/nkliming/article/details/8292689


   之前使用StretchDIBits遇到一个很棘手的问题,就是不能处理alpha通道,都会默认填充零,那么这种情况下,都是透明也就不能正常显示特效了。后来查资料,发现了AlphaBlend可以添加透明度,如果源与目的size不同,则会缩放源,将alpha通道写入。

直接上核心实现代码:

[cpp] view plaincopy
  1. BITMAPINFOHEADER bih;  
  2.     memset( &bih, 0, sizeof( bih ) );  
  3.     bih.biSize = sizeof( bih );  
  4.     bih.biWidth = nSrcWidth;  
  5.     bih.biHeight = nSrcHeight;  
  6.     bih.biPlanes = 1;  
  7.     bih.biBitCount = 32;  
  8.     SetStretchBltMode(hMemDC, COLORONCOLOR);  
  9.     StretchDIBits(   
  10.         hMemDC, 0,0,   
  11.         nDesWidth, nDesHeight,   
  12.         0, 0, nSrcWidth, nSrcHeight,   
  13.         pSrcData,   
  14.         (BITMAPINFO*) &bih,   
  15.         NULL,   
  16.         SRCCOPY );  
  17.     BLENDFUNCTION blend;  
  18.     memset( &blend, 0, sizeof( blend) );  
  19.     blend.BlendOp= AC_SRC_ALPHA;  
  20.     AlphaBlend(hMemDC,0,0,nDesWidth,nDesHeight,hDC,0,0,nSrcWidth,nSrcHeight,blend);  

重要参数说明:hMemDC与指定的设备环境相关的设备兼容的DC;hDC:源DC。


//END ICTwangbiao


原创粉丝点击