查看: 1409|回复: 6

请教关于抓图的一个问题

[复制链接]

该用户从未签到

发表于 2011-1-20 09:43:54 | 显示全部楼层 |阅读模式
程序是在MFC下做的,根据论坛看到的帖子,写下了如下代码
class LeftCameraCallBack:public osg::Camera:rawCallback
{
   public:
      LeftCameraCallBack(void){};
      ~LeftCameraCallBack(void){};
   public:
   void operator()(osg::RenderInfo &renderInfo)const
   {
      osg::Image *image = new osg::Image();
      int width = 1680,height=1050;//这俩个值,一会解释
      image->allocateImage(width/4,height/4,1,GL_RGB,GL_UNSIGNED_BYTE);
      image->readPixels(0,0,width/4,height/4,GL_RGB,GL_UNSIGNED_BYTE);
      image->setFileName("LeftCamera.bmp");
      osgDB::writeImageFile(*image,"LeftCamera.bmp");
    }
};
views[2]->getCamera()->setPostDrawCallback(new LeftCameraCallBack());
width = 1680,height=1050;这两个值是经由调试测出的compositeViewer窗口的大小,而readPixels(0,0,width/4,height/4,GL_RGB,GL_UNSIGNED_BYTE)当中
(0,0,width/4,height/4)是该相机的视口。问题就在这里,根据上诉操作我认为截取的图片大小应该就是相机视口的大小啊。可是实际的图片大小,大于相机视口将近2倍。
希望各位前辈能帮忙解答下,不胜感激!

该用户从未签到

发表于 2011-1-20 12:34:29 | 显示全部楼层
您没又给出足够的条件以供判断,您可以检查您的相机视口的设置是否正确,或者,最简单的判断方法:看一看输出的图片大小是否是(1680/4, 1050/4)即可

该用户从未签到

 楼主| 发表于 2011-1-20 14:30:07 | 显示全部楼层
2# array

Hi,array!
很抱歉没有提供足够条件。
相机视口是这样设置的
osg::ref_ptr<osg::GraphicsContext::Traits>traits = new osg::GraphicsContext::Traits;

traits->width = GetSystemMetrics(SM_CXSCREEN);
traits->height= GetSystemMetrics(SM_CYSCREEN);
... ...

osg::GraphicsContext* gc = osg::GraphicsContext::createGraphicsContext(traits.get());

viewers[2]->getCamera()->setViewport(new osg::Viewport(0,0,traits->width/4,traits->height));

width=1680,height=1050就是根据相机的视口宽和高调试运行得出的结果。
实在是不明白为什么capture的图片和相机视口的大小不一致。

该用户从未签到

发表于 2011-1-21 08:19:09 | 显示全部楼层
  1. viewers[2]->getCamera()->setViewport(new osg::Viewport(0,0,traits->width/4,traits->height));
复制代码
您当真是这样设置的(还是笔误)?此外您是否打印过traits->width和height的值来确定它们到底是多少?

要弄明白一件事情很简单,就是把自己做的每一步都怀疑一遍就可以了,从不要认为某个地方是“想当然”正确的。多数情况下,到最后您都会发现是自己犯了一个极其简单的错误~~

该用户从未签到

 楼主| 发表于 2011-1-21 10:46:04 | 显示全部楼层
4# array

很抱歉,height忘记除4了
  • viewers[2]->getCamera()->setViewport(new osg::Viewport(0,0,traits->width/4,traits->height/4));(这样设置有问题啊?)
  • traits->width和height的值是经过调试运行测试出来的,1680和1050

该用户从未签到

 楼主| 发表于 2011-1-21 10:51:28 | 显示全部楼层
4# array
最开始的这个views[2]也是笔误
views[2]->getCamera()->setPostDrawCallback(new LeftCameraCallBack());

应该是
viewers[2]->getCamera()->setPostDrawCallback(new LeftCameraCallBack());

由于工作电脑不能上网,手打上去的代码,真是不好意思

该用户从未签到

 楼主| 发表于 2011-2-17 16:05:06 | 显示全部楼层
问题已经解决,
// 计算图象数据格式GL_RGB或GL_RGBA,即是否带alpha通道
                // 也可以理解成像素是24bits或32bits
                if (gc->getTraits()->alpha)
                    pixelFormat = GL_RGBA;
                else
                    pixelFormat = GL_RGB;
利用pixelFormat变量替代allocateImage和readPixel函数中的GL_RGB参数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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