6월11일

2010. 6. 11. 13:492010년/6월



#include<Windows.h>
#include"vfw.h"
#include <math.h>
#include <iostream>


#pragma comment(lib, "vfw32.lib"//vfw32 라이브러리 포함

#define WIDTH4(width) ((width+3)>>2)<<2 //가장중요(폭을 4배수로 맞추는것이다.
#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;    //비트맵 정보를 가짐
HDC Hdc;
//비트맵의 정보 
BYTE *imageData,*Dataimage,*byteimage;
BITMAPFILEHEADER *bmfh;
BITMAPFILEHEADER *bmfh8;
BITMAPINFO *binfo;
BITMAPINFO *binfo8;
//영상 메모리
int Action;
LONG width;
LONG height;
LONG width4;
LONG width5;
LPCTSTR lpszClass = TEXT("VFW 기본 예제");

char lpstrFile[MAX_PATH]; //충반한 길이의 버퍼제공하기위해 입력받는 파일명을 MAX_PATH(260)크기만큼선언


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
        300300, 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)
{
  FILE * file ;
  int check=4;
  int i;
  int j=0;
  int coutn;
  int R,G,B;
  
  LONG abc,def;
  switch(iMessage)
  {
  case WM_CREATE:
    file=fopen("test.bmp","rb");
  
    bmfh=(BITMAPFILEHEADER *)malloc(sizeof(BITMAPFILEHEADER));
    fread(bmfh,sizeof(BITMAPFILEHEADER),1,file);
    binfo=(BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
    fread(binfo,sizeof(BITMAPINFOHEADER),1,file);
    imageData=(BYTE *)malloc(binfo->bmiHeader.biSizeImage);
    fread(imageData,sizeof(BYTE),binfo->bmiHeader.biSizeImage,file);
    
    
    binfo8=(BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
    
    
    width4=binfo->bmiHeader.biWidth*3;
    width4=WIDTH4(width4);
  

    binfo8->bmiHeader.biBitCount=24;
    binfo8->bmiHeader.biClrImportant=0;
    binfo8->bmiHeader.biClrUsed=0;
    binfo8->bmiHeader.biCompression=0;
    binfo8->bmiHeader.biHeight=binfo->bmiHeader.biHeight/(check/2);
  

    binfo8->bmiHeader.biWidth=binfo->bmiHeader.biWidth/(check/2);
  //  binfo8->bmiHeader.biWidth=width4/(check/2);
    binfo8->bmiHeader.biPlanes=1;
    binfo8->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    binfo8->bmiHeader.biSizeImage=binfo8->bmiHeader.biHeight*binfo8->bmiHeader.biWidth;
    binfo8->bmiHeader.biXPelsPerMeter=0;
    binfo8->bmiHeader.biYPelsPerMeter=0;

    
    width5=binfo8->bmiHeader.biWidth*3;
    width5=WIDTH4(width5);

    Dataimage=(BYTE *)malloc(binfo->bmiHeader.biSizeImage); //복사받을
    
    
    for(width=0;width<binfo8->bmiHeader.biWidth;width++)
    {
      for(height=0;height<binfo8->bmiHeader.biHeight;height++)
      {
        
        R=0;
        G=0;
        B=0;
        for(i=0;i<(check/2);i++)
        {
          
          for(j=0;j<(check/2);j++)
          {
            
            
            R+=imageData[((height*(check/2)+i)*width4)+(width*(check/2)+j)*3];
            G+=imageData[((height*(check/2)+i)*width4)+(width*(check/2)+j)*3+1];
            B+=imageData[((height*(check/2)+i)*width4)+(width*(check/2)+j)*3+2];
            
            
          }
        }
        
        R=R/check;
        G=G/check;
        B=B/check;
        
        
        Dataimage[(height*width5)+width*3]=R;
        Dataimage[(height*width5)+width*3+1]=G;
        Dataimage[(height*width5)+width*3+2]=B;
        
        
      }
    }
    
    
    
/*    fwrite(bmfh8,sizeof(BITMAPFILEHEADER),1,fp);
    fwrite(binfo8,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256,1,fp);
    fwrite(byteimage,sizeof(BYTE),binfo8->bmiHeader.biSizeImage,fp);
    
    */

    //  fclose(fp);  
    fclose(file);  
    
    return 0;
  case WM_COMMAND: 
        return 0;
    case WM_LBUTTONDOWN:
    Hdc =GetDC(hWnd);
    width=binfo->bmiHeader.biWidth;
    height=binfo->bmiHeader.biHeight;
    MoveWindow(hWnd,200,200,(int)width*2+10,(int)height+33,TRUE);
    SetDIBitsToDevice(Hdc,0,0,width,height,NULL,NULL,NULL,height,imageData,binfo,DIB_RGB_COLORS);
    SetDIBitsToDevice(Hdc,width+5,0,width*2+20,height,NULL,NULL,NULL,height,Dataimage,binfo8,DIB_RGB_COLORS);
    
    ReleaseDC(hWnd,Hdc);
    return 0;
    case WM_DESTROY:
    free(imageData);
    free(Dataimage);
    free(binfo);
    free(binfo8);
    free(bmfh);
    //  free(byteimage);
        PostQuitMessage(0);
        return 0;
}
return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}