初学Directdraw--Alpha半透明,抠像

原创 2007年10月07日 15:06:00

     最近做的一个项目中要用到抠像和半透明技术,由于刚学Directdraw,查了好多资料,很费事,现把其中的要点和代码附上,以供大家参考:

1,抠像原理

 要有两副图形:   背景色,实时采集的图形,比如要抠一个人的图象放在背景色上,在国内人要站在蓝色的背景墙前,国外是绿色,因为外国人的眼睛是蓝色的;然后根据颜色差进行判断;

 for(i = 0; i < 480 ; i ++)
 {
  for(j = 0; j < 640; j ++)
  {
   x1 = m_pBkImg[n] - m_pSrcImg[n];
   x2 = m_pBkImg[n + 1] - m_pSrcImg[n + 1];
   x3 = m_pBkImg[n + 2] - m_pSrcImg[n + 2];
   if(x1 < 0)//去正
    x1 = -x1;
   if(x2 < 0)
    x2 = -x2;
   if(x3 < 0)
    x3 = -x3;
   if(
    ( x1 > g_B)||//blue   //根据域值判断抠像的范围
    (x2 > g_G)||//green
    (x3 > g_R)//||//red
        )
   {
    m_pObjImg[n] =m_pSrcImg[n];
    m_pObjImg[n + 1] = m_pSrcImg[n + 1];
    m_pObjImg[n + 2] = m_pSrcImg[n + 2]  
   }
   else
   {
    m_pObjImg[n] = m_pObjImg[n + 1] = m_pObjImg[n + 2] = 0;   //设置关键色
   }     n += 3;
  }
 }

2  Alpha半透明

 这个原理网上很多,主要要考虑的是不同格式的图片怎么融和,比如一个人24位的,一个16为的;

 int m_iNum = 0;
 if (m_btouming)//半透明
 {
  DDSURFACEDESC ddsd; //DirectDraw页面描述
  ZeroMemory(&ddsd, sizeof(ddsd)); //ddsd用前要清空
  ddsd.dwSize = sizeof(ddsd); //DirectDraw中的对象都要这样
  lpDDSGround->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);

   WORD *m_pGdjImg = (WORD*)ddsd.lpSurface;

  int nR16,nG16,nB16;
  int nR24,nG24,nB24;
  int nR,nG,nB;
  int lpitch16 = (int)(ddsd.lPitch>>1); //行间距为1280个字节
  int Alpha = 16;
  
  for(int x(0);x<640;x++)
  {
   for(int y(1);y<479;y++)
   {
    m_iNum = (( 479-y ) * 640 + x ) * 3;
   
    if( ( m_pObjImg[m_iNum] != 0 ) ||
    ( m_pObjImg[m_iNum+1] != 0 ) ||
    ( m_pObjImg[m_iNum+2] != 0 ) )
    {
     nR16 = m_pGdjImg[x + y*lpitch16] >> 11 ;  //5位
     nG16 = m_pGdjImg[x + y*lpitch16] >> 5 &0x3f ; //6位
     nB16 = m_pGdjImg[x + y*lpitch16] &0x1f ;  //5位

     nB24 = m_pObjImg[ m_iNum ] ;  //8位
     nG24 = m_pObjImg[ m_iNum + 1 ] ; //8位
     nR24 = m_pObjImg[ m_iNum + 2 ] ; //8位

     nR = ( nR24* Alpha + ((nR16<<3) * (32-Alpha) ) ) >> 5; //右移3位,位数匹配
     nG = ( nG24* Alpha + ((nG16<<2) * (32-Alpha) ) ) >> 5; //右移2位,位数匹配
     nB = ( nB24* Alpha + ((nB16<<3) * (32-Alpha) ) ) >> 5; //右移3位,位数匹配
     
     m_pObjImg[   m_iNum   ]  = nB;
     m_pObjImg[   m_iNum + 1 ] = nG ;
     m_pObjImg[   m_iNum + 2 ] = nR ;

    }
   }
   }
  
  lpDDSGround->Unlock(&ddsd); //Unlock!
 }
 
}

随便写点,给有需要的人

 

 

一个DirectDraw入门程序

只要是介绍编程的书,似乎有一个不成文的规定,即第一个例子由“Hello World”开始,本教程也不例外。那么,如果你早已迫不及待想初尝DirectDraw程序编译成功后的“0 error(s), 0...

Direct3D进行Alpha混合实现半透明效果

演示程序下载地址:http://download.csdn.net/detail/jiangcaiyang123/4091157 这次给大家奉献的是我最近学习DirectX基础的一些内容:进...

IE, FireFox, Opera 浏览器支持CSS实现Alpha半透明的方法

这个世界变化很快,IE8也快出来了,它将不在支持以前{filter:alpha(opacity=50);}的私有属性,转而支持更规范的私有属性-ms-filter: “progid:DXImageTr...

基于FPGA的Alpha半透明图像叠加算法实现

#include #include using namespace cv; using namespace std; Mat dealImg(Mat &img); int main() { Mat...
  • lcc_633
  • lcc_633
  • 2016年07月22日 09:22
  • 835

IE, FireFox, Opera 浏览器支持CSS实现Alpha半透明的方法

(转载于随网之舞http://dancewithnet.com/2006/05/18/css-alpha-transparent/) IE, FireFox, Opera 浏览器支持CSS实现A...

IE8半透明滤镜(filter:alpha)失效(附png半透明失效的解决办法)

很诡异的问题,很诡异的问题,真是很诡异的问题,很蛋疼的问题,很蛋疼的问题,真是很蛋疼的问题。 前两天给div写的滤镜在IE8、9上都没有问题,不知道为什么,今天一看,滤镜在IE9上没有问题,...

半透明按钮背景切换手机网站首页

  • 2015年05月05日 23:59
  • 1.92MB
  • 下载

CSS以及js半透明

  • 2012年10月30日 21:46
  • 800B
  • 下载

Android PopupWindow背景半透明兼容方案

View contentView;    LayoutInflater mLayoutInflater = LayoutInflater.from(activity);    contentVie...
  • rosener
  • rosener
  • 2016年10月24日 23:24
  • 1174
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:初学Directdraw--Alpha半透明,抠像
举报原因:
原因补充:

(最多只允许输入30个字)