OpenGL保存bmp图片(字节对齐与RGB分量转换)

http://blog.sina.com.cn/s/blog_60707c0f0100q9vf.html

现在的OpenGL己经具有GL_BGR_EXT的方式读取像素,默认己经是4字节对齐了,所以下面代码注释掉了处理部分,如果你的OpenGL不支持,GL_BGR_EXT,把注释部分复原即可。

[cpp]  view plain copy print ?
  1. BOOL SaveBMPFromOpenGl(LPCTSTR lpFileName)  
  2. {  
  3.   ASSERT(lpFileName != NULL);  
  4.   GLint viewport[4];  
  5.   glGetIntegerv(GL_VIEWPORT, viewport);  
  6.   CRect rect;  
  7.   GetClientRect(rect);  
  8.   int width = viewport[2];  
  9.   int height = viewport[3];  
  10.    //glPixelStorei(GL_UNPACK_ALIGNMENT, 4);  
  11.   int nAlignWidth = (width*24+31)/32;  
  12.   unsigned char* pdata = new unsigned char[nAlignWidth * height * 4];  
  13.   memset(pdata, 0, nAlignWidth * height * 4);  
  14.   glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pdata);  
  15.   ////由RGB变BGR  
  16.   //for(int i = 0 ; i < width * height * 3 ; i += 3)  
  17.   //{  
  18.   // unsigned char tmpRGB;  
  19.   // tmpRGB     = pdata[i];  
  20.   // pdata[i]   = pdata[i+2];  
  21.   // pdata[i+2] = tmpRGB;  
  22.   //}  
  23.   ////四字节对齐  
  24.   //int nAlignWidth = (width*24+31)/32;  
  25.   //unsigned char *pDataAfterAlign = (unsigned char *) malloc(4 * nAlignWidth * height);  
  26.   //memset(pDataAfterAlign, 0, 4 * nAlignWidth * height);  
  27.   //int nZero = 4*nAlignWidth - 3*width;  
  28.   //for(int j=0; j<height; j++)  
  29.   //{  
  30.   //  for(int i=0; i<width*3; i++)  
  31.   //  {  
  32.   //     pDataAfterAlign[j*(nZero+3*width)+i] = pdata[3*width*j+i];  
  33.   //  }  
  34.   //}  
  35.   BITMAPFILEHEADER Header;  
  36.   BITMAPINFOHEADER HeaderInfo;  
  37.   Header.bfType = 0x4D42;  
  38.   Header.bfReserved1 = 0;  
  39.   Header.bfReserved2 = 0;  
  40.   Header.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)) ;  
  41.   Header.bfSize =(DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nAlignWidth* height * 4);  
  42.   HeaderInfo.biSize = sizeof(BITMAPINFOHEADER);  
  43.   HeaderInfo.biWidth = width;  
  44.   HeaderInfo.biHeight = height;  
  45.   HeaderInfo.biPlanes = 1;  
  46.   HeaderInfo.biBitCount = 24;  
  47.   HeaderInfo.biCompression = 0;  
  48.   HeaderInfo.biSizeImage = 4 * nAlignWidth * height;  
  49.   HeaderInfo.biXPelsPerMeter = 0;  
  50.   HeaderInfo.biYPelsPerMeter = 0;  
  51.   HeaderInfo.biClrUsed = 0;  
  52.   HeaderInfo.biClrImportant = 0;   
  53.   FILE *pfile;  
  54.   if(!(pfile = fopen(lpFileName, "wb+")))  
  55.   {  
  56.     AfxMessageBox("保存图像失败!");  
  57.     return FALSE;  
  58.   }  
  59.   fwrite(&Header, 1, sizeof(BITMAPFILEHEADER), pfile);  
  60.   fwrite(&HeaderInfo, 1, sizeof(BITMAPINFOHEADER), pfile);  
  61.   fwrite(pdata, 1, HeaderInfo.biSizeImage, pfile);  
  62.   fclose(pfile);  
  63.   delete[] pdata;  
  64.   return TRUE;  
  65. }  

O了,主要功能就是一个函数:

void glReadPixels( GLint x, 
GLint y, 
GLsizei width, 
GLsizei height, 
GLenum format, 
GLenum type, 
GLvoid * data);

你可能感兴趣的:(OpenGL保存bmp图片(字节对齐与RGB分量转换))