#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; LPCTSTR lpszClass=TEXT("WiseCat");
HWND HWndMain; HWND vfw; BITMAPINFO Bm;
static BITMAPFILEHEADER * stpBFH; static BITMAPINFOHEADER * stpBIH; static unsigned int uiPad; static HANDLE hFile; static unsigned int uiX; unsigned char *ucPixel; PAINTSTRUCT ps; unsigned char *ucBitBuffer; 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;
// ---------------------- 메모리에 비트맵 적재 시작 -------------------- // 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; 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); ucPixel =ucBitBuffer + stpBFH->bfOffBits; //그림 위치를 가리킨다. // ---------------------- 원본 영상 출력 ------------------------------------- // 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; for(iCntY = 0; iCntY < Bm.bmiHeader.biHeight ; ++iCntY) { for(iCntX = 0; iCntX < Bm.bmiHeader.biWidth ; ++iCntX, Jump += 3, ucPixel += 3 ) { if(lpData->lpData[Jump + 2] > 100) { continue; } if(lpData->lpData[Jump + 1] > 100) { 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; } |