#include<Windows.h>
#include"vfw.h"
#include <math.h>
#include <iostream>
#pragma comment(lib, "vfw32.lib") //vfw32 라이브러리 포함
#define BUFSIZE 5000000
#define ID_BCAPTURE 101
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK FramInfo(HWND, LPVIDEOHDR); // 콜백 함수
TCHAR str[10]; //정수데이터값 확인을 위한 버퍼
unsigned char Menuflag; //인터페이스 선택
HINSTANCE g_hInst;
HWND hWndMain;
HWND hVFW;
HWND Hwndmain;
HBITMAP hBit;
BITMAPINFO Bm; //비트맵 정보를 가짐
//영상 메모리
int Action;
BYTE *imageData;
BITMAPFILEHEADER *bmfh;
BITMAPINFO *binfo;
LPCTSTR lpszClass = TEXT("VFW 기본 예제");
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCndParam, int nCmdShow)
{
HWND hWnd;
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;
WndClass.lpszClassName = lpszClass;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_HREDRAW|CS_VREDRAW;
RegisterClass(&WndClass);
//영상을 보여줄 윈도우 생성
hWnd = CreateWindow(lpszClass, lpszClass,WS_OVERLAPPEDWINDOW|WS_CAPTION,200,200,
300, 300, NULL, (HMENU)NULL, hInstance, NULL);
hWndMain = hWnd;
ShowWindow(hWnd, SW_SHOW);
while(GetMessage(&Message, 0,0,0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int)Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC Hdc;
FILE *file;
switch(iMessage)
{
case WM_CREATE:
Hwndmain = hWnd;
Hdc = GetDC(hWnd);
file=fopen("test.bmp","rb");
if(file==NULL)
{
MessageBox(0,"파일읽기 실패","에러",0);
fclose(file);
return 0;
}
//비트맵 파일 헤더 할당
bmfh = (BITMAPFILEHEADER *)malloc(sizeof(BITMAPFILEHEADER));//동적 할당 받기
fread(bmfh,sizeof(BITMAPFILEHEADER),1,file); //구조체로 저장
//비트맵인포 할당
binfo = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
fread(&(binfo->bmiHeader),sizeof(BITMAPINFOHEADER),1,file);
//이미지 해드 할당
imageData = (BYTE *)malloc(bmfh->bfSize-54);
fread(imageData,sizeof(BYTE),bmfh->bfSize-54,file);
fclose(file);
return 0;
case WM_COMMAND:
return 0;
case WM_LBUTTONDOWN:
MoveWindow(Hwndmain,200,200,500,380,true);
return 0;
case WM_PAINT:
{
Hdc = GetDC(hWnd);
LONG width = binfo->bmiHeader.biWidth;
LONG height = binfo->bmiHeader.biHeight;
SetDIBitsToDevice(Hdc,0,0,width,height,NULL,NULL,NULL,
height,imageData,binfo,DIB_RGB_COLORS);
//SetPixel 함수를 이용하여 일일이 점을 찍어 속도가 느리다.
//위 함수는 영상을 그려주며 매우 빠르다.
ReleaseDC(hWnd,Hdc);
return 0;
}
case WM_DESTROY:
free(imageData);
free(binfo);
free(bmfh);
PostQuitMessage(0);
return 0;
}
return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}
'영상처리' 카테고리의 다른 글
SM_BMP.H (0) | 2010.06.16 |
---|---|
영상 캡쳐 (0) | 2010.06.08 |
영상처리 기본 소스 (0) | 2010.06.07 |