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

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

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

BOOL SaveBMPFromOpenGl(LPCTSTR lpFileName)
{
  ASSERT(lpFileName != NULL);
  GLint viewport[4];
  glGetIntegerv(GL_VIEWPORT, viewport);
  CRect rect;
  GetClientRect(rect);
  int width = viewport[2];
  int height = viewport[3];
   //glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
  int nAlignWidth = (width*24+31)/32;
  unsigned char* pdata = new unsigned char[nAlignWidth * height * 4];
  memset(pdata, 0, nAlignWidth * height * 4);
  glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pdata);
  由RGB变BGR
  //for(int i = 0 ; i < width * height * 3 ; i += 3)
  //{
  // unsigned char tmpRGB;
  // tmpRGB     = pdata[i];
  // pdata[i]   = pdata[i+2];
  // pdata[i+2] = tmpRGB;
  //}
  四字节对齐
  //int nAlignWidth = (width*24+31)/32;
  //unsigned char *pDataAfterAlign = (unsigned char *) malloc(4 * nAlignWidth * height);
  //memset(pDataAfterAlign, 0, 4 * nAlignWidth * height);
  //int nZero = 4*nAlignWidth - 3*width;
  //for(int j=0; j<height; j++)
  //{
  //  for(int i=0; i<width*3; i++)
  //  {
  //     pDataAfterAlign[j*(nZero+3*width)+i] = pdata[3*width*j+i];
  //  }
  //}
  BITMAPFILEHEADER Header;
  BITMAPINFOHEADER HeaderInfo;
  Header.bfType = 0x4D42;
  Header.bfReserved1 = 0;
  Header.bfReserved2 = 0;
  Header.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)) ;
  Header.bfSize =(DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nAlignWidth* height * 4);
  HeaderInfo.biSize = sizeof(BITMAPINFOHEADER);
  HeaderInfo.biWidth = width;
  HeaderInfo.biHeight = height;
  HeaderInfo.biPlanes = 1;
  HeaderInfo.biBitCount = 24;
  HeaderInfo.biCompression = 0;
  HeaderInfo.biSizeImage = 4 * nAlignWidth * height;
  HeaderInfo.biXPelsPerMeter = 0;
  HeaderInfo.biYPelsPerMeter = 0;
  HeaderInfo.biClrUsed = 0;
  HeaderInfo.biClrImportant = 0; 
  FILE *pfile;
  if(!(pfile = fopen(lpFileName, "wb+")))
  {
    AfxMessageBox("保存图像失败!");
    return FALSE;
  }
  fwrite(&Header, 1, sizeof(BITMAPFILEHEADER), pfile);
  fwrite(&HeaderInfo, 1, sizeof(BITMAPINFOHEADER), pfile);
  fwrite(pdata, 1, HeaderInfo.biSizeImage, pfile);
  fclose(pfile);
  delete[] pdata;
  return TRUE;
}

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值