查看: 1972|回复: 10

基于osg 2.8.2 抓图程序,有点问题 请各位指教

[复制链接]

该用户从未签到

发表于 2010-1-26 17:34:52 | 显示全部楼层 |阅读模式
呵呵 是在flysky发的例子基础上改造了一下下

#include <osgViewer/Viewer>
#include <osg/Camera>
#include <osg/Image>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
class ImageHandler : public osgGA::GUIEventHandler
{
public:
ImageHandler(osg::Image* image):_img(image){};
~ImageHandler(){};
bool handle( const osgGA::GUIEventAdapter& ea,
  osgGA::GUIActionAdapter& aa )
{
  osgViewer::Viewer* viewer =
   dynamic_cast<osgViewer::Viewer*>( &aa );
  if (!viewer)
   return false;
  switch(ea.getEventType())
  {
  case(osgGA::GUIEventAdapter::KEYDOWN):
   {
    if(ea.getKey() == 'c')
    {
     //osg::ref_ptr<osg::Image> image = new osg::Image;
     //image->readPixels(0,0,1280,1024,GL_RGB,GL_UNSIGNED_BYTE);
     //image->setFileName("a.bmp");
     osgDB::writeImageFile(*_img,"e:\\a.png");   
     _img->dirty();
    }
   }
  default:
   return false;
  }
}
private:
osg::Image* _img;
};

class ImageDrawCallback :public osg::Camera:rawCallback
{
public:
ImageDrawCallback(osg::Image* image):
   _image(image)
{
}
~ImageDrawCallback(){}
virtual void operator () (const osg::Camera&) const
{
  //osg::ref_ptr<osg::Image> image = new osg::Image;
  //osg::GraphicsContext::WindowingSystemInterface *wsi = osg::GraphicsContext::getWindowingSystemInterface();
  //unsigned int width,height;
  //wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width,height);
  _image->readPixels( 0, 0, 1024, 768, GL_RGB, GL_UNSIGNED_BYTE);
  //osgDB::writeImageFile( *_image, "e:\\b.png");
  _image->dirty();
}
private:
osg::Image* _image;
};
int
main( int, char ** )
{
osgViewer::Viewer viewer;
viewer.setSceneData( osgDB::readNodeFile( "cow.osg" ) );
if (!viewer.getSceneData())
{
  osg::notify( osg::FATAL ) << "Unable to load data file. Exiting." << std::endl;
  return 1;
}
osg::ref_ptr<osg::Image> image = new osg::Image;
image->allocateImage(1024,768,1,GL_RGB,GL_UNSIGNED_BYTE);
viewer.getCamera()->setPostDrawCallback(new ImageDrawCallback(image));
viewer.addEventHandler( new ImageHandler(image) );
return viewer.run();
}


不过在退出的时候有错误,请哪位帮忙看一下啊

该用户从未签到

发表于 2010-1-26 22:19:58 | 显示全部楼层
本帖最后由 acmiyou 于 2010-1-26 22:26 编辑

在drawcallback 和handle中
osg::Image* _image;
修改成 osg::ref_ptr<osg::Image>  _image 防止引用计数在尚未结束就就被清零。使得image中的_data 内存已经被释放。我调试了一下的结果.

该用户从未签到

发表于 2010-1-26 22:22:02 | 显示全部楼层
osg截图的例子已经有好几个了,osgautocapture,osgscreencapture,以及ScreenCaptureHandler,您都不妨参考一下。您的程序中dirty()的频繁使用我个人觉得没有必要,除此之外倒是没看出更多问题

该用户从未签到

 楼主| 发表于 2010-1-27 08:57:32 | 显示全部楼层
多谢

该用户从未签到

 楼主| 发表于 2010-1-27 09:19:06 | 显示全部楼层
请问我在动画运动的过程中抓的图片 边缘会有很大一块灰色的 不知道是什么原因啊 我想把效果图贴上来 可是不知道怎么贴,还请各位帮忙

该用户从未签到

发表于 2010-1-27 12:30:26 | 显示全部楼层
可能是您自己分配的尺寸不对,或者别的一些原因,不过仅凭这些信息我个人也无法深入去分析了

该用户从未签到

 楼主| 发表于 2010-1-27 15:08:26 | 显示全部楼层
  1. class ImageDrawCallback :public osg::Camera::DrawCallback
  2. {
  3. public:
  4.         ImageDrawCallback(/*osg::Image* image*/):
  5.           saveView(true)
  6.           {
  7.           }
  8.           ~ImageDrawCallback(){}
  9.           virtual void operator () (const osg::Camera&)const
  10.           {                   
  11.                   SYSTEMTIME t;
  12.                   GetLocalTime(&t);
  13.                   _bstr_t szMin1,szSec1,szMiliSec1,str;
  14.                   szMin1=_bstr_t(long(t.wMinute));
  15.                   szSec1=_bstr_t(long(t.wSecond));
  16.                   szMiliSec1=_bstr_t(long(t.wMilliseconds));
  17.                   str = "image_" + szMin1 + "_" + szSec1 + "_" + szMiliSec1 + ".png";
  18.                   char* filename = (char*)str;

  19.                   int width = 600;
  20.                   int height = 480;
  21.                   if(saveView)
  22.                   {
  23.                           osg::ref_ptr<osg::Image> _image = new osg::Image;
  24.                           saveView = false;
  25.                           _image->allocateImage(width,height,1,GL_RGB,GL_UNSIGNED_BYTE);
  26.                           _image->readPixels(0,0,width,height,GL_RGB,GL_UNSIGNED_BYTE);
  27.                           bool flag1=osgDB::writeImageFile( *_image, filename );
  28.                   }
  29.           }
  30. private:
  31.         bool saveView;
  32.         //osg::ref_ptr<osg::Image> _image;
  33. };
复制代码
拜托帮忙看一下啊 编译提示:error C2166: 左值指定 const 对象  saveView的值修改不了

该用户从未签到

 楼主| 发表于 2010-1-27 15:10:17 | 显示全部楼层
我想控制抓图的过程一次一张,用flag值来控制,可是如果函数定义的后面不加const,运行的时候根本都不执行啊 怎么回事呢

该用户从未签到

 楼主| 发表于 2010-1-27 15:23:30 | 显示全部楼层
哪位大虾帮忙指点一下啊

该用户从未签到

发表于 2010-1-27 15:45:53 | 显示全部楼层
如果您想强行在const函数中改变成员变量的值,请设置该变量为mutable,即声明:
mutable bool saveView;
这是C++的基本语法

该用户从未签到

 楼主| 发表于 2010-1-27 16:12:21 | 显示全部楼层
10# array

太谢谢啦,搞定
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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