分享

DX中抓拍GetCurrentImage的用法

 BeautymengRoom 2013-10-26

  在BasicWindow中有个GetCurrentImage方法,可以很好的完成抓拍功能。但有以下两点要注意:

    1、在建立filter graph时,我们renderer某个源时,系统默认采用video renderer,此时如果调用GetCurrentImage方法,并不可靠,有时甚至根本不能抓拍到;解决此问题可以采用“DirectShow实务精选”中的提供的抓拍Filter来实现抓拍;但看过那篇文章的人都知道比较复杂,其实有个比较简单的方法,就是直接用Video Mix Renderer9代替Video Renderer:在renderer之前,把VMR9调到filter graph中即可。

    2、另外,通常提供的例程会是这样的:

BOOL CDXGraph::GetCurrentImage(const char * inFile)
{
 if (mBasicVideo)
 {
  long bitmapSize = 0;
  if (SUCCEEDED(mBasicVideo->GetCurrentImage(&bitmapSize, 0)))
  {
   BOOL pass = FALSE;
   //this->Pause();
   BYTE * buffer = new BYTE[bitmapSize];
   if (SUCCEEDED(mBasicVideo->GetCurrentImage(&bitmapSize, (long *)buffer)))
   {
     BITMAPFILEHEADER hdr;
              LPBITMAPINFOHEADER lpbi;
            
              lpbi = (LPBITMAPINFOHEADER)buffer;

              int nColors = 1 << lpbi->biBitCount;
              if (nColors > 256)
                   nColors = 0;
              hdr.bfType  = ((WORD) ('M' << 8) | 'B'); // always is "BM"
              hdr.bfSize  = bitmapSize + sizeof( hdr );
              hdr.bfReserved1 = 0;
              hdr.bfReserved2 = 0;
              hdr.bfOffBits  = (DWORD) (sizeof(BITMAPFILEHEADER) + lpbi->biSize +
      nColors * sizeof(RGBQUAD));

             CFile bmpFile(inFile, CFile::modeReadWrite | CFile::modeCreate | CFile::typeBinary);
                bmpFile.Write(&hdr, sizeof(BITMAPFILEHEADER));
    bmpFile.Write(buffer, bitmapSize);
    bmpFile.Close();
    pass = TRUE;
   }
   delete [] buffer;
   return pass;
  }
 }
 return FALSE;
}

     但有时(甚至是多数时候,呵呵),抓拍下来的图并不是在各种图像处理过程中都能正常显示(如:不能生成缩略图,在photoshop中不能打开),其实也就是在写Bmp文件头时对图像位数处理不对引起的:

    注意到变量nColors会直接影响到数据指示的起始位置,事实上GutCurrentImage并不支持带调色板的位图,所以可以改成这样:

    原:

              int nColors = 1 << lpbi->biBitCount;
              if (nColors > 256)
                   nColors = 0;

    现:

        int nColors=0;
        if ( lpbi->biBitCount <= 8)
        {
             nColors = 1 << lpbi->biBitCount;
        }
这样就能正确保存并能正常显示抓拍的图像了

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约