查看: 4936|回复: 30

图像截取后是黑色的,

[复制链接]

该用户从未签到

发表于 2009-10-6 12:01:47 | 显示全部楼层 |阅读模式
图像截取后是黑色的,把截图代码单独使用一个工程测试时没问题的,为什么放到另一个工程中就会出现截图后黑色的
    使用0sg2.6开发包+VS2005sp1
    附截图代码:
   #include <osgViewer/Viewer>
   #include <osg/Camera>
#include <osg/Image>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <Windows.h>
class ImageHandler : public osgGA::GUIEventHandler
{
public:
ImageHandler(){};
~ImageHandler(){};
bool handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa )
{
  osgViewer::Viewer* viewer1 =
   dynamic_cast<osgViewer::Viewer*>( &aa );
  if (!viewer1)
   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,1024,768,GL_RGB,GL_UNSIGNED_BYTE);
     image->setFileName("a.bmp");
     osgDB::writeImageFile(*image,"F:\\captureImages\\a.bmp");
    }
    MessageBox(NULL,L"",L"",MB_OK);
   }
  default:
   return false;
  }
}
};

int main()
{
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;
}
viewer.addEventHandler( new ImageHandler );
    return viewer.run();
}

该用户从未签到

发表于 2009-10-6 12:15:15 | 显示全部楼层
即使您的工程偶尔能成功,也不应当直接使用readPixels来截取屏幕,因为此时有可能没有取得OpenGL渲染上下文(HGLRC);一般的做法是放在确信可以得到渲染上下文的环境中执行屏幕截取,例如Camera: PostDrawCallback。

该用户从未签到

 楼主| 发表于 2009-10-6 13:22:19 | 显示全部楼层
是有个设备GC么。。
Array大哥能贴断代码给我么

该用户从未签到

发表于 2009-10-6 17:04:51 | 显示全部楼层
OSG自带的例子就不只一个,此外还有一个ScreenCaptureHandler,您大可参考一下。截屏的实现除了用readPixels之外,还可以使用FBO,并且我个人更推崇后者。

该用户从未签到

 楼主| 发表于 2009-10-6 17:53:36 | 显示全部楼层
FBO是什么?
我刚找了一篇文章  从osg::Camera:rawCallBack派生了一个类  使用Viewer->getCamera()->setPostDrawCallBack(new ****);打点跟踪不到类的operator()(const osg::Camera& camera)方法中
贴代码:
class TestCameraCallBack:public osg::Camera::DrawCallback
{
public:
        TestCameraCallBack(void){};
        ~TestCameraCallBack(void){};
public:
        void operator()(const osg::Camera &camera) const
        {       
                osg::Image *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->allocateImage(width,height,1,GL_RGB,GL_UNSIGNED_BYTE);
                image->readPixels(0,0,width,height,GL_RGB,GL_UNSIGNED_BYTE);
                image->setFileName("a122.bmp");
                osgDB::writeImageFile(*image,"F:\\captureImages\\a122.bmp");
        }

};

viewer.getCamera()->setPostDrawCallback(new TestCameraCallBack());

该用户从未签到

发表于 2009-10-6 18:12:41 | 显示全部楼层
void operator()(const osg::Camera &camera) const是什么?
您当然要继承DrawCallback自己的operator()操作符了,不然如何重构?

该用户从未签到

 楼主| 发表于 2009-10-6 18:40:36 | 显示全部楼层
不明白。
void operator()(const osg::Camera &camera) const
回调的时候不是不断的触发operator嘛

该用户从未签到

发表于 2009-10-6 19:25:00 | 显示全部楼层
要被重构的是:
void operator() (osg::RenderInfo &renderInfo) const
而operator() (const osg::Camera &) const只是为了保持老版本系统的兼容性,我之前也的确没注意您的函数

该用户从未签到

 楼主| 发表于 2009-10-7 10:16:12 | 显示全部楼层
奇怪了  还是打点跟不到。

该用户从未签到

发表于 2009-10-7 11:19:47 | 显示全部楼层
您是不是用addSalve添加的场景相机?那样的话,就加到Slave相机的回调里

该用户从未签到

 楼主| 发表于 2009-10-7 19:09:52 | 显示全部楼层
是呀,用了addSalve。。不明白呀 Array大哥。。。

该用户从未签到

