|
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-> resent(NULL,NULL,NULL,NULL);
}
下面是读出来的效果:
[img] [/img]
请问,如何让16位位图正常读取并且去除背景???? |
|