查看: 1603|回复: 8

请教一下关于Image对象内部数据的问题

[复制链接]

该用户从未签到

发表于 2011-3-10 23:30:08 | 显示全部楼层 |阅读模式
现在我需要在程序中利用已有的数据,创建一个Image对象,那么按照常规方法我先对于image对象进行了分配内存、设置内部格式,之后获取Image对象的data指针,以此将现有的数据进行赋值,但这里有个问题实在想不通:

例如,我设置的格式是GL_RGBA与GL_FLOAT,现在想输入100个像素的颜色值,那么应该是按r,g,b,a的顺序依次写入到data数据组中吧?那么结果的图片文件打开也应该是有100个赋过颜色的像素吧?但目前我得到的结果是,结果的图片中得到了400个赋值过的像素,这是为什么呢?请各位老师指教,谢谢!

该用户从未签到

发表于 2011-3-11 08:52:57 | 显示全部楼层
能否用代码的方式来表述您的实现过程,否则我很难从文字中搜索您脑内的想法(用Robert的话说,这个时候您应该调用osgAnyMindInYourBrain的DoAsYouWish类来实现您的功能

该用户从未签到

 楼主| 发表于 2011-3-11 12:00:49 | 显示全部楼层
恩。。是这样的一个过程

this->_Img=new osg::Image;
this->_Img->allocateImage(200,200,1,GL_RGBA,GL_FLOAT);

int row=0,column=0;

for(;row<100;row++)
{
  float* pixel_data = (float*)this->_Img->data(0, row);
  for(column=0;column<100;column++)
  {
   (*pixel_data)=0.6f;    //r
   pixel_data++;
   (*pixel_data)=0.6f;    //g
   pixel_data++;
   (*pixel_data)=0.6f;    //b
   pixel_data++;
   (*pixel_data)=1.0f;    //a
   pixel_data++;
  }
}

osgDB::writeImageFile(*(this->_Img),"..//img.bmp");

就是想试验一下这100个像素是否被正确指定为(0.6f,0.6f,0.6f,1.0f)这个颜色,但之后打开这个img.bmp,发现里面是有400个像素都被写入了这种颜色,这是为什么呢?也就是说这样来操作data数组的方式有没有什么问题呢?请array老师指教,谢谢!

该用户从未签到

发表于 2011-3-11 12:53:10 | 显示全部楼层
您分配的就是200x200的图像大小啊,您的写入也是用循环的方式,至少写入了100x100个像素,这与您的设想似乎有不小的出入

该用户从未签到

 楼主| 发表于 2011-3-11 14:18:11 | 显示全部楼层
恩。。。感谢array老师的回答,有一个问题是:GL_RGBA这种格式的一个像素不是应该对应rgba这4个分量么?那么使用data这数组指针如何分别逐个对所有像素的每个分量进行赋值呢?

该用户从未签到

发表于 2011-3-11 15:30:39 | 显示全部楼层
  1. osg::Image* _Img=new osg::Image;
  2.         _Img->allocateImage(100,100,1,GL_RGBA,GL_UNSIGNED_BYTE);

  3.         int row=0,column=0;

  4.         for(;row<100;row++)
  5.         {
  6.                 unsigned char* pixel_data = (unsigned char*)_Img->data(0, row);
  7.                 for(column=0;column<100;column++)
  8.                 {
  9.                         (*pixel_data)=0x99;    //r
  10.                         pixel_data++;
  11.                         (*pixel_data)=0x99;    //g
  12.                         pixel_data++;
  13.                         (*pixel_data)=0x99;    //b
  14.                         pixel_data++;
  15.                         (*pixel_data)=0xFF;    //a
  16.                         pixel_data++;
  17.                 }
  18.         }

  19.         osgDB::writeImageFile(*(_Img),"img.bmp");
复制代码
很想有这个啊:
osgAnyMindInYourBrain的DoAsYouWish类

该用户从未签到

 楼主| 发表于 2011-3-11 16:08:18 | 显示全部楼层
回复 6# aya_daxiang


   谢谢您的回答,这里因为我需要置入浮点值,所以必须要用GL_FLOAT的格式,这种情况如何处理呢?谢谢

该用户从未签到

发表于 2011-3-11 17:08:21 | 显示全部楼层
您的赋值方式本身我倒没觉得有什么问题

该用户从未签到

发表于 2011-3-11 17:11:13 | 显示全部楼层
不好意思,我也不大清楚.如果精度要求不高的话,自己转换一下吧,比如0.6f就大概是0x99。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表