Windowsコード集 上のページ

#0004 GBuf_LoadAlpha アルファデータロード

24bitビットマップファイルをアルファデータとみなし、アルファ値を読みこみます。
画像データはグレイスケールで表現し、黒くなるほど透明度が大きくなるようにする必要があります。

■ サンプルプログラム

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

// 2.
GBuf_LoadImage(gbuf,"bitmap.bmp",0);

// 3.
GBuf_LoadAlpha(gbuf,"alpha.bmp",0);
■ コード

GBuf_LoadImage関数と基本的には同じです。
1色の輝度をそのまま、G_PIXELのalphaに代入しているだけです。

BOOL WINAPI GBuf_LoadAlpha(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));
        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 = (LONG)((ih->biWidth * 3 + 3) & 0xfffffffc);

        if(ih->biBitCount != 24){
            Free(buf);
            return FALSE;
        }

        input = winput = bits + (pitch * (ih->biHeight - 1));
        while(y < ey){
            while(x < ex){
                woutput->pixel.alpha = winput[0];
                winput += 3;
                woutput++;
                x++;
            }
            woutput = (output += dst->pitch);
            winput  = (input  -= pitch);
            x = 0;
            y++;
        }
        Free(buf);

        dst->flags |= GF_ALPHA;

        return TRUE;
    }

    Free(buf);
    return FALSE;
}


上のページ