BOOL  CHVDlgSaveDlg::SaveBMPFile(LPCSTR lpFileName, BYTE *pImageBuffer1)

char * pImageBuffer=new char[1236*1628*3];
memcpy(pImageBuffer,pImageBuffer1,1236*1628*3);
int nLineBytes=1628*3;
BOOL bRVal = TRUE;
DWORD dwBytesRead = 0;
DWORD dwSize = 0;
BITMAPFILEHEADER bfh = {0};
int nTable = 0;
DWORD dwImageSize = 0;
int nxx=nx;
int nyy=ny;
unsigned char * framforcutTemp=frameforcut;
//**************************裁剪以目标形心为中心的460*360大小的图像************
int temint=0;
if((nxx>=230&&nxx<1628-230)&&(nyy>=180&&nyy<1236-180))  
{
for (long y=0; y<1236;y++)
{
for (long  x=0;x<1628;x++)
{

if( ((x>=nxx-230)&&(x<nxx+230))&&((y>=nyy-180)&&(y<nyy+180)))
{

*framforcutTemp=*(pImageBuffer+ nLineBytes*y+x*3);
framforcutTemp++;

*framforcutTemp=*(pImageBuffer+ nLineBytes*y+x*3+1);
framforcutTemp++;

*framforcutTemp=*(pImageBuffer+nLineBytes*y+x*3+2);
framforcutTemp++;

temint++;

}
}
}
// CString temstr;
// temstr.Format("Temint=%d",temint);
// AfxMessageBox(temstr);
//frameforcut = frameforcut-temint*3  ;   //指针移到图像开始的地方

}
else
{
free(pImageBuffer);
return false;
}
//***********************************************************************************************

dwImageSize =  WIDTH_BYTES(460 * 24) * 360;   
if (dwImageSize <= 0) 
{
bRVal = FALSE;
}
else
{
bfh.bfType = (WORD)'M' << 8 | 'B';
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nTable * sizeof(RGBQUAD);
bfh.bfSize = bfh.bfOffBits + dwImageSize;
bfh.bfReserved1 = 0 ;
bfh.bfReserved2 = 0 ;
}//  CString temstrr;
//  temstrr.Format("nxx=%d,nyy=%d",nxx,nyy);
//  AfxMessageBox(temstrr); //******************************************************
    BITMAPINFOHEADER pBmpInfo;
pBmpInfo.biBitCount   = 24;/* 每个像素的位数,如256色,8bit */
pBmpInfo.biClrImportant   = 0 ;
pBmpInfo.biClrUsed        = 0 ;
pBmpInfo.biCompression    = BI_RGB;
pBmpInfo.biPlanes         = 1 ;
pBmpInfo.biSizeImage      = 360*460*3;
pBmpInfo.biXPelsPerMeter  = 0;
pBmpInfo.biYPelsPerMeter  = 0;
pBmpInfo.biHeight         =  360 ;
pBmpInfo.biWidth          =  460 ;
pBmpInfo.biSize           =  40  ;

//***********************************************************

HANDLE hFile = ::CreateFile(lpFileName,
GENERIC_WRITE ,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);

if (hFile == INVALID_HANDLE_VALUE) 
{
bRVal = FALSE;
}
else
{
dwSize = sizeof(BITMAPFILEHEADER);
::WriteFile(hFile, &bfh, dwSize, &dwBytesRead, NULL );

dwSize = sizeof(BITMAPINFOHEADER) + nTable * sizeof(RGBQUAD);
::WriteFile(hFile, &pBmpInfo, dwSize, &dwBytesRead, NULL );

dwSize = dwImageSize;

WriteFile( hFile, frameforcut, dwSize, &dwBytesRead, NULL );


CloseHandle(hFile);

 }
      //  delete [] pImageBuffer ;
// if(frameforcut )
 //delete [] frameforcut  ;
// frameforcut=NULL;
free(frameforcut);
free(pImageBuffer);
return    bRVal         ;
}

解决方案 »

  1.   

    补充:
    经过单步调试后  :
    出现的信息First-chance exception in HVDlgSave.exe: 0xC0000005: Access Violation.光标定位在:*framforcutTemp=*(pImageBuffer+ nLineBytes*y+x*3);找了大牛来,也没有解决,希望大家给点意见,不胜感激!
      

  2.   

    你这个窗口截图的程序吗?http://blog.csdn.net/VisualEleven/archive/2011/02/23/6202796.aspx
      

  3.   

    是碰到矩形的边界了,规定范围在[10,Height-10],[10,width-10]就OK了
      

  4.   

    我这个程序吧,编译没错误,能够短暂的执行,屏蔽掉//  delete [] pImageBuffer ;指针就好了,不飞了,但是内存逐渐暴涨,然后就提示内存不足了。谢谢
      

  5.   

    目标跟踪?EKF.UKF.DDF pf imm?一个都不记得了
      

  6.   

    这个一般就是NEW的小,用的多,delete时就挂了.你不DEL当然内就不够了.看看你new多少就用多少吧.