三月 22, 2010

GetPixel截屏

Written by

作     者:周强 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;
}

Category : .NetC#MFCVC++Window$

Tags :

发表评论

电子邮件地址不会被公开。

Proudly powered by WordPress and Sweet Tech Theme