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 |