裁剪位图文件--根据给的目标中心坐标从源图像中裁剪一块区域大小固定的图像,病存储
BOOL CHVDlgSaveDlg::SaveBMPFile(LPCSTR lpFileName, BITMAPINFO *pBmpInfo, BYTE *pImageBuffer)
{
int nLineBytes=1628*3;
BOOL bRVal = TRUE;
DWORD dwBytesRead = 0;
DWORD dwSize = 0;
BITMAPFILEHEADER bfh = {0};
int nTable = 0;
DWORD dwImageSize = 0;
if (pBmpInfo->bmiHeader.biBitCount > 8)
{
nTable = 0;
}
else
{
nTable = 256;
}
dwImageSize = WIDTH_BYTES(460 * pBmpInfo->bmiHeader.biBitCount) * 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;
for (int y=0; y<1628;y++)
{
for (int x=0;x<1236;x++)
{
if((x>=nx-230&&x<=nx+230)&&(y>=ny-180&&y<=ny+180))
{
*frameforcut=*(pImageBuffer+ bfh.bfOffBits+ nLineBytes*y+x*3);
frameforcut++;
*frameforcut=*(pImageBuffer+ bfh.bfOffBits+ nLineBytes*y+x*3+1);
frameforcut++;
*frameforcut=*(pImageBuffer+ bfh.bfOffBits +nLineBytes*y+x*3+2);
frameforcut++;
}
}
}
if(nx>230&&nx<1628-230)
{
frameforcut = frameforcut-460*3*360;//指针移到图像开始的地方
}
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);
}
}
return bRVal;
}