안녕하세요? 착한이입니다.
보통 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나 모바일에서나 모두 사용할 수 있기 때문에 유용하게 사용하시길 바랍니다.
그럼 즐거운 개발 하시길 바랍니다.