查看: 3066|回复: 7

osg保存jpg图片出现问题

[复制链接]

该用户从未签到

发表于 2010-5-19 10:11:16 | 显示全部楼层 |阅读模式
看如下代码,是重载的相机的PostDrawCallback的核心代码:
virtual void operator()(const osg::Camera &camera) const
{
  const osg::Viewport *pViewport = camera.getViewport();
  osg::ref_ptr<osg::Image> pImage = new osg::Image;
  pImage->readPixels(pViewport->x(), pViewport->y(), pViewport->width(), pViewport->height(), GL_RGBA, GL_UNSIGNED_BYTE);
  osgDB::writeImageFile(*pImage, "d:\\out.bmp");
  osgDB::writeImageFile(*pImage, "d:\\out.jpg");
  const_cast<osg::Camera &>(camera).setPostDrawCallback(NULL);
}

其实就是截屏,将截屏的图片保存到磁盘上。
上面的代码分别保存了bmp和jpg两种格式。bmp文件保存一切正常,jpg保存之后,图像变成乱糟糟、灰蒙蒙的。
大家有什么办法和意见?

该用户从未签到

 楼主| 发表于 2010-5-19 10:15:10 | 显示全部楼层
两张图片分别是保存的bmp和jpg的样子
out1.JPG
out.jpg

该用户从未签到

 楼主| 发表于 2010-5-19 10:28:36 | 显示全部楼层
我怀疑osg本身没有负责对图像进行压缩,它只是简单的把像素数据当作jpg的压缩数据流,直接往文件里面写。

该用户从未签到

发表于 2010-5-19 10:29:18 | 显示全部楼层
保存成BMP格式就好了,JPG格式的写出插件好像并不支持所有的像素格式

该用户从未签到

发表于 2010-5-19 10:53:31 | 显示全部楼层
jpg这样啊~~了解了

该用户从未签到

 楼主| 发表于 2010-5-19 10:54:11 | 显示全部楼层
客户非要jpg,我都劝了好几次了,用bmp保存出来是无损的,若要jpg,就随便拿个图片编辑工具另存一次就可以了。可是这客户非常难沟通~~~

我现在的解决办法是:先存为一个bmp,然后使用readImageFile立即将这个bmp读出来,再写jpg就正确了。随即删除这个bmp文件。

该用户从未签到

 楼主| 发表于 2010-5-19 10:58:08 | 显示全部楼层
我调试过代码,发现使用readImageFile读取刚刚创建出来的bmp文件,它的像素格式成了GL_LUMINANCE。

但是我不能直接使用GL_LUMINANCE格式来读取帧缓存,读取到的是一个怪异的灰度图;
也不能直接调用osg::Image::setPixelFormat,该函数会调用失败,什么都不会做。

该用户从未签到

发表于 2010-5-19 12:32:35 | 显示全部楼层
如果您想一劳永逸地解决这个问题,可以考虑深入osgdb_jpeg的源代码去看看,也许调用jpeg6b库的一些函数就可以正确输出某些像素格式的JPG图片了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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