2009년 11월 5일 목요일

HBITMAP을 BMP 파일로 저장하기

void  SaveBitmap(char *szFilename, HBITMAP hBitmap)
{
    // DC를 얻어옴
    HDC hdc = GetDC(NULL);

    // bitmap info 를 얻어옴
    BITMAPINFO bmpInfo;
    ZeroMemory(&bmpInfo, sizeof(BITMAPINFO));
    bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    GetDIBits(hdc,hBitmap,0,0,NULL,&bmpInfo,DIB_RGB_COLORS);
    if(bmpInfo.bmiHeader.biSizeImage<=0)
        bmiHeader.biSizeImage=bmpInfo.bmiHeader.biWidth*abs(bmpInfo.bmiHeader.biHeight)*(bmpInfo.bmiHeader.biBitCount+7)/8;
   
    // 실제 image 내용을 얻어오기
    LPVOID pBuf=NULL;
    if((pBuf = malloc(bmpInfo.bmiHeader.biSizeImage))==NULL)
    {
        MessageBox( NULL, "Unable to Allocate Bitmap Memory", "Error", MB_OK|MB_ICONERROR);
        break;
    }           
    bmpInfo.bmiHeader.biCompression=BI_RGB;
    GetDIBits(hdc,hBitmap,0,bmpInfo.bmiHeader.biHeight,pBuf, &bmpInfo, DIB_RGB_COLORS);      
   
    // bitmap file header 만들기
    BITMAPFILEHEADER bmpFileHeader;
    bmpFileHeader.bfReserved1=0;
    bmpFileHeader.bfReserved2=0;
    bmpFileHeader.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmpInfo.bmiHeader.biSizeImage;
    bmpFileHeader.bfType='MB';
    bmpFileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

    // 파일을 열고 쓰기
    FILE* fp = fopen(szFilename, "wb");
    if(fp ==NULL)
    {
        MessageBox( NULL, "Unable to Create Bitmap File", "Error", MB_OK|MB_ICONERROR);
        break;
    }
    fwrite(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);
    fwrite(&bmpInfo.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);
    fwrite(pBuf,bmpInfo.bmiHeader.biSizeImage,1,fp);

    if(hdc) ReleaseDC(NULL,hdc);
    if(pBuf) free(pBuf);
    if(fp) fclose(fp);
}

댓글 없음:

댓글 쓰기