• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            基于Directshow框架使用Windows渲染器VMR疊加水印

            轉(zhuǎn)載自:http://blog.sina.com.cn/s/blog_6281e5750100xdnj.html

            對(duì)于windows系統(tǒng),EVR/VMR9/VMR渲染器均提供了疊加靜態(tài)圖片的接口:
            SetAlphaBitmap();
             
            此接口支持靜態(tài)圖片的資源使用方式,一種是HDC,一種是SURFACE;
            使用發(fā)現(xiàn),如果靜態(tài)圖片不規(guī)則,是有Alpha通道的不同取值形成,
            則通過(guò)HDC疊加的會(huì)有黑邊存在;
             
            對(duì)于EVR/VMR9可采用SURFACE,使用D3D創(chuàng)建,完美水印效果相對(duì)容易實(shí)現(xiàn),略過(guò);
            對(duì)于VMR渲染器,SURFACE需要基于DirectDraw創(chuàng)建離屏表面;
             
            離屏表面創(chuàng)建后,靜態(tài)圖片數(shù)據(jù)使用決定著是否能完美呈現(xiàn)水印效果;
            一種是通過(guò)離屏表面獲取HDC,操作HDC,把靜態(tài)圖片附加給離屏表面,
            一種是通過(guò)直接操作離屏表面的內(nèi)存數(shù)據(jù)地址;
             
            經(jīng)過(guò)幾天的摸索,實(shí)現(xiàn)了比較完美的水印效果,代碼如下:
            LPDIRECTDRAW7 lpDDraw7;
             
              
            if(FAILED(DirectDrawCreateEx(NULL, (LPVOID *)&lpDDraw7, IID_IDirectDraw7, NULL)))
              
            {
               
            return ;
              }

             
            if (FAILED(lpDDraw7->SetCooperativeLevel(m_hShowWin, DDSCL_NORMAL)))
             
            {
              
            return ;
             }

             
             DDSURFACEDESC2 ddsd;
             ZeroMemory(
            &ddsd, sizeof(ddsd));
               ddsd.dwSize 
            = sizeof(ddsd);
               ddsd.dwFlags 
            = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
               ddsd.ddsCaps.dwCaps 
            = DDSCAPS_OFFSCREENPLAIN;
               ddsd.dwWidth 
            = xs;
             ddsd.dwHeight 
            = ys;
              ddsd.ddpfPixelFormat.dwSize 
            =sizeof(DDPIXELFORMAT);
              ddsd.ddpfPixelFormat.dwFlags 
            =DDPF_RGB | DDPF_ALPHAPIXELS;
              ddsd.ddpfPixelFormat.dwRGBBitCount 
            =32;
               ddsd.ddpfPixelFormat.dwRBitMask
            =0x00ff0000;
               ddsd.ddpfPixelFormat.dwGBitMask
            =0x0000ff00;
               ddsd.ddpfPixelFormat.dwBBitMask
            =0x000000ff;
             ddsd.ddpfPixelFormat.dwRGBAlphaBitMask
            =0xff000000;
              
            if(FAILED(lpDDraw7->CreateSurface(&ddsd, lpSource, NULL)))
             
            {
              
            return ;
             }

             
             
            lpSurface
            ->Restore();
              CImage img;
              HRESULT result;
              result 
            = img.Load(_bstr_t(path));
              
            if(!SUCCEEDED(result))
               
            return ;
              LPBYTE lpBits 
            = (LPBYTE)img.GetBits();
              
            int nPitch = img.GetPitch();
              
            int imgWidth = img.GetWidth();
              
            int bpp = img.GetBPP();
              
            if(bpp != 24 && bpp != 32)
               
            return ;
             
              DDSURFACEDESC2 dds;
              ZeroMemory(
            &dds,0,sizeof(dds));
              dds.dwSize   
            =   sizeof(dds);
              
            if(DD_OK != lpSurface->Lock(NULL, &dds, DDLOCK_WAIT, NULL))
               
            return;
             
              LPBYTE dest 
            = (LPBYTE)dds.lpSurface;
              
            forint yPos = 0; yPos < img.GetHeight(); yPos++)
              
            {
               LPBYTE lpBytes 
            = lpBits + ( yPos * nPitch );
               
            int width = img.GetWidth( ) * (bpp / 8);
             
               
            forint xPos = 0; xPos < width; )
               
            {
                
            if(bpp == 24)
                
            {
             
                 
            *dest++ = lpBytes[xPos ];
                 
            *dest++ = lpBytes[xPos + 1];
                 
            *dest++ = lpBytes[xPos + 2];
                 
            *dest++ = 0xff;
             
                 xPos 
            += 3 ;
                }

                
            else if(bpp == 32)
                
            {
                 
            *dest++ = lpBytes[xPos];
                 xPos 
            ++;
                }

               }

             
               dest 
            += dds.lPitch - width;
              }

              lpSurface
            ->Unlock(NULL);
            靜態(tài)圖片的數(shù)據(jù)賦給離屏表面,上面代碼采用的是操作內(nèi)存的方式,如果采用
            lpSurface->GetDc(&hdc)的方式,然后通過(guò)BitBlt方式繪制的話,alpha通道會(huì)丟失,達(dá)不到水印的完美呈現(xiàn)

            posted on 2012-09-17 11:06 楊粼波 閱讀(1338) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++Windows

            国产精品永久久久久久久久久| 久久国产精品久久久| 久久丝袜精品中文字幕| 欧美精品丝袜久久久中文字幕| 亚洲国产香蕉人人爽成AV片久久| 亚洲欧美伊人久久综合一区二区 | 99久久精品国产毛片| 久久亚洲电影| 久久久久久久久无码精品亚洲日韩 | 久久w5ww成w人免费| 久久久精品久久久久特色影视| 久久www免费人成看片| 精品久久久久一区二区三区| 性做久久久久久久| 久久e热在这里只有国产中文精品99| 国产精品美女久久福利网站| 9191精品国产免费久久| 亚洲精品高清国产一线久久| 日产久久强奸免费的看| 色综合久久久久网| 久久99国内精品自在现线| 久久久久久久免费视频| 91精品国产91久久久久久青草| 色综合久久久久久久久五月| 香蕉久久久久久狠狠色| 超级碰久久免费公开视频| 99久久精品日本一区二区免费| 欧美激情一区二区久久久| 欧洲国产伦久久久久久久| 久久99精品久久久久久不卡| 国产精品久久久久9999高清| 久久婷婷五月综合97色一本一本| 久久福利资源国产精品999| 久久这里的只有是精品23| 久久乐国产精品亚洲综合| 狠狠人妻久久久久久综合蜜桃| 亚洲狠狠久久综合一区77777| 国产精品一久久香蕉产线看 | 99久久精品国产一区二区三区| 精品国产青草久久久久福利| 久久伊人精品一区二区三区|