상세 컨텐츠

본문 제목

BMP파일 만들기

청강컴정/시스템프로그래밍

by luckey 2009. 5. 21. 18:54

본문

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

}

관련글 더보기

댓글 영역