#include <windows.h>
#include "vfw.h"
#pragma comment(lib, "vfw32.lib")
#define BITMAP_MAXSIZE ((3*1024*768)+100)
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK FramInfo(HWND, LPVIDEOHDR);
HINSTANCE g_hInst;
HWND HWndMain;
LPCTSTR lpszClass=TEXT("WiseCat");
HWND vfw;
BITMAPINFO Bm;
unsigned char * ucBitBuffer;
DWORD dwsize;
HBITMAP hbit;
static HANDLE hFile;
//크기를 들고 있는 변수
static unsigned int uiX;
static unsigned int uiY;
//bitmap 파일 구조
static BITMAPFILEHEADER * stpBFH;
static BITMAPINFOHEADER * stpBIH;
static unsigned int uiPad;
unsigned char * ucPixel;
DWORD dwReadSize;
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst = hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=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,NULL,0,0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int)Message.wParam;
}
HDC hdc;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
switch(iMessage)
{
case WM_CREATE:
HWndMain = hWnd;
hdc = GetDC(hWnd);
ucBitBuffer=(unsigned char *)malloc(BITMAP_MAXSIZE);
if(0 == ucBitBuffer)
{
MessageBox(hWnd,TEXT("메모리가 부족합니다"),TEXT("sorry"),MB_OK);
DestroyWindow(hWnd);
}
hFile=CreateFile(TEXT("image.bmp"),GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //파일을 생성하거나 연다(open함수)
if(hFile == INVALID_HANDLE_VALUE)
{
MessageBox(hWnd,TEXT("비트맵 파일이 없어서 종료합니다"),TEXT("sorry"),MB_OK);
DestroyWindow(hWnd);
}
ReadFile(hFile,ucBitBuffer,BITMAP_MAXSIZE,&dwReadSize,NULL);
CloseHandle(hFile);
stpBFH =(BITMAPFILEHEADER *) ucBitBuffer;
stpBIH =(BITMAPINFOHEADER *) (ucBitBuffer+sizeof(BITMAPFILEHEADER));
uiX = stpBIH->biWidth;
uiY = stpBIH->biHeight;
uiPad = uiX%4;
vfw = capCreateCaptureWindow(TEXT("CAM"),WS_CHILD | WS_VISIBLE,0,0,400,300,hWnd,NULL);
capDriverConnect(vfw,0);
capGetVideoFormat(vfw,&Bm,sizeof(Bm));
Bm.bmiHeader.biWidth = 320;
Bm.bmiHeader.biHeight = 240;
capSetVideoFormat(vfw,&Bm,sizeof(Bm));
capSetCallbackOnFrame(vfw, FramInfo);
capPreviewRate(vfw, 1);
capPreview(vfw, FALSE);
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
free(ucBitBuffer);
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
LRESULT CALLBACK FramInfo(HWND hWnd, LPVIDEOHDR lpData)
{
static int iCntX;
static int iCntY;
static int Jump;
hdc = GetDC(HWndMain);
StretchDIBits(hdc,0,0, Bm.bmiHeader.biWidth, Bm.bmiHeader.biHeight, 0, 0, Bm.bmiHeader.biWidth, Bm.bmiHeader.biHeight
, lpData->lpData, &Bm, DIB_RGB_COLORS, SRCCOPY);
Jump= 0;
ucPixel =ucBitBuffer + stpBFH->bfOffBits; //그림 위치를 가리킨다.
for(iCntY = 0; iCntY < Bm.bmiHeader.biHeight ; ++iCntY)
{
for(iCntX = 0; iCntX < Bm.bmiHeader.biWidth ; ++iCntX, Jump=Jump+3,ucPixel = ucPixel+3)
{
if(lpData->lpData[Jump + 2] > 150)
{
continue;
}
if(lpData->lpData[Jump + 1] > 255)
{
continue;
}
if(lpData->lpData[Jump + 0] > 50)
{
lpData->lpData[Jump] = *(ucPixel+0); // Blue
lpData->lpData[Jump + 2] = *(ucPixel+2); // Red
lpData->lpData[Jump + 1] = *(ucPixel+1); // Green
}
}
ucPixel = ucPixel +uiPad;
}
StretchDIBits(hdc , Bm.bmiHeader.biWidth +20, 0 , Bm.bmiHeader.biWidth, Bm.bmiHeader.biHeight, 0
, 0, Bm.bmiHeader.biWidth, Bm.bmiHeader.biHeight, lpData->lpData, &Bm, DIB_RGB_COLORS, SRCCOPY);
ReleaseDC(HWndMain, hdc);
return 0;
}