// DDB를 DIB로 바꾸어 파일로 저장한다.
// hbit에는 그림정보를 가진 핸들을
// Path에는 생성할 파일이름과 경로를 넣으면 됩니다.
void DDB2DIB(HBITMAP hbit,char *Path)
{
BITMAPFILEHEADER fh;
BITMAPINFOHEADER ih;
BITMAP bit;
BITMAPINFO *pih;
int PalSize;
HANDLE hFile;
DWORD dwWritten,Size;
HDC hdc;
// 전체 화면에 대한 DC를 구한다.
hdc=GetDC(NULL);
// 비트맵 정보로부터 정보 구조체를 초기화한다.
GetObject(hbit,sizeof(BITMAP),&bit);
ih.biSize=sizeof(BITMAPINFOHEADER);
ih.biWidth=bit.bmWidth;
ih.biHeight=bit.bmHeight;
ih.biPlanes=1;
ih.biBitCount=bit.bmPlanes*bit.bmBitsPixel;
if (ih.biBitCount > 8) ih.biBitCount=24;
ih.biCompression=BI_RGB;
ih.biSizeImage=0;
ih.biXPelsPerMeter=0;
ih.biYPelsPerMeter=0;
ih.biClrUsed=0;
ih.biClrImportant=0;
// 정보 구조체 + 팔레트 크기만큼 메모리를 할당하고 이 버퍼에
// 정보 구조체를 복사한다.
PalSize=(ih.biBitCount==24 ? 0:1 << ih.biBitCount)*sizeof(RGBQUAD);
pih=(BITMAPINFO *)malloc(ih.biSize+PalSize);
pih->bmiHeader=ih;
// 비트맵의 크기를 구한다.
GetDIBits(hdc,hbit,0,bit.bmHeight,NULL,pih,DIB_RGB_COLORS);
ih=pih->bmiHeader;
// 비트맵 크기가 구해지지 않았을 경우 수작업으로 직접 계산한다.
if (ih.biSizeImage == 0) {
ih.biSizeImage=((((ih.biWidth*ih.biBitCount)+31) & ~31) >> 3) * ih.biHeight;
}
// 래스터 데이터를 읽기위해 메모를 재할당한다.
Size=ih.biSize+PalSize+ih.biSizeImage;
pih=(BITMAPINFO *)realloc(pih,Size);
// 래스터 데이터를 읽어들인다.
GetDIBits(hdc,hbit,0,bit.bmHeight,(PBYTE)pih+ih.biSize+PalSize,pih,DIB_RGB_COLORS);
// 파일 헤더를 만든다.
fh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+PalSize;
fh.bfReserved1=0;
fh.bfReserved2=0;
fh.bfSize=Size+sizeof(BITMAPFILEHEADER);
fh.bfType=0x4d42;
// 파일을 생성하고 파일 헤더와 정보 구조체, 팔레트, 래스터 데이터를 출력한다.
hFile=CreateFile(Path,GENERIC_WRITE,0,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(hFile,&fh,sizeof(fh),&dwWritten,NULL);
WriteFile(hFile,pih,Size,&dwWritten,NULL);
ReleaseDC(NULL,hdc);
CloseHandle(hFile);
}
댓글 영역