HBITMAP 에서 BMP 파일로 추출 ¶
~cpp
//*********************************************************************
// CImageTool::ExportAsBMP() 
// Purpose: [CBitmap에 저장되어있는 이미지를 Bmp파일로 만든다.] 
// Parameters:     
// [type] : 1 픽셀당 Bit 수 
// [*filename] : 만들어질 bmp파일이름 
// [*pDC] : Device Context 
// [hBitmap] : 이미지가 저장되어 있는 CBitmap (HBITMAP으로 변화하여 사용) 
// [nWidth] : 이미지의 넓이 
// [nHeight] : 이미지의 높이 
// Returns:    BOOL 
//*********************************************************************
BOOL CImageTool::ExportAsBMP(int type, char *filename, CDC *pDC, 
        HBITMAP hBitmap, int nWidth, int nHeight) 
{ 
    BYTE *bmp; 
    BITMAPFILEHEADER header; 
    FILE *fp; 
    unsigned int size, palsize; 
    BOOL r = FALSE; 
    if ((bmp=GetBMP(type, nWidth, nHeight, hBitmap, pDC->m_hDC, 
        &size)) == NULL) 
      return FALSE; 
    if (type != 3) palsize = 1<<bit[type]; 
    else palsize = 0; 
    header.bfType = 0x4D42; 
    header.bfSize = size+sizeof(BITMAPFILEHEADER); 
    header.bfReserved1 = header.bfReserved2=0; 
    header.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ 
                    sizeof(RGBQUAD)*palsize; 
    if ((fp=fopen(filename,"wb")) == NULL) 
    { 
    free(bmp); 
    return FALSE; 
    } 
    if (fwrite(&header,sizeof(BITMAPFILEHEADER),1,fp)!=0) 
    if (fwrite(bmp,size,1,fp)!=0) r=TRUE; 
    free(bmp); 
    fclose(fp); 
    return r; 
} 
//*******************************************************************
// *CImageTool::GetBMP() 
// Purpose: [주어진 HBITMAP에서 이미지 정보를 읽어 오는 함수] 
// Parameters:     
// [type] : 1픽셀당 Bit수 
// [w] : 이미지 넓이 
// [h] : 이미지 높이 
// [hBitmap] : 이미지가 저장되어있는 CBtimap 
// [hdc] : Device Context 
// [*size] : File Size (반환되는 값) 
// Returns:    BYTE 
//*******************************************************************
BYTE *CImageTool::GetBMP(int type, int w, int h, HBITMAP hBitmap, 
        HDC hdc, unsigned int *size) 
{ 
    LPBITMAPINFO lpvBits; 
    BYTE *lpbi; 
    int width,palsize; 
    if (type!=3) palsize = 1<<bit[type]; 
    else palsize = 0; 
    width = ((((w*bit[type]+7)/8+3)/4)*4); 
    *size = sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*palsize+width*h; 
    lpvBits = (BITMAPINFO *)malloc(*size); 
    lpbi = (BYTE *)lpvBits+sizeof(BITMAPINFOHEADER) + 
                    sizeof(RGBQUAD)*palsize; 
    lpvBits->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
    lpvBits->bmiHeader.biWidth = w; 
    lpvBits->bmiHeader.biHeight = h; 
    lpvBits->bmiHeader.biPlanes = 1; 
    lpvBits->bmiHeader.biBitCount = bit[type]; 
    lpvBits->bmiHeader.biCompression = BI_RGB; 
    lpvBits->bmiHeader.biSizeImage = width*h; 
    lpvBits->bmiHeader.biXPelsPerMeter = 0; 
    lpvBits->bmiHeader.biYPelsPerMeter = 0; 
    lpvBits->bmiHeader.biClrUsed = 1<<bit[type]; 
    lpvBits->bmiHeader.biClrImportant = 1<<bit[type]; 
    GetDIBits(hdc,hBitmap,0,h,lpbi,lpvBits,DIB_RGB_COLORS); 
    return (BYTE *)lpvBits; 
}
출처:GOSU.NET













