본문 바로가기
코스웨어/10년 시스템제어

시스템제어 6월10일 보고서

by 알 수 없는 사용자 2010. 6. 11.
728x90
반응형

========================================================================================================================================================================
영상 처리
========================================================================================================================================================================
#include<Windows.h>
#include"vfw.h"
#include <math.h>
#include <iostream>


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


#define ID_BCAPTURE 101

#define WIDTH4(width) ((width+3)>>2)<<2

========================================================================================================================================================================
========================================================================================================================================================================

// 폭을 4의배수로 맞추는작업이다. RGB에서의 폭을맞출때는 width*3+3이 들어가지만 여기서는 width *3을 뺐다 흑백이기때문에
// 전체적으로 곱하기 3을 하게되면 빈공간이 더늘어나기때문에 곱하기 3을하질 않는다. 이작업을하지않으면 이미지의 폭이 맞지않게
// 되어서 이미지 뒤틀림이 있기때문에 꼭 해줘야대는작업이다.


디버깅을 하였을때 이미지의 사이즈를  확인해보았다 위와같이 define을 설정해주게되면 저렇게 뒤틀림이없는 이미지를주게된다.

========================================================================================================================================================================
========================================================================================================================================================================

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;

LPCTSTR lpszClass = TEXT("VFW 기본 예제");

BYTE *imageData;
BITMAPFILEHEADER bmfh;
BITMAPINFO *binfo;
BYTE *cpyData;

// 8bit 흑백영상으로 바꾸어줄 변수
BITMAPFILEHEADER bmfh8;
BITMAPINFO *binfo8;
BYTE *Data8bit;

 

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;
 LONG width, height;
 int count=0;
 switch(iMessage)
 {
 case WM_CREATE:

  Hwndmain = hWnd;

  Hdc = GetDC(hWnd);

  file=fopen("test.bmp","rb");

  if(file==NULL)
   return 0;


  //BITMAPINFO
  binfo = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER)+(sizeof(RGBQUAD)*256));
  //초기화
  memset(binfo,0,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
  //이미지 데이터가 보관될 메모리 할당


  //비트맵 파일 헤더 읽음
  fread(&bmfh,sizeof(BITMAPFILEHEADER),1,file);
  //비트맵 인포 헤더를 읽음
  fread(&(binfo->bmiHeader),sizeof(BITMAPINFOHEADER),1,file);

  imageData = (BYTE*)malloc(binfo->bmiHeader.biSizeImage);
  //이미지 데이터를 읽음
  fread(imageData,sizeof(BYTE),binfo->bmiHeader.biSizeImage,file);

  fclose(file);
  // 8bit 흑백영상으로 바꾸어줌
  {
   LONG width4=binfo->bmiHeader.biWidth;
   width4 = WIDTH4(width4);

   binfo8 = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER)+(sizeof(RGBQUAD)*256));

   binfo8->bmiHeader.biBitCount = 8;        //8비트 흑백
   binfo8->bmiHeader.biPlanes =1;            //비트 플레인수 항상 1
   binfo8->bmiHeader.biXPelsPerMeter =binfo->bmiHeader.biXPelsPerMeter;         //가로 해상도 0
   binfo8->bmiHeader.biYPelsPerMeter =binfo->bmiHeader.biYPelsPerMeter;         //세로 해상도 0
   binfo8->bmiHeader.biHeight = binfo->bmiHeader.biHeight;        //높이
   binfo8->bmiHeader.biWidth = binfo->bmiHeader.biWidth;        //폭
   binfo8->bmiHeader.biCompression = 0;          //압축하지 않은 데이터
   binfo8->bmiHeader.biSizeImage = width4*binfo->bmiHeader.biHeight;   //영상의 크기 지정 //꼭 체크
   binfo8->bmiHeader.biClrUsed = binfo8->bmiHeader.biClrImportant = 256;
   //실제 사용 색상수와 실제 중요 색상수는 256으로 설정
   binfo8->bmiHeader.biSize=sizeof(binfo8->bmiHeader);     //이 구조체의 크기

   for(unsigned int i=0; i<256; i++){
    binfo8->bmiColors[i].rgbRed = binfo8->bmiColors[i].rgbBlue = binfo8->bmiColors[i].rgbGreen = i;
    binfo8->bmiColors[i].rgbReserved =0;
   }
   //흑백으로 영상을 처리한다는 for문이다 1,1,1 2,2,2 이런식으로 RGB가 설정이되면 회색 즉 흑백영상으로 출력이 되게된다.

   Data8bit = (BYTE*)malloc(binfo8->bmiHeader.biSizeImage); //동적할당을 하였다.
   memset(Data8bit,254,binfo8->bmiHeader.biSizeImage); // 초기화하는작업이다.
   
   

   LONG oldheight = binfo->bmiHeader.biHeight;
   LONG oldWidth = WIDTH4(binfo->bmiHeader.biWidth*3);

   LONG count=0;
   for(height=0; height<binfo8->bmiHeader.biHeight; height++){

    for(width=0; width<binfo->bmiHeader.biWidth; width++){
     count= (imageData[(height*oldWidth)+width*3+0]+    
      imageData[(height*oldWidth)+width*3+1]+
      imageData[(height*oldWidth)+width*3+2])/3;    

     Data8bit[(height*width4)+width]=count; //흑백이기에 /3을 하고 count 설정한값을 Data8bit로 넣는다.

    }
   }
   BITMAPFILEHEADER bfh8;  //흑백영상을 위한 파일 헤더를 많듬
   bfh8.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;
   bfh8.bfReserved1=0;
   bfh8.bfReserved2=0;
   bfh8.bfSize  =bfh8.bfOffBits + binfo8->bmiHeader.biSizeImage;
   bfh8.bfType = 0x4d42;

   fopen("8bit.bmp","wb");   //흑백영상을 bmp파일로 저장
   fwrite(&bfh8,sizeof(BITMAPFILEHEADER),1,file);
   fwrite(&(binfo8->bmiHeader),sizeof(BITMAPINFOHEADER),1,file);
   fwrite(&(binfo8->bmiColors),sizeof(RGBQUAD),256,file);
   fwrite(Data8bit,sizeof(BYTE),binfo8->bmiHeader.biSizeImage,file);
   fclose(file);

  }
  return 0;
 case WM_COMMAND:
  return 0;
 case WM_LBUTTONDOWN:{

  width = (unsigned int)binfo->bmiHeader.biWidth;
  height = (unsigned int)binfo->bmiHeader.biHeight;


  Hdc = GetDC(hWnd);

  MoveWindow(hWndMain,200,200,width+binfo8->bmiHeader.biWidth+15,height,true);

  SetDIBitsToDevice(Hdc,0,0,width,height,
   NULL,NULL,NULL,height,imageData,
   binfo,DIB_RGB_COLORS);
  if(Data8bit!=NULL){
   SetDIBitsToDevice(Hdc,width+5,0,binfo8->bmiHeader.biWidth,height,
    NULL,NULL,NULL,height,Data8bit,
    binfo8,DIB_RGB_COLORS);
  }


  ReleaseDC(hWnd,Hdc);
  return 0;}
 case WM_DESTROY:

  free(imageData);
  free(binfo);
  if(Data8bit!=NULL)
   free(Data8bit);

  if(binfo8!=NULL)
   free(binfo8);

  PostQuitMessage(0);
  return 0;
 }
 return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}

 

728x90