使用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了。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
管道的另一端上无任何进程
我写了一个程序,运行正常。
后来,用上了sqlite数据库,然后编译部署都正常,但在WINCE 6模拟器上不能自动运...
-
Power键点亮屏幕的问题
我在程序里面成队使用了:
PowerPolicyNotify(PPN_UNATTENDEDMODE,TRUE);
PowerPolicyNotify(PPN_UNATTEND...
-
求助一个问题:windowsmobile ipl读分区的问题
ipl通过 BP_ReadData读 ramimage 分区信息 读取的时候发现必须要偏移0xc800才能读正...
-
vs2005+DevEmul_SDK.msi后仍旧没有“armv4”选项
OS:win7
IDE:先前有装vs2010做winForm,后装了vs2005(完全安装)
装完后安装了DevEmu...
-
Win7 64位操作系统如何安装arm9开发板的usb下载驱动啊
按照教程操作,超级终端打开也连上了,但是系统貌似对SECBULK.sys SECBULK.inf...
-
嵌入式开发工具
谁用过 LAZARUS 开发过嵌入式系统 ?
------解决方案--------------------
Lazarus 做 PC 上的程序,做嵌入式可能...
-
请推荐几个wince游戏软件下载的地方
最近开始玩wince,请推荐几个好的地方,可以下载游戏,软件的.多谢拉!
------解决方案--------...
-
FAT32 与单片机
根目录下文件与目录项数从那里得
还有根目录的下一簇从哪得
不是说根目录也是一个文件吗 它的目录项在哪里
---...
-
谁可以推荐一个WinCE下的视频播放器,最好可以播放AVI、RMVB、MP3等格式,谢谢。
如题,
麻烦大家推荐一个WinCE5.0下的视频播放器,
-...
-
WinCE6的BinFS问题,100分求解
1、BinFS能不能做在IDE硬盘上?
2、要支持BinFS,bootloader要做甚?
3、BinFS能不能作为一个普通文件放到...