游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1260|回复: 0

16位图去除背景色,颜色不正常.

[复制链接]

11

主题

16

帖子

22

积分

注册会员

Rank: 2

积分
22
发表于 2010-5-5 16:11:00 | 显示全部楼层 |阅读模式
bool TWindow::TCreateTexture(char* file)
{
        HANDLE hFile;
        hFile = CreateFile(file,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        DWORD dwReads;

        BITMAPINFO info;
        BITMAPFILEHEADER bmfh;
        ReadFile(hFile,&bmfh,sizeof(BITMAPFILEHEADER),&dwReads,NULL);
        if(bmfh.bfType != 0x4d42)
        {
                MessageBox(0,"不是位图文件","",0);
                return false;
        }
        ReadFile(hFile,&info.bmiHeader,sizeof(BITMAPINFOHEADER),&dwReads,NULL);
        if(info.bmiHeader.biBitCount != 16)
        {
                MessageBox(0,"!=16","",0);
                return false;
        }
        int m=2;
        int size = info.bmiHeader.biWidth*info.bmiHeader.biHeight*m;                     //位图大小
        char *pbuf =new char[size];                                  //位图信息
        SetFilePointer(hFile,0,NULL,bmfh.bfOffBits);                 //将文件指针指向当前位图信息位置   
        ReadFile(hFile,pbuf,size,&dwReads,NULL);                     //读取位图信息到pbuf;   
    CloseHandle(hFile);
        char *pch;

//    info.bmiColors[0].rgbRed   = (BYTE)0xF800;               //红色掩码
//        info.bmiColors[0].rgbBlue  = (BYTE)0x001F;               //蓝色掩码
//        info.bmiColors[0].rgbGreen = (BYTE)0x07E0;               //绿色掩码
//        info.bmiColors[0].rgbReserved = 0;
       
        if(m_D3D9Device->CreateTexture(info.bmiHeader.biWidth,info.bmiHeader.biHeight,1,0,D3DFMT_A4R4G4B4,D3DPOOL_MANAGED,&m_D3D9Texture,0)==D3D_OK)
        {
                D3DLOCKED_RECT stLockedRect;

                m_D3D9Texture->LockRect(0,&stLockedRect,0,0);
                pch = (char*) stLockedRect.pBits;

                for( int i=info.bmiHeader.biHeight-1;i>=0;i--)
                {
                        for(int j=0;j<info.bmiHeader.biWidth;j++)
                        {
                                pch[1]=pbuf[i*info.bmiHeader.biWidth*m+j*m] ;   
                                pch[2]=pbuf[i*info.bmiHeader.biWidth*m+j*m+1];
                                pch[3]=pbuf[i*info.bmiHeader.biWidth*m+j*m+2] ;
                                pch[4]=0xff;
                                pch+=2;
                        }
                }
                m_D3D9Texture->UnlockRect(0);
                delete pbuf;
        }
        HRESULT result=D3DXCreateSprite(m_D3D9Device,&(m_D3D9Sprite));  //创建精灵对象
        return true;
}
void TWindow::TDraw()             //(120, 120, 150)
{
        this->m_D3D9Device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0);
        m_D3D9Device->BeginScene();

        m_D3D9Sprite->Begin(D3DXSPRITE_ALPHABLEND);
        m_D3D9Sprite->Draw(m_D3D9Texture,NULL, NULL, NULL, 0xffffffff);  //精灵绘制
        m_D3D9Sprite->End();

        m_D3D9Device->EndScene();

        m_D3D9Device-&gtresent(NULL,NULL,NULL,NULL);

}

下面是读出来的效果:

[img][/img]

请问,如何让16位位图正常读取并且去除背景????
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-9 19:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表