第27节 实例-相机显示的内容抓取保存成图片

本节需求

经常的,我们需要将相机渲染的内容传给其它的机器或者保存成图片。甚至需要将相机显示的内容进行录制,制作成mp4。其实制作成mp4也是用的图片,将每一帧的图片存下来,使用相关库制作成mp4就可以。

具体实现

其实将相机的内容抓取到图片只需要一句话:其中_t2d是一个osg::Image

camera->attach(osg::Camera::COLOR_BUFFER, _t2d);

此时,相机在渲染时,就可以实时的将渲染内容rtt到image当中。

本节还写了个事件处理,当点击p键的时候,保存图片到a.png:

    virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
    {
        //点击p键
        if ((ea.getEventType() == ea.KEYDOWN)&&((ea.getKey() == 'P')|| (ea.getKey() == 'p')))
        {
            osgDB::writeImageFile(*_t2d, "a.png");
        }

        return false;
    }

主要的代码就上面这些了。

本节资源

本文集包括本节所有资源包括模型代码都在此下载,按节的序号有文件或文件夹,具体到本节是27.cpp:

注意: 务必使用浏览器打开:
【击此打开网盘资源链接】

所有代码

#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgGA/GUIEventHandler>
#include <osg/Texture2D>
#include <osgDB/WriteFile>

osg::ref_ptr<osg::Image> _t2d = new osg::Image;


class MyEventHandler : public osgGA::GUIEventHandler
{
public:
    MyEventHandler() 
    {
    }

    virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
    {
        //点击p键
        if ((ea.getEventType() == ea.KEYDOWN)&&((ea.getKey() == 'P')|| (ea.getKey() == 'p')))
        {
            osgDB::writeImageFile(*_t2d, "a.png");
        }

        return false;
    }
};


int main(int argc, char** argv) 
{
    osgViewer::Viewer viewer;

    viewer.setSceneData(osgDB::readNodeFile("cow.osg"));
    viewer.addEventHandler(new MyEventHandler());

    //设置rtt
    viewer.getCamera()->attach(osg::Camera::COLOR_BUFFER, _t2d);
    //

    viewer.run();
    return 0;
}

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片