BITMAPFILEHEADER bmFileHeader;
 BITMAPINFOHEADER bmInfoHeader;

 // BMP 헤더
 bmFileHeader.bfSize  = sizeof(BITMAPFILEHEADER);
 bmFileHeader.bfType  = 0x4D42;
 bmFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
 
 bmInfoHeader.biSize    = sizeof(BITMAPINFOHEADER);
 bmInfoHeader.biWidth   = 320; // 너비
 bmInfoHeader.biHeight   = 240; // 높이
 bmInfoHeader.biPlanes   = 1;
 bmInfoHeader.biBitCount   = 24; // 색상 비트
 bmInfoHeader.biCompression = 0;
 bmInfoHeader.biSizeImage = bmInfoHeader.biWidth * bmInfoHeader.biHeight * (bmInfoHeader.biBitCount/8);

 bmInfoHeader.biXPelsPerMeter = 0;
 bmInfoHeader.biYPelsPerMeter = 0;
 bmInfoHeader.biClrUsed = 0;
 bmInfoHeader.biClrImportant = 0;

 // BMP는 아래에서 위로 저장되는 형식이기 때문에 순서대로 저장하면 뒤집히므로 파일로 저장할 데이터를 뒤집기
 SPixel* rgbTemp = new SPixel[BUFSIZE]; // 파일저장할 데이터를 보관할 임시공간
 for(int i=0; i<BUFSIZE; i++) {
  rgbTemp[i].r = g_rgb[BUFSIZE-1-i].r;
  rgbTemp[i].g = g_rgb[BUFSIZE-1-i].g;
  rgbTemp[i].b = g_rgb[BUFSIZE-1-i].b;
 }

 // 파일로 저장
 CFile file;
 file.Open(_T("파일명"), CFile::modeNoTruncate | CFile::modeCreate | CFile::modeReadWrite );
 file.Write(&bmFileHeader, sizeof(BITMAPFILEHEADER));
 file.Write(&bmInfoHeader, sizeof(BITMAPINFOHEADER));
 file.Write(rgbTemp, bmInfoHeader.biSizeImage);
 file.Close();
 
 delete rgbTemp;

 AfxMessageBox(strFilename + _T("\nwas saved"));

Posted by freezn
TAG ,

댓글을 달아 주세요

  1. ㅇㅇ

    해당내용은 24비트 색상 bmp파일 저장이긴한데 BITMAPFILEHEADER에서 bfReserved1,2를 0으로 설정안해도 되나요? Default값이 52428이나오네요 bfSize또한 헤더의 크기가 아니라 파일 전체 사이즈를 적어야 하지 않나 싶어서 적어봅니다

    2018.05.10 11:19 [ ADDR : EDIT/ DEL : REPLY ]
    • 아이고, 창피하네요.
      10년전에 어리버리 끄적였던 기록이라 더듬어보니 말씀하신게 맞습니다.

      말씀하신대로 biSize 는 헤더크기가 아니라 파일크기가 들어가야 하고
      bfReserved1,2 는 0으로 초기화 되어야 합니다.

      2018.05.21 00:14 신고 [ ADDR : EDIT/ DEL ]
  2. Pixel* rgbTemp = new SPixel[BUFSIZE];

    에스픽셀은 상속해서 쓰는건지
    버퍼사이즈는 값이 어디에 선언되었는지 궁금합니다

    이 부분에대해서 설명 들을 수 있을까요??
    c++개발자는아닌데 급하게 고쳐야하는데 이부분을 모르겠어요 ㅠㅠ

    2019.08.20 09:59 신고 [ ADDR : EDIT/ DEL : REPLY ]