Windowsコード集 上のページ

#0002 BITMAPファイルで書き出す

BITMAPをファイルに書き出す関数です。
ただしスクリーンモードに依存するようなので、汎用として以外はあまり使えないかもしれません。
//----------------------------------------------------------------------------
// BITMAPのファイル出力
//----------------------------------------------------------------------------
// BOOL SaveBitmapFile(
//   HBITMAP bmp,               // BUTMAPハンドル
//   LPSTR filename             // 出力ファイル名
// );
//
// 関数が成功したときはTRUE,失敗するとFALSEを返す。
//----------------------------------------------------------------------------
BOOL SaveBitmapFile(HBITMAP bmp,LPSTR filename)
{
    // BITMAP情報を取得する
    BITMAP bi;
    ZeroMemory(&bi,sizeof(bi));
    if(GetObject(bmp,sizeof(bi),&bi) == 0)return FALSE;

    // ファイルサイズ計算
    LONG filesize = bi.bmWidthBytes * bi.bmHeight + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    LONG bpp = 0;
    switch(bi.bmBitsPixel){
    case 2:
        filesize += (sizeof(RGBQUAD) * 2);
        bpp = 2;
        break;
    case 4:
        filesize += (sizeof(RGBQUAD) * 16);
        bpp = 16;
        break;
    case 8:
        filesize += (sizeof(RGBQUAD) * 256);
        bpp = 256;
        break;
    }

    // ファイルオープン
    HFILE fp = _lcreat(filename,0);
    if(fp == HFILE_ERROR)return FALSE;

    // BITMAPFILEHEADERヘッダー出力
    BITMAPFILEHEADER fh;
    ZeroMemory(&fh,sizeof(fh));
    memcpy(&fh.bfType,"BM",2);
    fh.bfSize = filesize;
    fh.bfReserved1 = 0;
    fh.bfReserved2 = 0;
    fh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * bpp;
    _lwrite(fp,(LPSTR)&fh,sizeof(fh));

    // BITMAPINFOHEADERヘッダー出力
    LPBITMAPINFO pbi = (LPBITMAPINFO)malloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * bpp);
    ZeroMemory(pbi,sizeof(BITMAPINFOHEADER));
    pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    pbi->bmiHeader.biWidth = bi.bmWidth;
    pbi->bmiHeader.biHeight = bi.bmHeight;
    pbi->bmiHeader.biPlanes = 1;
    pbi->bmiHeader.biBitCount = bi.bmBitsPixel;
    pbi->bmiHeader.biCompression = BI_RGB;
    if(bpp != 0){
        GetDIBColorTable(bmp,0,bpp,pbi->bmiColors);
    }
    _lwrite(fp,(LPSTR)pbi,sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * bpp);

    // 画像データを得る
    LPBYTE bits = (LPBYTE)malloc(bi.bmWidthBytes * bi.bmHeight);
    HDC dc = GetDC(0);
    HDC mdc = CreateCompatibleDC(dc);
    ReleaseDC(0,dc);
    HBITMAP old = SelectObject(mdc,bmp);
    int l = GetDIBits(mdc,bmp,0,bi.bmHeight,bits,pbi,DIB_RGB_COLORS);
    _lwrite(fp,(LPSTR)bits,bi.bmWidthBytes * bi.bmHeight);

    // 作業領域を開放
    free(pbi);
    free(bits);
    _lclose(fp);

    return TRUE;
}

//----------------------------------------------------------------------
// 以下は、BITMAP画像で保存するサンプルです。
//----------------------------------------------------------------------

HBITMAP bmp = BITMAPハンドル;
SaveBitmapFile(bmp,"bitmap.bmp");   // BITMAPハンドルとファイル名を渡します




上のページ