void saveSceneImage(int x,int y,int width, int height, int SaveNum)
{
//glGetIntegerv(GL_VIEWPORT,ViewPort);
int ColorChannel = 4; // 位图文件通道数,RGB // !!!原来为3,在全屏时会出问题
int bufferSize = width*height*sizeof(GLubyte)*ColorChannel;
char * ImgData = new char[bufferSize]; // (!!!!!!!!!bufferSize要再大一点,否则在全屏的时候会出现内存溢出问题)
// OpenGL 相关
glPixelStorei(GL_UNPACK_ALIGNMENT,4); // 4字节对齐
glReadPixels(x,y,width,height,GL_BGR_EXT,GL_UNSIGNED_BYTE,ImgData); //从图像缓存里读取一块数据到内存
//ColorReverseChar(ImgData,width,height);
BITMAPFILEHEADER hdr;
BITMAPINFOHEADER infoHdr;
// 我们只需要关心位图的尺寸,其他值默认就好了
infoHdr.biSize = sizeof(BITMAPINFOHEADER);
infoHdr.biWidth =width;
infoHdr.biHeight = height;
infoHdr.biPlanes = 1;
infoHdr.biBitCount = 24;
infoHdr.biCompression = 0;
infoHdr.biSizeImage =width*height*3;
infoHdr.biXPelsPerMeter = 0;
infoHdr.biYPelsPerMeter = 0;
infoHdr.biClrUsed = 0;
infoHdr.biClrImportant = 0;
hdr.bfType = 0x4D42;
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = 54;
hdr.bfSize =(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+width* height * 3);
char ge=0;
char shi=0;
char pic[]="F:\\snap00.bmp";
ge=SaveNum%10;
shi=SaveNum/10;
pic[7]=shi+'0';
pic[8]=ge+'0';
ofstream destfile(pic,ios::trunc);
destfile.close();
destfile.open(pic,ios::binary | ios::app);// app模式,依次写入BITMAPFILEHEADER、BITMAPINFOHEADER和图像数据
destfile.write((char*)&hdr,sizeof(BITMAPFILEHEADER));
//destfile.seekp(sizeof(BITMAPFILEHEADER));
destfile.write((char*)&infoHdr,sizeof(BITMAPINFOHEADER));
//destfile.seekp(sizeof(BITMAPINFOHEADER));
destfile.write((char*)ImgData,width* height * 3);
delete[] ImgData;
}
窗口模式下没有问题,但是在全屏模式截图的时候,会出现CRT detected that the application wrote to memory after end of heap buffer错误,见下图:
错误弹窗提示错误原因是:所写的内存地址,超出了事先分配的内存地址空间;
此时,试着将buffersize 改成2倍大小,程序全屏截图操作正常,又试着将通道数改为4(是不是跟字节对齐有关?不太清楚),程序全屏截图操作正常。
显然,多申请了,不会造成这种错误,但是浪费了空间,那么这里问题到底出在哪里??
网上说有一种快速检测内错泄漏的方法:
只有一行代码: _ASSERTE( _CrtCheckMemory( ) );
但是我不会用= =
自己试了下,也不需要自己写这样的代码,出现内存泄露的时候VS就告诉你了。
就像下面这样:
#include <iostream>
using namespace std;
void main()
{
int* heap= new int[10];
for (int i=0;i<12;i++) // 明显超出了申请空间!
{
heap[i]=9;
}
delete [] heap;
}