作 者:周强 2009.05.02
/**************************************************************************
* 函数名称:SaveToBmpFile
* 函数功能:把客户区内由两点所确定的矩形内图像保存为bmp图像
***************************************************************************
* 入口参数:CPoint point1 矩形左上角点
* CPoint point2 矩形右下角点
* char *filename 保存后文件名
* CDC* pDC 设备内容对象指针
* 出口参数:std::vector<CtlKeyPoint> &vec_point 提取的极值点的坐标
* 返 回 值:成功,返回true ; 失败返回false。
***************************************************************************
* 备 注:使用方法举例:
* CPoint p1(0,0);
* CPoint p2(1200,800);
* if(SaveToBmpFile(p1,p2,"图像.bmp",pDC)==true)
* {
* AfxMessageBox("保存成功!");
* }
*作 者:周强 2009.05.02
***************************************************************************/
BOOL CMyView::SaveToBmpFile(CPoint point1, CPoint point2, char *filename,CDC* pDC)// 当宽度不是4的倍数时自动添加成4的倍数
{
int width, height;//保存数据的宽高
width = point2.x-point1.x;
height = point2.y-point1.y;
BYTE *pImg = new BYTE[3*width*height];//从屏幕提取要保存的图像数据
for (int index1=0;index1<height;index1++)
{
for (int index2=0;index2<3*width;index2+=3)
{
COLORREF coler = pDC->GetPixel(index2/3,index1);
pImg[index1*width*3+index2+0]=GetBValue(coler);
pImg[index1*width*3+index2+1]=GetGValue(coler);
pImg[index1*width*3+index2+2]=GetRValue(coler);
}
}
FILE *BinFile;
BITMAPFILEHEADER FileHeader;
BITMAPINFOHEADER BmpHeader;
bool Suc=true;
int i,extend;
BYTE *pCur;
// Open File
if((BinFile=fopen(filename,"w+b"))==NULL) { return false; }
// Fill the FileHeader
FileHeader.bfType= ((WORD) ('M' << 8) | 'B');
FileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
FileHeader.bfSize=FileHeader.bfOffBits+width*height*3L ;
FileHeader.bfReserved1=0;
FileHeader.bfReserved2=0;
if (fwrite((void *)&FileHeader,1,sizeof(BITMAPFILEHEADER),BinFile)!=sizeof(BITMAPFILEHEADER)) Suc=false;
// Fill the ImgHeader
BmpHeader.biSize = 40;
BmpHeader.biWidth = width;
BmpHeader.biHeight = height;
BmpHeader.biPlanes = 1 ;
BmpHeader.biBitCount = 24 ;
BmpHeader.biCompression = 0 ;
BmpHeader.biSizeImage = 0 ;
BmpHeader.biXPelsPerMeter = 0;
BmpHeader.biYPelsPerMeter = 0;
BmpHeader.biClrUsed = 0;
BmpHeader.biClrImportant = 0;
if (fwrite((void *)&BmpHeader,1,sizeof(BITMAPINFOHEADER),BinFile)!=sizeof(BITMAPINFOHEADER)) Suc=false;
// write image data
extend=(width+3)/4*4-width;
if (extend==0)
{
for(pCur=pImg+(height-1)*3*width;pCur>=pImg;pCur-=3*width)
{
if (fwrite((void *)pCur,1,width*3,BinFile)!=(unsigned int)(3*width)) Suc=false; // 真实的数据
}
}
else
{
for(pCur=pImg+(height-1)*3*width;pCur>=pImg;pCur-=3*width)
{
if (fwrite((void *)pCur,1,width*3,BinFile)!=(unsigned int)(3*width)) Suc=false; // 真实的数据
for(i=0;i<extend;i++) // 扩充的数据
{
if (fwrite((void *)(pCur+3*(width-1)+0),1,1,BinFile)!=1) Suc=false;
if (fwrite((void *)(pCur+3*(width-1)+1),1,1,BinFile)!=1) Suc=false;
if (fwrite((void *)(pCur+3*(width-1)+2),1,1,BinFile)!=1) Suc=false;
}
}
}
// return;
fclose(BinFile);
delete []pImg;
return Suc;
}