본문 바로가기

컴퓨터 과학 & 영상처리 관련/그래픽스

자주쓰는 내용들 개념에 대해

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);


fread 

Reads data from a stream.

size_t fread( 
   void *buffer,
   size_t size,
   size_t count,
   FILE *stream 
);

요거랑 비슷한거로는 fclose()가 있나봄


fread(&hf,sizeof(BITMAPFILEHEADER),1,infile); 하면..BIT머시기 크기만큼 1번 infile에서 읽어서 hf에다 씀

count가 1이 아닐 경우는 아래와 같은 식으로 하겠지

fwrite(OrgImg,sizeof(char),256*256,outfile);











요 파일 헤더파일을 14byte

실제 소스에서 bmp파일이 아닌경우 종료하게 하는 부분이 있음

 

if(hf.bfType != 0x4d42) exit(1);

 

예제...

#include <stdio.h>

int main(void)
{
    unsigned int bt = 0x4d42;
    unsigned short bt1 = 0x4d42;
   
    printf("'B''M' %x%x\n",'B','M');
    printf("int = %x ,%s\n",bt, &bt);
    printf("short = %x ,%s\n",bt1, &bt1);
   
    return 0;
}

결과 

결과로 보건데 낮은 번지부터 읽는듯 42가 'B'인데...
 


영상 헤더정보는 40byte

biBitCount가 8이면 흑백..24면 rgb쯤 되려나

 RGBQUAD *pRGB;
 if(hInfo.biClrUsed!=0) // 팔레트가 있는 경우
 {
  pRGB= new RGBQUAD [hInfo.biClrUsed]; // 팔레트의 크기만큼 메모리를 할당함
  fread(pRGB,sizeof(RGBQUAD),hInfo.biClrUsed,infile); // 팔레트를 파일에서 읽음
 }

 

 


 

팔레트 정보는 1024 byte인가봄

printf("size of RGBQUAD = %d\n",sizeof(RGBQUAD)); //결과 4

printf("size of BYTE = %d\n",sizeof(BYTE)); //결과 1






#define WIDTHBYTES(bits) (( (bits) + 31) / 32 * 4 ) // 영상 가로길이는 4바이트의 배수여야 함 //(영상의 가로사이즈를 비트단위로 넣으면 4의 배수로 만들어줭) //이게 왜 4배가 되야되냐? 지금하드가 ntfs..디스크가 4바이트씩 읽음(블럭인가?) 주소도 데이타 처리도 4바이트씩 하고있음. //영상의 가로사이즈를 4의 배수로 맞추면 영상의 전체 크기도 4의 배수가됨 //256이면 걍 쓰고 ...258이면 260바이트를 써야됨.  


int rwsize = WIDTHBYTES(hInfo.biBitCount * hInfo.biWidth);

 

for(int i = 0; i< hInfo.biHeight;i++)

for(int j = 0; j < hInfo.biWidth; j++)

lpImg[i * rwsize + j] = 255 - lpImg[i * rwsize + j];

 

걍 이미지 밝기 반전하는건데..여기서 이게 왜 필요하냐? 참...예제를 만들어봄

 int rwsize = WIDTHBYTES(8 * 509); 
 int rwsize1 = WIDTHBYTES(8 * 510);
 int rwsize2 = WIDTHBYTES(8 * 511);
 int rwsize3 = WIDTHBYTES(8 * 512);
 int rwsize4 = WIDTHBYTES(8 * 513);
 int rwsize5 = WIDTHBYTES(8 * 514);

 

그래서 이거 하고나면 rwsize는 가로 길이가 나옴...biWidth 해도될걸 굳이 귀찮게..이런 쯧쯧..

이게 반올림이 아니라 내림이라 저런 문제가 있었나? 암튼. 31로해서 올림으로 해서 맞춤

 

 


 

 

int myWidthStep(int n)
{
 return (n * 8 + 31) / 32 * 4;
}


int _tmain(int argc, _TCHAR* argv[])   {
 
 printf("%d\n",myWidthStep(39));
 printf("%d\n",myWidthStep(40));
 printf("%d\n",myWidthStep(41));
 printf("%d\n",myWidthStep(42));
 printf("%d\n",myWidthStep(43));
 printf("%d\n",myWidthStep(44));
 printf("%d\n",myWidthStep(45));


 return 0;

 
   
}

 

40

40

44

44

44

44

48