Windowsコード集 上のページ

#0002 GBuf_LoadImage BITMAPファイルロード

GBufの生成、開放などの制御を担う関数です。
これらのほとんどは、GBufから情報を引き出すための関数なので、生成と開放のみ詳細の解説を行います。

■ サンプルプログラム

以下は、
1.640x480のバッファを生成する
2.bitmap.bmpをロードする
を行っています。
// 1.
GBUF_STRUCT * gbuf = GBuf_Create(640,480,GF_DEFAULT);

// 2.
GBuf_LoadImage(gbuf,"bitmap.bmp",0);
■ コード

BITMAPファイルのヘッダー"BM"がある場合に、それを読みこみます。
256色と24bit色に対応しており、グラフィックバッファ形式(G_PIXEL)に変換するようになっています。
BOOL WINAPI GBuf_LoadImage(GBUF_STRUCT *dst,LPSTR filename,DWORD flags)
{
    // ファイルの読み込み、bufに格納する
    HANDLE handle = CreateFile_Read(filename);
    if(handle == INVALID_HANDLE_VALUE)return FALSE;
    DWORD size = GetFileSize(handle,NULL),readsize = 0;
    LPBYTE buf = (LPBYTE)Malloc(size);
    ReadFile(handle,buf,size,&readsize,NULL);
    CloseHandle(handle);
    if(size != readsize)return FALSE;

    // BITMAP
    if(memcmp(buf,"BM",2) == 0){
        LPBITMAPFILEHEADER fh = (LPBITMAPFILEHEADER)buf;
        LPBITMAPINFOHEADER ih = (LPBITMAPINFOHEADER)(buf + sizeof(BITMAPFILEHEADER));
        LPRGBQUAD tbl = (LPRGBQUAD)(buf + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)),wtbl;
        LPBYTE bits = (LPBYTE)(buf + fh->bfOffBits),input,winput;
        G_PIXEL *output = GBuf_GetPtr(dst),*woutput = output;
        int x = 0,y = 0;
        int ex = (ih->biWidth  < dst->width ) ? ih->biWidth  : dst->width ;
        int ey = (ih->biHeight < dst->height) ? ih->biHeight : dst->height;
        LONG pitch;
        switch(ih->biBitCount){
        case 8:
            pitch = (LONG)((ih->biWidth + 3) & 0xfffffffc);
            input = winput = bits + (pitch * (ih->biHeight - 1));
            while(y < ey){
                while(x < ex){
                    wtbl = tbl + *winput;
                    woutput->pixel.blue  = wtbl->rgbBlue;
                    woutput->pixel.green = wtbl->rgbGreen;
                    woutput->pixel.red   = wtbl->rgbRed;
                    woutput->pixel.alpha = 0;
                    winput++;
                    woutput++;
                    x++;
                }
                woutput = (output += dst->pitch);
                winput  = (input  -= pitch);
                x = 0;
                y++;
            }
            break;
        case 24:
            pitch = (LONG)((ih->biWidth * 3 + 3) & 0xfffffffc);
            input = winput = bits + (pitch * (ih->biHeight - 1));
            while(y < ey){
                while(x < ex){
                    woutput->pixel.blue  = winput[0];
                    woutput->pixel.green = winput[1];
                    woutput->pixel.red   = winput[2];
                    woutput->pixel.alpha = 0;
                    winput += 3;
                    woutput++;
                    x++;
                }
                woutput = (output += dst->pitch);
                winput  = (input  -= pitch);
                x = 0;
                y++;
            }
            break;
        default:
            // 対応していない形式
            Free(buf);
            return TRUE;
        }

        Free(buf);
        return TRUE;
    }

    Free(buf);
    return FALSE;
}


上のページ