19,464
社区成员
发帖
与我相关
我的任务
分享
alpha这部分,比较麻烦的.想要就加我,试试.
//创建页面并将图片数据复制到页面中
bool LoadBmpTexture24Bit (char *name,LPDIRECT3DTEXTURE9* ppTexture,int &picW,int &picH)
{
FILE * fp;
if (!(fp=fopen (name,"rb")))
{
char buff[100];
sprintf(buff,"no open N:%s ",name); //skelsp
MessageBox(SAVE_HWND, buff, "error tex", MB_OK);
return 0;
}
BITMAPFILEHEADER bmfh;
fread(&bmfh, sizeof(BITMAPFILEHEADER),1,fp);
if (bmfh.bfType!=0x4d42)//0x4d42指这个文件类型为 bmp 类型
{
char buff[100];
sprintf(buff,"0x4d42 N:%s ",name); //skelsp
MessageBox(SAVE_HWND, buff, "error tex", MB_OK);
return 0;
}
BITMAPINFOHEADER bmih;
fread(&bmih, sizeof(BITMAPINFOHEADER), 1,fp);
if (bmih.biCompression||bmih.biBitCount!=24)
{
char buff[100];
sprintf(buff,"!=24 N:%s ",name); //skelsp
MessageBox(SAVE_HWND, buff, "error tex", MB_OK);
return 0;
}
//创建页面
picW=bmih.biWidth;
picH=bmih.biHeight;
fseek(fp,bmfh.bfOffBits,0);
UCHAR *bmpdata=(UCHAR *)malloc(bmih.biWidth*bmih.biHeight*3);//分配暂存文件数据空间
if (!bmpdata)
{
char buff[100];
sprintf(buff,"!bmpdata N:%s ",name); //skelsp
MessageBox(SAVE_HWND, buff, "error tex", MB_OK);
return 0;
}
fread(bmpdata,bmih.biWidth*bmih.biHeight*3,1,fp);//将数据放入暂存文件数据空间中(读取色值)
fclose(fp);
bool res=0;
if (m_pd3dDevice->CreateTexture (bmih.biWidth,bmih.biHeight,
1,0,D3DFMT_A8R8G8B8 ,
D3DPOOL_MANAGED,ppTexture,0)==D3D_OK)//创建纹理页面
{
res=1;
D3DLOCKED_RECT stLockedRect;
(*ppTexture)->LockRect( 0, &stLockedRect, 0, 0 );
UCHAR *pch=(UCHAR *)stLockedRect.pBits;
for (int i=bmih.biHeight-1;i>=0;i--)
{
for (int j=0;j<bmih.biWidth;j++)
{
// if(bmpdata[i*bmih.biWidth*3+j*3+0]!=0 &&
// bmpdata[i*bmih.biWidth*3+j*3+1]!=0 &&
// bmpdata[i*bmih.biWidth*3+j*3+2]!=0)
// {
pch[0]=bmpdata[i*bmih.biWidth*3+j*3+0];
pch[1]=bmpdata[i*bmih.biWidth*3+j*3+1];
pch[2]=bmpdata[i*bmih.biWidth*3+j*3+2];
pch[3]=255;//全显(alpha)
// }
pch+=4;
}
}
(*ppTexture)->UnlockRect(0);
}
free( bmpdata);
return res;
}