使用CreateDIBSection,重复打开多次8兆BMP图片后出现内存不足,请帮忙检查下代码问题?
CDib::CDib()
{
m_pBits = NULL;
m_lpBMI = NULL;
m_pPalette = NULL;
MemDC=NULL;
hOldbmp=NULL;
hBitmap=NULL;
}
CDib::~CDib()
{
Free();
}
void CDib::Free()
{
if(hOldbmp)
{
SelectObject(MemDC,hOldbmp);
}
if (hBitmap)
{
DeleteObject(hBitmap) ;
hBitmap=NULL;
}
if (MemDC)
{
DeleteDC(MemDC) ;
MemDC=NULL;
}
if (m_lpBMI)
{
delete[] m_lpBMI;
m_lpBMI = NULL;
}
if (m_pPalette)
{
m_pPalette->DeleteObject();
delete m_pPalette;
m_pPalette = NULL;
}
}
DWORD CDib::CreateDib1bits(int aWidth,int aHeight)//创建一个DIB文件
{
DWORD Size;
Free();
m_BMFH.bfReserved1=0;
m_BMFH.bfReserved2=0;
m_BMFH.bfOffBits=sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) *2;
m_BMFH.bfSize=sizeof(BITMAPFILEHEADER);//整个文件大小 后面会赋值
m_BMFH.bfType=DIB_HEADER_MARKER;
m_lpBMI=new BITMAPINFO[m_BMFH.bfOffBits-sizeof(BITMAPFILEHEADER)];
if (m_lpBMI == 0)
return 0;
// 设置信息头中的信息
m_lpBMI->bmiHeader.biSize= sizeof(BITMAPINFOHEADER);
m_lpBMI->bmiHeader.biWidth= aWidth;
m_lpBMI->bmiHeader.biHeight= aHeight;
m_lpBMI->bmiHeader.biPlanes= 1;
m_lpBMI->bmiHeader.biBitCount=1;
m_lpBMI->bmiHeader.biCompression =BI_RGB;
m_lpBMI->bmiHeader.biSizeImage= BytesPerLine()*aHeight;
m_lpBMI->bmiHeader.biXPelsPerMeter = 0;
m_lpBMI->bmiHeader.biYPelsPerMeter = 0;
m_lpBMI->bmiHeader.biClrUsed=2;
m_lpBMI->bmiHeader.biClrImportant=0;
m_lpBMI->bmiColors[0].rgbRed=255;
m_lpBMI->bmiColors[0].rgbGreen=255;
m_lpBMI->bmiColors[0].rgbBlue=255;
m_lpBMI->bmiColors[0].rgbReserved= 0;
m_lpBMI->bmiColors[1].rgbRed=0;
m_lpBMI->bmiColors[1].rgbGreen=0;
m_lpBMI->bmiColors[1].rgbBlue=0;
m_lpBMI->bmiColors[1].rgbReserved= 0;
// 计算图象数据内存的大小
DWORD BitsSize=ComputeMetrics();
CreatePalette();
Size=sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) *2+BitsSize;
m_BMFH.bfSize=Size;
MemDC=::CreateCompatibleDC(NULL);
hBitmap=::CreateDIBSection(MemDC,m_lpBMI,DIB_RGB_COLORS,(VOID**)&m_pBits,NULL,0);
if(hBitmap!=0)
{
hOldbmp=(HBITMAP)SelectObject(MemDC,hBitmap);
}
else
return 0;
return Size;
}
下面是打开一个位图
void CEditCardDlg::OnBnClickedButtonOpenfile()
{
if(m_DIB)
{
delete m_DIB;
m_DIB=NULL;
}
m_DIB=new CDib;
if(m_DIB->CreateDib1bits(pCard->Width,pCard->Height)!=0)//创建新的空DIB
{
int datasz =(pCard->Width+ 7)/ 8 *pCard->Height;//要读入的文件的总字节数
pCard->Getdata(m_DIB->m_pBits,0,datasz);//从文件读入数据到CreateDIBSection开辟的内存空间
}
else
{
//建立空DIB失败
}
}
以上代码是主要的开辟空间读入数据 根据nbcool的指导我改的代码 现在是出现了8兆文件多次打开内存不足,这个跟WINCE申请大内存空间有没有什么关系,还是我代码的问题?
[解决办法]
CreateFileForMapping只是名字看起来怪,其实和其他内存API用法一样的,你找找例子就行了。如果你不会的话,不如先用HeapCreate,HeapAlloc分配大内存试试看效果。减少分配次数是解决你这个问题的关键。
[解决办法]
如果要用上一次的内存,
那在new后,就不要再次new了。