• 전체강좌

    RGB 데이터를 BMP 파일로 저장하기 - 소스 코드

    twitter facebook

    안녕하세요? 착한이입니다.

    보통 RGB 24bit 나 32bit 를 bmp로 저장할 때 IImage를 이용해도 되지만 직접 파일로 만드는 것이 더 편할 때가 있습니다. 

    아래 코드를 보시면 32bit RGB 데이터를 bmp 파일로 저장하는 코드가 있습니다.  

    코드가 길진 않죠... ^^

     

     int i;   

     int width=320; //이미지의 넓이

     int height=240; //이미지의 높이

     int bpp=32;// 이미지의 Bit per pixel

     char *filename="test.bmp"; // 파일명

     

     BYTE *pData;// RGB 데이터를 저장할 버퍼 포인터

    BITMAPINFOHEADER *info; // 헤더 정보 저장할 포인터

    BITMAPFILEHEADER finfo;

    int imgsize; // RGB 데이터의 크기

    DWORD dw; 
    char *pstr;  

     

    //BITMAPINFOHEADER 포인터 변수에 메모리 할당
     info = (BITMAPINFOHEADER*)GlobalAlloc(GMEM_FIXED,sizeof(BITMAPFILEHEADER)+(1024*sizeof(RGBQUAD)));
     info->biSize = sizeof(BITMAPINFOHEADER); // 크기 저장
     info->biBitCount = bpp; // BPP 저장

     info->biCompression=BI_RGB;
     info->biWidth=width;
     info->biHeight=height;


     imgsize=info->biWidth*info->biHeight*(bpp>>3);

     pData = (unsigned char*)GlobalAlloc(GMEM_FIXED,imgsize); // RGB 데이터가 들어갈 곳..

      //pData 에 RGB 데이터를 복사한다.

     //이미지의 위, 아래를 뒤집어서 넣어 준다.

     

     pstr = (char *)&finfo.bfType;
     pstr[0]='B';
     pstr[1]='M';

     finfo.bfOffBits=sizeof(BITMAPFILEHEADER)+  sizeof(BITMAPINFOHEADER);
     finfo.bfSize=finfo.bfOffBits+imgsize;
     finfo.bfReserved1=0;
     finfo.bfReserved2=0;

     

    FILE *fp=fopen(filename, L"wb"); // 파일 오픈

     int rr=fwrite(&finfo,1,sizeof(BITMAPFILEHEADER),fp); // 헤더 저장
     rr=fwrite(info,1,sizeof(BITMAPINFOHEADER),fp);


     rr=fwrite(pData,1,imgsize,fp); // RGB 데이터 저장
     fclose(fp);
     GlobalFree(info);
     GlobalFree(pData);

     

    //

    예제 코드는 32bit 로 저장했지만 24bit 도 가능합니다. 단, 8bit 와 16bit 의 경우에는 코드를 수정하셔야 할 듯 합니다.

    PC나 모바일에서나 모두 사용할 수 있기 때문에 유용하게 사용하시길 바랍니다.

    그럼 즐거운 개발 하시길 바랍니다.