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

在使用OpenGL导入3DS文件并显示后,尝试将场景保存为BMP图像,发现图像颜色与显示不符。经讨论,问题在于BMP图像以BGR顺序存储颜色数据,通过交换B和R通道数据后问题得到解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
 }
最后输出了想要的结果!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值