程序要实现的功能是从摄像头中捕捉实时视频,同时在屏幕上显示出视频。数据是从驱动程序里直接读出的。自己以前没做过位图方面的程序,很多地方不明白,想问问大家。
自己编写的代码如下:
(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)按照驱动程序中的注释,驱动中拿到的数据是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函数中了,也没有什么机制触发它,这也可能是一个错误的原因请各位高手帮忙看看!
-------------------------------
你确定这里得到的是屏幕的DC吗?
还不如用
CWindowDC dc(NULL);
hDisplay = dc.m_hDC
定时刷新很简单,你设一个timer,定时发送wm_paint消息就可以了