osg抓图、截图、保存图片
#include <osgViewer/Viewer>
#include <osgViewer/ViewerBase>
#include <osgViewer/GraphicsWindow>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osg/Camera>
#include <osg/Image>
#include <osg/BufferObject>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgUtil/Optimizer>
#include <iostream>
#include <osgGA/GUIEventHandler>
#include <osgGA/TrackballManipulator>
#include <osg/RenderInfo>
#include <OpenThreads/Mutex>
#include <OpenThreads/Thread>
#include <OpenThreads/ScopedLock>
//osg::ref_ptr<osg::Image> image_c = new osg::Image();
struct CaptureCallback :public osg::Camera::DrawCallback
{
CaptureCallback()
{
std::cout << "=----0---=" << std::endl;
}
CaptureCallback(osg::ref_ptr<osg::Image> image)
{
image_ = image;
std::cout << "=-------=" << std::endl;
}
~CaptureCallback() {}
virtual void operator()(const osg::Camera &camera) const
{
//得到窗口系统接口
//osg::ref_ptr<osg::GraphicsContext::WindowingSystemInterface> wsi = osg::GraphicsContext::getWindowingSystemInterface();
unsigned int width = 800, height = 500;
//得到分辨率
//wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
//分配一个image
image_->allocateImage(width, height, 1, GL_RGB, GL_UNSIGNED_BYTE);
//读取像素信息抓图
image_->readPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE);
}
//virtual void operator()(osg::RenderInfo& renderInfo) const
//{
// //读取像素信息抓图
// OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
// auto& camera = *renderInfo.getCurrentCamera();
// auto traits = camera.getGraphicsContext()->getTraits();
// glReadBuffer(traits->doubleBuffer ? GL_BACK : GL_FRONT);
// _image->readPixels(pos[0], pos[1], size[0], size[1], _image->getPixelFormat(), _image->getDataType());
//}
//osg::Vec2i pos;
//osg::Vec2i size;
//osg::observer_ptr<osg::Image> _image;
//mutable OpenThreads::Mutex _mutex;
osg::ref_ptr<osg::Image> getOsgImage()
{
return image_;
}
private:
osg::ref_ptr<osg::Image> image_ = new osg::Image();
};
//抓图事件处理器
class ImageHandler :public osgGA::GUIEventHandler
{
public:
ImageHandler()
{
_screenCaptureSequence = 0;
}
~ImageHandler()
{
}
bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
osg::ref_ptr<osgViewer::Viewer> viewer = dynamic_cast<osgViewer::Viewer *>(&aa);
//std::cout << "======1======" << std::endl;
if (viewer == NULL)
{
return false;
}
std::cout << "======2======" << ea.getEventType() << std::endl;
if (ea.getEventType() == 16)
{
char filename[128];
sprintf(filename, "ScreenShot%4d.jpg", _screenCaptureSequence);
std::cout << filename << std::endl;
_screenCaptureSequence++;
osgDB::writeImageFile(*(captureCallbackObj->getOsgImage()), filename);
}
return false;
}
void setCaptureCallback(CaptureCallback* captureCallbackParam)
{
this->captureCallbackObj = captureCallbackParam;
}
private:
//定义一个静态变量
int _screenCaptureSequence;
CaptureCallback* captureCallbackObj = nullptr;
};
int main()
{
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("L:\\BIM\\robot.osg");
osg::ref_ptr<osg::Group> root = new osg::Group();
root->addChild(node.get());
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
osgUtil::Optimizer optimizer;
optimizer.optimize(root.get());
//osg::Vec2i pos(400,250);
//osg::Vec2i size(800,500);
//osg::observer_ptr<osg::Image> _image = new osg::Image();
////mutable OpenThreads::Mutex _mutex;
//osg::ref_ptr<CaptureCallback> cb = new CaptureCallback();
//cb->pos = pos;
//cb->size = size;
//cb->_image = _image;
//viewer->getCamera()->setFinalDrawCallback(cb);
//auto viewer2= dynamic_cast<osgViewer::ViewerBase*>(viewer->getCamera()->getView());
//auto oldModel = viewer2->getThreadingModel();
//viewer2->setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
//viewer2->renderingTraversals();
//viewer2->setThreadingModel(oldModel);
//viewer->getCamera()->setFinalDrawCallback(nullptr);
CaptureCallback* captureCallbackObj = new CaptureCallback();
ImageHandler* imageHandlerObj = new ImageHandler();
imageHandlerObj->setCaptureCallback(captureCallbackObj);
viewer->getCamera()->setPostDrawCallback(captureCallbackObj);
viewer->addEventHandler(imageHandlerObj);
viewer->setSceneData(root.get());
viewer->setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
viewer->setUpViewInWindow(200, 200, 800, 500, 0);
viewer->realize();
viewer->run();
return 1;
}