Windowsコード集 上のページ

#0001 BITMAPファイルを読む

閲覧者さんからのリクエストです。
LoadBitmapのファイルアクセス版で、BITMAPデータをファイルから読み込みBITMAPを生成する事ができます。
//----------------------------------------------------------------------------
// BITMAPファイルを読む
//----------------------------------------------------------------------------
// HBITMAP LoadBitmapFile(
//   LPSTR filename,            // ロードするファイルパス
//   LPBITMAPINFO bmpinfo       // BITMAPINFO構造体を受け取るポインタ(必要無いときはNULL)
// );
//
// 関数が成功したときロードした画像のBITMAPハンドルを返す。
// 失敗したときは、NULLを返す。
//----------------------------------------------------------------------------
HBITMAP LoadBitmapFile(LPSTR filename,LPBITMAPINFO bmpinfo)
{
    // ファイル読み込み
    HFILE fp = _lopen(filename,OF_READ);
    if(fp == HFILE_ERROR)return NULL;
    LONG size = _llseek(fp,0,FILE_END);
    LPBYTE buf = (LPBYTE)malloc(size);
    if(buf == NULL){
        _lclose(fp);
        return NULL;
    }
    _llseek(fp,0,FILE_BEGIN);
    _lread(fp,buf,size);
    _lclose(fp);

    // BMPヘッダーかどうかチェック
    if(memcmp(buf,"BM",2) != 0){
        free(buf);
        return NULL;
    }

    // BITMAP情報を格納する
    // bmpinfoには、sizeof(BITMAPFILEHEADER)+sizeof(RGBQUAD)*256バイト以上の
    // 領域を確保しておく必要があります。
    if(bmpinfo != NULL)memcpy(bmpinfo,buf + sizeof(BITMAPFILEHEADER),sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);

    // BITMAP作成
    LPBITMAPFILEHEADER fh = (LPBITMAPFILEHEADER)buf;
    LPBITMAPINFOHEADER ih = (LPBITMAPINFOHEADER)(buf + sizeof(BITMAPFILEHEADER));
    LPBITMAPINFO bi = (LPBITMAPINFO)(buf + sizeof(BITMAPFILEHEADER));
    LPBYTE img = buf + fh->bfOffBits;
    HDC dc = GetDC(0);
    HBITMAP hb = CreateDIBitmap(dc,ih,CBM_INIT,img,bi,DIB_RGB_COLORS);
    ReleaseDC(0,dc);
    free(buf);
    return hb;
}


//----------------------------------------------------------------------
// 以下は、与えられたウィンドゥhwnd にBITMAP画像を貼り付けます。
//----------------------------------------------------------------------

// 読み込み準備(BITMAPINFO構造体を確保)
LPBITMAPINFO bmpinfo = (LPBITMAPINFO)malloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256);

// BITMAP読み込み
HBITMAP bmp = LoadBitmapFile("bitmap.bmp",NULL);

// 貼り付け準備
HDC dc = GetDC(hwnd);
HDC memdc = CreateCompatibleDC(dc);
SelectObject(memdc,bmp);

// 貼り付け
BitBlt(dc,0,0,bmpinfo->bmiHeader.biWidth,bmpinfo->bmiHeader.biHeight,memdc,0,0,SRCCOPY);

// 後始末
ReleaseDC(hwnd,dc);
DeleteDC(memdc);
DeleteObject(bmp);
free(bmpinfo);



上のページ