#include <windows.h> #include <vfw.h>
//#pragma comment(lib, "vfw32.lib")
#define MALPHA 214 #define GALPHA 70 #define HALPHA 255//(MALPHA+GALPHA) #define LALPHA (MALPHA-GALPHA)
#define XSCALE 320 #define YSCALE 240
HWND hCam; BITMAPINFO stBmpInfo; static BYTE Bdata[XSCALE*YSCALE * 3];
typedef struct { UINT uiMSG; LRESULT(*fp) (WPARAM, LPARAM);
}stMSG_Map;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT On_Paint(WPARAM wParam, LPARAM lParam); LRESULT On_Create(WPARAM wParam, LPARAM lParam); LRESULT On_Destroy(WPARAM wParam, LPARAM lParam); LRESULT capture(HWND, LPVIDEOHDR);
HINSTANCE g_hInst; LPSTR lpszClass = L"캠";
stMSG_Map stMap[] = { { WM_PAINT, On_Paint }, { WM_CREATE, On_Create }, { WM_DESTROY, On_Destroy }, { WM_NULL, 0 } };
HWND hWnd;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance , LPSTR lpszCmdParam, int nCmdShow) { MSG Message; WNDCLASS WndClass; g_hInst = hInstance;
WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); WndClass.hInstance = hInstance; WndClass.lpfnWndProc = (WNDPROC)WndProc; WndClass.lpszClassName = lpszClass; WndClass.lpszMenuName = NULL; WndClass.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&WndClass);
hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow);
while (GetMessage(&Message, 0, 0, 0)) { TranslateMessage(&Message); DispatchMessage(&Message); } return Message.wParam; }
LRESULT CALLBACK WndProc(HWND hWpWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { hWnd = hWpWnd; stMSG_Map * stpMap = stMap;
while (WM_NULL != ((*stpMap).uiMSG)) { if (iMessage == ((*stpMap).uiMSG)) { return (((*stpMap).fp)(wParam, lParam)); } ++stpMap; }
return (DefWindowProc(hWnd, iMessage, wParam, lParam)); }
LRESULT On_Paint(WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps;
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps); return 0; }
LRESULT Capture(HWND hWpWnd, LPVIDEOHDR lpVHdr) { HDC hdc; UINT uiXCnt; UINT uiYCnt; UINT uiCal;
static BYTE Vdata[XSCALE*YSCALE*3];
hdc = GetDC(hWnd);
//memcpy(Vdata, lpVHdr->lpData, lpVHdr->dwBufferLength); for (uiYCnt = 0; uiYCnt < YSCALE; ++uiYCnt) { for (uiXCnt = 0; uiXCnt < XSCALE; ++uiXCnt) { uiCal = 3 * (uiYCnt*XSCALE + uiXCnt); Vdata[uiCal + 0] = *((lpVHdr->lpData + uiCal + 0)); Vdata[uiCal + 1] = *((lpVHdr->lpData + uiCal + 1)); Vdata[uiCal + 2] = *((lpVHdr->lpData + uiCal + 2)); if (HALPHA < Vdata[uiCal + 0]) { continue; } if (LALPHA > Vdata[uiCal + 0]) { continue; } if (HALPHA < Vdata[uiCal + 1]) { continue; } if (LALPHA > Vdata[uiCal + 1]) { continue; } if (HALPHA < Vdata[uiCal + 2]) { continue; } if (LALPHA > Vdata[uiCal + 2]) { continue; } Vdata[uiCal + 0] = Bdata[uiCal + 0]; Vdata[uiCal + 1] = Bdata[uiCal + 1]; Vdata[uiCal + 2] = Bdata[uiCal + 2]; } }
StretchDIBits(hdc, XSCALE + 20, 0, XSCALE, YSCALE, 0, 0, XSCALE, YSCALE, Vdata, &stBmpInfo, DIB_RGB_COLORS, SRCCOPY); ReleaseDC(hWpWnd, hdc); return 0; }
LRESULT On_Create(WPARAM wParam, LPARAM lParam) { HDC hdc; BOOL bRet; BITMAPFILEHEADER stBFHead; BITMAPINFOHEADER stBFInfo; HANDLE hFile; DWORD dwCnt;
hFile = CreateFile(L"bg.bmp", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) { MessageBox(hWnd, L"Open Error", L"ERROR", MB_OK); PostQuitMessage(0); return 0; }
bRet = ReadFile(hFile, &stBFHead, sizeof(BITMAPFILEHEADER), &dwCnt, NULL); if (FALSE == bRet) { MessageBox(hWnd, L"File헤더 Read Error", L"ERROR", MB_OK); CloseHandle(hFile); PostQuitMessage(0); return 0; }
bRet = ReadFile(hFile, &stBFInfo, sizeof(BITMAPINFOHEADER), &dwCnt, NULL); if (FALSE == bRet) { MessageBox(hWnd, L"Info헤더 Read Error", L"ERROR", MB_OK); CloseHandle(hFile); PostQuitMessage(0); return 0; }
if (YSCALE < stBFInfo.biHeight) { MessageBox(hWnd, L"Big Image", L"ERROR", MB_OK); CloseHandle(hFile); PostQuitMessage(0); return 0; }
if (XSCALE < stBFInfo.biWidth) { MessageBox(hWnd, L"Big Image", L"ERROR", MB_OK); CloseHandle(hFile); PostQuitMessage(0); return 0; }
bRet = ReadFile(hFile, Bdata, stBFInfo.biSizeImage, &dwCnt, NULL); if (FALSE == bRet) { MessageBox(hWnd, L"Back Image Data Read Error", L"ERROR", MB_OK); CloseHandle(hFile); PostQuitMessage(0); return 0; } CloseHandle(hFile);
hCam = capCreateCaptureWindow(L"스마트", WS_CHILD | WS_VISIBLE, 0, 0, XSCALE, YSCALE, hWnd,0);
if (NULL == hCam) { MessageBox(hWnd, L"창을 생성할 수 없습니다", L"Error", MB_OK); PostQuitMessage(0); return 0; }
bRet = capDriverConnect(hCam, 0); if (FALSE == bRet) { MessageBox(hWnd, L"카메라를 찾을 수 없습니다.", L"Error", MB_OK); PostQuitMessage(0); return 0; } capPreviewRate(hCam, 1); capGetVideoFormat(hCam, &stBmpInfo, sizeof(BITMAPINFO));
stBmpInfo.bmiHeader.biWidth = XSCALE; stBmpInfo.bmiHeader.biHeight = YSCALE; capSetVideoFormat(hCam, &stBmpInfo, sizeof(BITMAPINFO)); capSetCallbackOnFrame(hCam, Capture); capPreview(hCam, TRUE); hdc = GetDC(hWnd);
ReleaseDC(hWnd, hdc); return 0; }
LRESULT On_Destroy(WPARAM wParam, LPARAM lParam) { capDriverDisconnect(hCam); PostQuitMessage(0); return 0; } |