您的位置:首页 > 运维架构

利用opengl将3ds文件导入场景并显示,然后保存这个场景为bmp格式图像,其结果与显示不同,问题出在哪儿了

2014-12-26 09:25 567 查看
opengl导入的3ds文件显示是这样的



而当我保存这个显示的场景为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;

}


各位大神,有木有能帮助我看一下的~~~万分的感激~

特别感谢zhao4zhong1fly_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;
}
最后输出了想要的结果!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