|
cTexture::cTexture(Core_Graphics *Graphics,WCHAR *Filename,BOOL IsEncryp)
{
long FileLen;
FILE *fp;
if(NULL==(m_Graphics=Graphics))return ;
if((Graphics->GetDeviceCOM())==NULL) return ;
if(Filename==NULL) return ;
fp = _wfopen(Filename,L"rb");
if(fp==NULL)
{
MessageBoxShow(L"打开",Filename,L"失败!");
return;
}
//首先将文件的当前位置移到文件的末尾,
//然后调用函数ftell()获得当前位置相对于文件首的位移,
//该位移值等于文件所含字节数,就是文件长度
fseek(fp, 0, SEEK_END);//把fp指针退回到离文件结尾0字节处
FileLen = ftell(fp);//获取文件长度
fseek(fp, 0, SEEK_SET);//把fp指针移动到离文件开头0字节处
unsigned char* imageArray = new unsigned char[FileLen];
// WCHAR buf[50];
// wsprintf(buf,L"%d",FileLen);
//MessageBox(NULL,buf,L"",MB_OK);
/*
参 数:用于接收数据的地址(指针)(ptr)
单个元素的大小(size) :单位是字节而不是位,例如读取一个整数值就是4
元素个数(nitems)
提供数据的文件指针(stream)
返回值:成功读取的元素个数
*/
fread(imageArray, 1, FileLen, fp);
fclose(fp);
if(IsEncryp)//如果有加密,解密
{
//解密图片
}
else
{
m_PicWidth=imageArray[19]|imageArray[18]<<8|imageArray[17]<<16|imageArray[16]<<24;
m_PicHeight=imageArray[23]|imageArray[22]<<8|imageArray[21]<<16|imageArray[20]<<24;
}
if(FAILED(D3DXCreateTextureFromFileInMemoryEx(
Graphics->GetDeviceCOM(),
imageArray,
FileLen,
m_PicWidth,
m_PicHeight,
1,
0,
D3DFMT_UNKNOWN,
D3DPOOL_MANAGED,
D3DX_FILTER_LINEAR,
D3DX_DEFAULT,
0xFFFE00FF,
NULL,
NULL,
&m_Texture)))
{
MessageBoxShow(L"加载",Filename,L"失败!");
return;
}
delete[] imageArray;
imageArray=NULL;
}
注:我载入的图片(非2次幂大小图片),发现我载入100多M图片竞占用600M内存,
我检查才代码,排除内存泄漏可能。请高人回答一下原因
我载入的图片格式是PNG类型的 |
|