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"));
댓글을 달아 주세요
해당내용은 24비트 색상 bmp파일 저장이긴한데 BITMAPFILEHEADER에서 bfReserved1,2를 0으로 설정안해도 되나요? Default값이 52428이나오네요 bfSize또한 헤더의 크기가 아니라 파일 전체 사이즈를 적어야 하지 않나 싶어서 적어봅니다
2018.05.10 11:19 [ ADDR : EDIT/ DEL : REPLY ]아이고, 창피하네요.
2018.05.21 00:14 신고 [ ADDR : EDIT/ DEL ]10년전에 어리버리 끄적였던 기록이라 더듬어보니 말씀하신게 맞습니다.
말씀하신대로 biSize 는 헤더크기가 아니라 파일크기가 들어가야 하고
bfReserved1,2 는 0으로 초기화 되어야 합니다.
Pixel* rgbTemp = new SPixel[BUFSIZE];
2019.08.20 09:59 신고 [ ADDR : EDIT/ DEL : REPLY ]에스픽셀은 상속해서 쓰는건지
버퍼사이즈는 값이 어디에 선언되었는지 궁금합니다
이 부분에대해서 설명 들을 수 있을까요??
c++개발자는아닌데 급하게 고쳐야하는데 이부분을 모르겠어요 ㅠㅠ