OpenGL保存bmp图片(字节对齐与RGB分量转换)
来源:互联网 发布:手机淘宝人工客服电话 编辑:程序博客网 时间:2024/05/16 10:30
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);
0 0
- OpenGL保存bmp图片(字节对齐与RGB分量转换)
- OpenGL保存bmp图片(字节对齐与RGB分量转换)
- RGB数据保存为BMP图片
- BCB实现BMP图片的RGB分解,BMP与JPG格式的相互转换
- 把OpenGL场景保存成bmp图片
- rgb保存成bmp
- BMP字节对齐
- bmp字节对齐公式
- 24位RGB数据保存为BMP图片
- 24位RGB数据保存为BMP图片
- 24位RGB数据保存为BMP图片
- OpenGL:将绘制场景保存为bmp图片
- 关于bmp 4字节对齐
- 24位BMP图像RGB与YUV转换
- BMP文件读写以及RGB与YUV转换
- 隐式转换与字节对齐
- 获取图片的RGB分量
- BMP文件学习笔记(二):将BMP格式RGB真彩色图片转换成灰度图片
- IRR与NPV
- 用Java编程获得本机和服务器IP地址
- android 修改默认时间为24小时格式
- LeetCode Word Search
- Scripts:查询数据库中的无效对象dba_invalid_objects.sql
- OpenGL保存bmp图片(字节对齐与RGB分量转换)
- 去除windows的桌面快捷方式
- chrome如何添加一个extension的api
- 简单易用的瀑布流效果
- 才肯定句年得考虑
- Ubuntu mount error(12): Cannot allocate memory 的解决方法
- 算法设计分析: 埃及分数问题
- Quartz recovery 及misfired机制的源码分析
- mysql复合索引、普通索引总结