程序要实现的功能是从摄像头中捕捉实时视频,同时在屏幕上显示出视频。数据是从驱动程序里直接读出的。自己以前没做过位图方面的程序,很多地方不明白,想问问大家。  
自己编写的代码如下:  
(1)按照驱动程序中的注释,驱动中拿到的数据是RGB565格式的,所以定义了RGB565格式的位图,不知道是不是需要这样?也不知道定义的对不对?  
BITMAPINFO  m_BmpU;  
ZeroMemory(&m_BmpU,sizeof(m_BmpU));  
m_BmpU.bmiHeader.biSize  =  sizeof(BITMAPINFOHEADER);  
m_BmpU.bmiHeader.biWidth  =  320;  
m_BmpU.bmiHeader.biHeight  =  240;  
m_BmpU.bmiHeader.biPlanes  =  1;  
m_BmpU.bmiHeader.biBitCount  =  16;  
m_BmpU.bmiHeader.biCompression  =  BI_BITFIELDS;  
m_BmpU.bmiHeader.biSizeImage  =  2*(m_BmpU.bmiHeader.biWidth+3)/4*4*abs(m_BmpU.bmiHeader.biHeight);  
m_BmpU.bmiHeader.biXPelsPerMeter  =  0x1712;  
m_BmpU.bmiHeader.biYPelsPerMeter  =  0x1712;  
m_BmpU.bmiHeader.biClrUsed  =  0;  
m_BmpU.bmiHeader.biClrImportant  =  0;  
(2)这里使用CreateDIBSetion创建位图,pBits是指向存储空间的指针(不知道这样理解对不对??)  
 LPBYTE  pBits;  
   HDC  hDisplay=GetDC(m_hWndCap);//获取指定窗口客户区或整个屏幕的显示器描述表句柄  
   HBITMAP  hBitmap  =  CreateDIBSection(hDisplay,  &m_BmpU,  DIB_RGB_COLORS,(void**)  &pBits,  NULL,  0);  
             
       //  创建一个与设备上下文一致的存储空间把位图数据载入  
   HDChMemory  =  CreateCompatibleDC(hDisplay);  
   HBITMAP  hBitmap0  =  (HBITMAP)  SelectObject(hMemory,  hBitmap);  
       
(3)  
从驱动中把视频数据COPY到pBits指向的空间中后执行下面的语句: 
BitBlt(hDisplay,  0,  0,  320,  240,  hMemory,  0,  0,  SRCCOPY);显示位图  
 
不知道这样写哪里不对?屏幕上什么都显示不出来。  还有一个问题就是必须不断调用这个画位图函数,不知道有什么方法能实现不断显示视频图像。我现在就把这段画图代码放在OnPaint函数中了,也没有什么机制触发它,这也可能是一个错误的原因请各位高手帮忙看看!

解决方案 »

  1.   

    HDC  hDisplay=GetDC(m_hWndCap);
    -------------------------------
    你确定这里得到的是屏幕的DC吗?
    还不如用
    CWindowDC dc(NULL);
    hDisplay = dc.m_hDC
      

  2.   

    现在的运行状况是要显示图像的控件中显示的是黑色的,m_hWndCap是主对话框上的一个控件的句柄,要在这个控件中显示图像。不知道这样是不是得到的是屏幕的DC?
      

  3.   

    晕,“屏幕”把我给搞晕了,你的处理没错。
    定时刷新很简单,你设一个timer,定时发送wm_paint消息就可以了
      

  4.   

    定时发送wm_paint了,可还是显示出来全是黑色的,不知道怎么回事