查看: 3434|回复: 10

问一个关于image的读取和存储的问题

[复制链接]

该用户从未签到

发表于 2010-3-13 15:25:45 | 显示全部楼层 |阅读模式
osg::Image* image=new osg::Image();
image=osgDB::readImageFile("aa.jpg");
unsigned char* imageData=image->data();
image->setImage(120,120,0,GL_RGB,GL_RGB,GL_UNSIGNED_BYTE,imageData,osg::Image::USE_NEW_DELETE);
osgDB::writeImageFile(*image,"newaa.bmp");

编译没有问题,但是调试的时候出现中断,显示:

Unhandled exception at 0x020a1939 in osg1.exe: 0xC0000005: Access violation reading location 0x01d34908.

请问一下image->setImage()方法用的是否正确,其中120是aa.jpg图像的大小;
还有就是问什么会出现错误?

该用户从未签到

发表于 2010-3-14 02:22:15 | 显示全部楼层
  1.        
  2.                osg::Image* image=new osg::Image();
  3.         osg::Image* image1=new osg::Image();
  4.         image=osgDB::readImageFile("aa.jpg");
  5.         unsigned char* imageData=image->data();
  6.         image1->setImage(120,120,1,GL_RGB,GL_RGB,GL_UNSIGNED_BYTE,imageData,osg::Image::USE_NEW_DELETE);
  7.         osgDB::writeImageFile(*image1,"newaa.bmp");

复制代码

该用户从未签到

发表于 2010-3-14 10:29:29 | 显示全部楼层
嗯,怎么自己给自己赋值啊

该用户从未签到

发表于 2010-3-14 23:46:44 | 显示全部楼层
我同样很奇怪这段代码的意义,不知道您打算做什么

正确的使用方法是针对新建对象,首先allocateImage,然后setImage:
  1. image = new osg::Image;
  2. image->allocateImage(s,t,r,...);
  3. image->setImage(s,t,r,...);
复制代码

该用户从未签到

 楼主| 发表于 2010-3-15 09:49:49 | 显示全部楼层
我只是想修改读取的图片的颜色值,现在明白了,用imagedata直接修改就可以了,它指向的内容本身就是图像数据的内容。

该用户从未签到

发表于 2010-4-26 14:20:05 | 显示全部楼层
我现在想生成一个BMP图,如下代码所示:
osg::ref_ptr<osg::Group> root = new osg::Group;
        const int imageWidth = 100;
        const int imageHeight = 100;
        osg::Vec4Array *imageData = new osg::Vec4Array;
        imageData = dealarray();
        osg::Image *image1 = new osg::Image;
        image1->allocateImage(imageWidth,imageHeight,1,GL_RGBA,GL_FLOAT);
        image1->setImage(imageWidth,imageHeight,1,GL_RGBA,GL_RGBA,GL_FLOAT,(unsigned char *)imageData,osg::Image::USE_NEW_DELETE);
        osgDB::writeImageFile(*image1,"SSC_1_2.bmp");
可是执行时出现冲突,其中dealarray()是返回一个Vec4Array,不知道哪里出问题了?

该用户从未签到

发表于 2010-4-26 14:55:02 | 显示全部楼层
注意Vec4Array并不是Vec4*,不可以强制转换为unsigned char*
在setImage时用new unsigned char[]构建数据块,然后您必须自己写代码将数据输入到其中

该用户从未签到

发表于 2010-4-26 20:43:32 | 显示全部楼层
7# array
那一个像素是由几个char组成的呢?我用的是RGBA的形式?谢谢

该用户从未签到

发表于 2010-4-27 08:15:44 | 显示全部楼层
您代码中的数据格式是GL_FLOAT,因此一个像素是4个float类型

该用户从未签到

发表于 2010-4-29 21:02:51 | 显示全部楼层
我的代码如下:
float *dealarray()//返回一个100*100*4的float指针


然后将
unsigned char *imageData ;
imageData = (unsigned char*)dealarray();
        osg::Image *image1 = new osg::Image;
        image1->allocateImage(imageWidth,imageHeight,1,GL_RGBA,GL_FLOAT);
        image1->setImage(imageWidth,imageHeight,1,GL_RGBA,GL_RGBA,GL_FLOAT,imageData,osg::Image::USE_NEW_DELETE);
这样输出的图是错误的,几乎只有一种颜色。因为我的RGB颜色值是设置了不同的值。不知道是哪里出问题了?

该用户从未签到

发表于 2010-4-30 08:35:49 | 显示全部楼层
我不认为您给出的代码存在什么严重的错误,您应该已经把颜色赋予Image对象了。您可以将data()中的内容打印出来检查一下。也许您的像素值设置本身存在一些问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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