发表于 2009-10-7 22:07:50 | 显示全部楼层
用的哪个相机,就加到哪个相机的回调里,这没有什么不明白的~~

该用户从未签到

 楼主| 发表于 2009-10-9 16:17:21 | 显示全部楼层
array大哥。。我还是不清楚  。。从osgGA::GUIEventHandle派生了一个类做了测试,也从osg::Camera:rawCallBack派生了一个类坐测试。。截图都没有问题。。但是加到工程中Debug下白板,Realase下市黑板   然后 从osgGA::GUIEventHandle做的那个测试 在ReadPiexls后iamge的data竟然是乱码
附测试代码

该用户从未签到

 楼主| 发表于 2009-10-9 16:18:55 | 显示全部楼层

该用户从未签到

发表于 2009-10-9 16:32:35 | 显示全部楼层
您没有粘贴附件。

如果截图已经没有问题了,那么就是其他代码的问题,请仔细检查;还有请使用Camera:rawCallBack的形式;直接GUIEventHandle和readPixels的话,那必然存在隐患~~

该用户从未签到

 楼主| 发表于 2009-10-9 17:03:53 | 显示全部楼层
本帖最后由 gamecamer 于 2009-10-9 17:11 编辑

怎么粘贴附件啊

CaptrueImageExmaple.rar

2.62 KB, 下载次数: 160, 下载积分: 威望 1

从OSGGA::GUIEventHandle派生下来的

TestCameraCallBackCutImage.rar

1.1 MB, 下载次数: 191, 下载积分: 威望 1

从osg::Camera::DrawCallBack派生的

该用户从未签到

 楼主| 发表于 2009-10-9 17:46:50 | 显示全部楼层
从osgGA::GUIEvenetHandle派生下来的那个类
  image->readPixels();
   image中的data为乱码乱码 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯
  为什么data是乱码呢?》

该用户从未签到

发表于 2009-10-9 20:33:31 | 显示全部楼层
因为您根本就没有读出数据来。要先获得HGLRC设备才能执行OpenGL函数!

该用户从未签到

 楼主| 发表于 2009-10-10 14:42:19 | 显示全部楼层
hglrc设备??
不明白
为什么 osg::Camera:rawCallback的operator方法跟踪不进去呢

该用户从未签到

发表于 2009-10-10 15:14:54 | 显示全部楼层
经测试,您的TestCameraCallBack可以跟踪到operator方法,在其中编写截图的代码吧。

该用户从未签到

 楼主| 发表于 2009-10-10 16:47:47 | 显示全部楼层
新建的这个工程是可以的 。。。但是加到工程中就进不去的

该用户从未签到

发表于 2009-10-10 16:55:27 | 显示全部楼层
这样的话,我想您的任务已经很明确了吧,请检查自己工程的代码……

该用户从未签到

 楼主| 发表于 2009-10-10 17:04:41 | 显示全部楼层
恩,在什么情况下image的data出现乱码
在什么情况下不走operator的点
能确定的就是模块间的通信没问题  就是读取不到数据。开发库使用的是您那个mfc+osg框架

该用户从未签到

发表于 2009-10-10 17:06:56 | 显示全部楼层
我没有写过什么MFC+OSG的框架。很多事情需要您自己去理解

该用户从未签到

 楼主| 发表于 2009-10-10 17:08:57 | 显示全部楼层
您帮我调试下从osg::GUIEventHandle派生的那个工程。。为什么截取后是白板。。

该用户从未签到

发表于 2009-10-11 15:09:49 | 显示全部楼层
我也在做截图。
楼上的你可以看看我前几天发的帖子,我的问题是获取窗口分辨率,和加入截图事件后摄像机被自动重新定位。
其他的没有问题,截图很顺利,可能对你有用。

该用户从未签到

 楼主| 发表于 2009-10-11 22:46:27 | 显示全部楼层
终于解决了  。。谢谢各位大哥支持

该用户从未签到

 楼主| 发表于 2009-10-11 22:47:35 | 显示全部楼层
我现在做录制动画。。录制到的camera的path文件里边的属性数据都是一模一样的。。。就当前点的位置和时间。。是因为什么  哪里出的问题?

该用户从未签到

发表于 2009-10-11 23:17:10 | 显示全部楼层
没有更多信息的话,我如何判断您的问题出在哪里

该用户从未签到

发表于 2009-10-12 17:12:24 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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