#include "StdAfx.h" #include "CaptureTest.h" #pragma comment(lib, "vfw32.lib") CCaptureTest g_capTest; CCaptureTest::CCaptureTest(void) { memset(m_image, 0, sizeof(m_image)); m_bCaptured = FALSE; m_EventCapture = NULL; m_hCapWnd = NULL; m_hBitmapDIB = NULL; m_lpBitmapInfoHeader = NULL; m_lpvBits = NULL; } CCaptureTest::~CCaptureTest(void) { capDriverDisconnect(m_hCapWnd); ::DestroyWindow(m_hCapWnd); if (m_lpBitmapInfoHeader) { free( m_lpBitmapInfoHeader ); m_lpBitmapInfoHeader = NULL; } if (m_hBitmapDIB) { DeleteObject(m_hBitmapDIB); m_hBitmapDIB = NULL; } m_lpvBits = NULL; if (m_EventCapture) { CloseHandle(m_EventCapture); m_EventCapture = NULL; } } LRESULT FAR PASCAL CallbackFunction(HWND hWnd, LPVIDEOHDR lpVHdr) { if (g_capTest.m_lpvBits != NULL) { //Replace the data of m_hBitmapCap memcpy(g_capTest.m_lpvBits, lpVHdr->lpData, g_capTest.m_lpBitmapInfoHeader->biSizeImage); SetEvent(g_capTest.m_EventCapture); } return TRUE; } BOOL CCaptureTest::Inialize() { m_hCapWnd = capCreateCaptureWindow( L"camera_image_capture", WS_OVERLAPPEDWINDOW, 0, 0, CAP_WIDTH, CAP_HEIGHT, NULL, //HWND hwndParent NULL); //int nID capDriverConnect(m_hCapWnd, 0); capSetCallbackOnFrame(m_hCapWnd, (LPVOID)CallbackFunction); DWORD dwSize = capGetVideoFormatSize(m_hCapWnd); m_lpBitmapInfoHeader = (BITMAPINFOHEADER*)malloc(dwSize); capGetVideoFormat(m_hCapWnd, m_lpBitmapInfoHeader, dwSize); m_hBitmapDIB = CreateDIBSection(NULL, (BITMAPINFO*)m_lpBitmapInfoHeader, DIB_RGB_COLORS, (void**)&m_lpvBits, NULL, 0); m_EventCapture = CreateEvent(NULL, FALSE, FALSE, NULL); return (m_hBitmapDIB != NULL); } void CCaptureTest::Capture() { if (m_hCapWnd) { // Start catpuring capGrabFrame(m_hCapWnd); // Wait finishing DWORD dwRet = ::WaitForSingleObject(m_EventCapture, INFINITE); // Copy data for use in future if (dwRet == WAIT_OBJECT_0) { BYTE* p = (BYTE*)m_lpvBits; for(int y = 0; y < CAP_HEIGHT; y ++) { for(int x = 0; x < CAP_WIDTH; x ++) { m_image[CAP_HEIGHT - 1 - y][CAP_WIDTH - 1 - x][0] = *p++; m_image[CAP_HEIGHT - 1 - y][CAP_WIDTH - 1 - x][1] = *p++; m_image[CAP_HEIGHT - 1 - y][CAP_WIDTH - 1 - x][2] = *p++; } } m_bCaptured = TRUE; } } } void CCaptureTest::Display(CDC* pDC) { CDC dcMem; CBitmap bmpMem; CBitmap *pOldBmp; #if 1 if (m_bCaptured) { dcMem.CreateCompatibleDC(pDC); bmpMem.CreateCompatibleBitmap(pDC, CAP_WIDTH, CAP_HEIGHT); bmpMem.SetBitmapBits(CAP_WIDTH * CAP_HEIGHT * 4, m_image); pOldBmp = dcMem.SelectObject(&bmpMem); pDC->BitBlt (10, 10, CAP_WIDTH, CAP_HEIGHT, &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(pOldBmp); } #else if (m_bCaptured) { if (m_hBitmapCap != NULL) { dcMem.CreateCompatibleDC(pDC); bmpMem.Attach(m_hBitmapCap); pOldBmp = dcMem.SelectObject(&bmpMem); pDC->BitBlt (10, 10, WIDTH, HEIGHT, &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(pOldBmp); bmpMem.Detach(); } } #endif }