专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > WinCE

使用CreateDIBSection,重复打开多次8兆BMP图片后出现内存不足,请帮忙检查下代码有关问题

发布时间:2010-06-13 22:23:30 文章来源:www.iduyao.cn 采编人员:星星草
使用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了。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: