利用opengl将3ds文件导入场景并显示,然后保存这个场景为bmp格式图像,其结果与显示不同,问题出在哪儿了
2014-12-26 09:25
567 查看
opengl导入的3ds文件显示是这样的
而当我保存这个显示的场景为bmp图像时结果却变成了这个样子:
我写的bmp文件头文件还有写入如下,有什么问题么?
各位大神,有木有能帮助我看一下的~~~万分的感激~
特别感谢zhao4zhong1和fly_dragon_fly的指导,之前做opencv保存bmp图像时就有印象bmp图像是以BGR的顺序来存放数据的,感谢两位老师的提醒,问题已经解决:
交换一个B通道和R通道的数据就好了~
而当我保存这个显示的场景为bmp图像时结果却变成了这个样子:
我写的bmp文件头文件还有写入如下,有什么问题么?
void saveBmp(const char* name ,int width,int height, unsigned char* data) { BITMAPFILEHEADER bh; BITMAPINFOHEADER bInfo; //int x, y; bh.bfType =((WORD)('M'<<8)|'B'); bh.bfReserved1 = 0; bh.bfReserved2 = 0; bh.bfOffBits =sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); bh.bfSize =sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+width* height * 3; bInfo.biSize=sizeof(BITMAPINFOHEADER);//说明BITMAPINFOHEADER结构所需的字数 bInfo.biWidth= width;//图像宽度,以像素为单位 bInfo.biHeight=height;//图像高度,以像素为单位 bInfo.biPlanes=1;//为目标设备说明位面数,其中总是被设为1 bInfo.biBitCount=24;//说明比特数/像素的颜色深度,值为0,1,4,8,16,24或32,256灰度级的颜色深度为8,因为2^8=256 bInfo.biCompression=BI_RGB;//说明图像数据压缩类型 bInfo.biSizeImage=width*height*3;//说明图像的大小,一字节为单位, bInfo.biXPelsPerMeter=0;//水平分辨率,可以设为0 bInfo.biYPelsPerMeter=0;//垂直分辨率,可以设为0 bInfo.biClrUsed=0;//说明位图实际使用的彩色表中颜色索引数 bInfo.biClrImportant=0;//说明对图像显示有重要影响的颜色索引数目,为0表示都重要。 FILE *fd; if( !(fd = fopen(name,"wb+")) ) { printf("***BMP load error: file access denied***\n"); exit(0); } fwrite(&bh,1,sizeof(BITMAPFILEHEADER),fd); fwrite(&bInfo,1,sizeof(BITMAPINFOHEADER),fd); fwrite(data,1,width* height * 3,fd); fclose(fd); } void saveSceneImage() { GLint pView[4]; glGetIntegerv(GL_VIEWPORT,pView); GLsizei numComponet = 3; GLsizei bufferSize = pView[2]*pView[3]*sizeof(GLfloat)*numComponet; GLfloat* _data = new GLfloat[bufferSize]; unsigned char* data = new unsigned char[bufferSize]; glReadPixels(pView[0],pView[1],pView[2],pView[3],GL_RGB,GL_FLOAT,_data); for (int i = 0 ; i <bufferSize ; i ++) { { data[i] = _data[i] * 256; } } saveBmp("1.bmp",pView[2],pView[3],data); delete[] data; delete[] _data; }
各位大神,有木有能帮助我看一下的~~~万分的感激~
特别感谢zhao4zhong1和fly_dragon_fly的指导,之前做opencv保存bmp图像时就有印象bmp图像是以BGR的顺序来存放数据的,感谢两位老师的提醒,问题已经解决:
交换一个B通道和R通道的数据就好了~
for(int i=0;i<bufferSize;i += 3) { unsigned char tmpRGB; tmpRGB = _data[i]; _data[i] = _data[i+2]; _data[i+2] = tmpRGB; }
最后输出了想要的结果!
相关文章推荐
- C语言读取txt里面的图像数据字符串换成十六进制然后保存为bmp格式的图像文件
- 利用dos编写能生成EXE文件,并运行该文件,显示结果为:HOW ARE YOU。
- 利用GDI+显示资源文件(Resource)中的JPG图像
- C生成exe文件,在命令行执行,无显示结果的问题
- 图像保存到XML文件和从XML中取出图像显示
- 含有clob字段的dmp文件,不同表空间导入导出问题.
- 关于PhotoShop中保存CMYK格式TIFF文件在GDI+错误地显示颜色的问题解决方法
- 图像保存到XML文件和从XML中取出图像显示
- 郁闷了半天,原来是这个问题:关于C#中关于图片保存到数据库以及将数据库中的图片显示到PictureBox。
- 如何将OPENGL图像保存到BMP文件
- 基于lib3ds和OpenGL的3ds文件的读取与显示
- C# 保存图像文件到SQL SERVER数据库,再读取该文件并显示
- C# 保存图像文件到SQL SERVER数据库,再读取该文件并显示
- 如何将OpenGL中的场景保存为Bitmap位图文件
- 图像保存到XML文件和从XML中取出图像显示
- bmp图像读取显示保存问题
- [转]图像保存到XML文件和从XML中取出图像显示
- 利用永中office解决ubuntu下office文件无法显示音标的问题。
- 假设有10位同学,各有3门课程的成绩。从键盘输入每位同学的学号、姓名和3门课程的成绩,然后把数据保存到磁盘文件,再将磁盘文件中的学生信息读入并显示
- 利用OpenCV读入,显示并保存图像