본문 바로가기
프로그래밍/MFC

BMP 저장

by 완소루피 2020. 11. 12.
728x90
반응형

일반적이 BMP 저장 방법

 

BOOL SaveBMP(LPCTSTR lpszFileName, int nWidth, int nHeight, int nBpp, BYTE* pData)
{
 CString filetype;
 filetype = lpszFileName;
 filetype.MakeUpper();
 if( filetype.Right(4) != _T(".BMP") ) 
  return FALSE;
 CFile file;
 BITMAPFILEHEADER    bmfh;
 // DIB 객체를 포함하고 있지 않으면 FALSE를 반환.
 if( pData == NULL )
  return FALSE;
 // 쓰기 모드로 파일 열기
 if( !file.Open(lpszFileName, CFile::modeCreate | CFile::modeWrite | 
  CFile::shareDenyWrite) )
  return FALSE;
 int nPlaetteNums;
 switch(nBpp)
 {
  case 1:     nPlaetteNums = 2; break;
  case 4:     nPlaetteNums = 16; break;
  case 8:     nPlaetteNums = 256; break;
  default:    nPlaetteNums = 0;
 }
 // 실제 영상 데이터의 크기(바이트 단위)
 DWORD dwSizeImage = nHeight * (DWORD)((nWidth*nBpp/8+3)&~3);
 DWORD nDibSize = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*nPlaetteNums + dwSizeImage;
 // BITMAPFILEHEADER 멤버 변수 설정
 bmfh.bfType      = DIB_HEADER_MARKER; // 항상 "BM"
 bmfh.bfSize   = (DWORD)sizeof(BITMAPFILEHEADER) + nDibSize;
 bmfh.bfReserved1 = 0;  // 항상 0
 bmfh.bfReserved2 = 0;  // 항상 0
 bmfh.bfOffBits  = (DWORD)(sizeof(BITMAPFILEHEADER) 
  + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*nPlaetteNums);
  
 BITMAPINFOHEADER bmi;
 bmi.biSize           = sizeof(BITMAPINFOHEADER);
 bmi.biWidth          = nWidth;
 bmi.biHeight         = nHeight;
 bmi.biPlanes         = 1;
 bmi.biBitCount       = nBpp;
 bmi.biCompression    = BI_RGB;
 bmi.biSizeImage      = dwSizeImage;
 bmi.biXPelsPerMeter  = 0;
 bmi.biYPelsPerMeter  = 0;
 bmi.biClrUsed        = 0;
 bmi.biClrImportant   = 0;
 // BITMAPFILEHEADER 쓰기 
 file.Write((LPSTR)&bmfh, sizeof(bmfh));
 // BITMAPINFOHEADER 쓰기 
 file.Write((LPSTR)&bmi, sizeof(bmi));
 //색상 테이블 쓰기
 if(nBpp==8)
 {
  // 색상 테이블 값을 그레이스케일 형태로 설정한다.
  RGBQUAD lpPal[256];
  //BYTE* lpPal;
  //lpPal = (BYTE*)&bmi;
  //DWORD offDest = sizeof(BITMAPINFOHEADER);
  for( int i = 0 ; i < 256 ; i++ )
  {
   lpPal[i].rgbBlue = (BYTE)i;
   lpPal[i].rgbGreen = (BYTE)i;
   lpPal[i].rgbRed = (BYTE)i;
   lpPal[i].rgbReserved = 0;
  }
  file.Write((LPSTR)&lpPal, sizeof(lpPal));
 }
 // DIB 구조(픽셀 데이터) 쓰기
 file.Write(pData, dwSizeImage);
 // 파일 닫기
 file.Close();
 return TRUE;
}

 

728x90
반응형

'프로그래밍 > MFC' 카테고리의 다른 글

Raw to BMP 설명  (0) 2020.11.12
GDI+ 기반 BMP to JPG  (0) 2020.11.12
Socket Error Code  (0) 2020.11.12
UDP 소켓 통신  (0) 2020.11.12
소켓 통신 Server 부분  (0) 2020.11.04