본문 바로가기

김탱 개발자/C/C++

raw파일 읽는법

출처 : 네이버 지식인

8bit gray scale에서는
1바이트가 하나의 픽셀을 표현합니다.

23 43 23 42 52 45 24 23 23 23 34 34

이런 식으로 하나의 바이트는 하나의 픽셀 명암을 표현하죠.

 

RGB 형태에서는
23 43 23 42 52 45 24 23 23 23 34 34

 

위와 같이 이미지의 한 픽셀이 3바이트를 차지하고 있죠.

red green blue red green blue red green blue ...

 이런 식의 파일 구조를 갖게 됩니다.


(출처 : 'raw파일의 형식을 알고 싶어요...' - 네이버 지식iN)

먼저 raw파일구조를 알야되기 때문에 위에것을 퍼왔습니다...

인제 무엇만 남았나.. 파일을 읽어서 자렇게 되어있는 값을 MFC class들을 이용해서

화면 DC에 출력 하기만 하면 됩니다...

스텝별로 진행 해보면..

 

완벽한 프로그램소스로 하지않고 부분적으로 필요한것만 기술하겠습니다...

RGB형태로 하였기때문에 y값이 *3이 되는것임...

1.먼저 파일을 읽어서 배열에 넣습니다..

#define MAX_X 256

#define MAX_Y 256*3

 

unsigned char in_data[X_MAX][Y_MAX];

in=fopen("filename.raw","rb");

 

int  i,  j;

   for(i=0;i < MAX_X; i++)
      for(j=0;j < MAX_Y; j++)
            in_data[j][i]=fgetc(in);

2. 2차원배열 char in_data 에들어있는 raw파일정보를 화면에 뿌려주기만 하면 되는거겠죠.

raw파일구조는 위에서 설명하였습니다...

 

OnDraw에 보시면 pDC 를 인자로 받지 않습니까 .. 이걸이용해서 화면에 그려줄수있어요

화면에 점을 찍는 함수... SetPixel()을 이용합니다..

점을 찍는 위치는 화면에 위치에 상대적으로 배열의 위치와 결합하여 출력해줍니다..

초기좌표가 x가 100 y가 100 이라면..

 

 int offsetX=100;
 int offsetY=100;
 
 CPoint point;
 unsigned char red,green,blue;
    for(i=0;i < MAX_X; i++)
      for(j=0;j < MAX_Y; j++)
   {
    //시작 위치를 얻어온다
    if((j % 3) == 0)
    {
   point.x = offsetX + j;
   point.y = offsetY + i;
   red = in_data[j][i];
    }
    //green을 얻어온다..
    else if((j % 3) == 1)
    {
   green = in_data[j][i];
    }
    //blue를 얻어오고 최종적으로 그린다
    else if((j % 3) == 2)
    {
   blue = in_data[j][i];
   //점을 직는다..
   pDC->SetPixel(point,RGB(red,green,blue));
    }
   }

이렇게 해주시면 됩니다..