HBITMAP을 비트맵파일로 저장하기

C, C++ 2013.02.12 11:48

void HBITMAP2BMP(HBITMAP hbit,char *Path)

{

    BITMAPFILEHEADER fh;

    BITMAPINFOHEADER ih;

    BITMAP bit;

    BITMAPINFO *pih;

    int PalSize;

    HANDLE hFile;

    DWORD dwWritten,Size;

    HDC hdc;


    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);

}


사용법 :

저장할 HBITMAP을 만들어놓고,

HBITMAP2BMP( HBITMAP, "c:\\a.bmp" );

설정

트랙백

댓글