#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
Posted by 지화명이
,