查看: 3265|回复: 6

如何高精度抓屏

[复制链接]

该用户从未签到

发表于 2008-9-23 18:06:46 | 显示全部楼层 |阅读模式
想要抓屏得到的图像尺寸是窗口的几倍,图像质量不能降低,该怎么做呢?
readPixels抓图是对应哪个窗口说的?

[ 本帖最后由 sky206 于 2008-9-23 18:14 编辑 ]

该用户从未签到

发表于 2008-9-23 19:17:02 | 显示全部楼层
使用pbuffer~~~~~~~~

该用户从未签到

 楼主| 发表于 2008-9-23 20:56:55 | 显示全部楼层
原帖由 FlySky 于 2008-9-23 19:17 发表
使用pbuffer~~~~~~~~

详细说一下好吗?

该用户从未签到

发表于 2008-9-23 22:15:14 | 显示全部楼层
将您的图片Image对象使用attach函数关联给摄像机。
还有正确设置摄像机的setRenderTargetImplementation

不过我不是很清楚pbuffer能不能做到截取高于当前屏幕分辨率的图像。理论上应该是再创建一个分辨率足够高的pbuffer窗口,并且把其中渲染的数据烘焙到纹理图片上来实现,也许这样可以。

该用户从未签到

 楼主| 发表于 2008-9-24 14:11:51 | 显示全部楼层
在控制台程序能成功,但是到MFC程序里就出意外了,调试成功,抓图时出错,访问冲突,把        width=vp->width();
        height=vp->height();
两行注释掉就能运行。
mfc里的抓图函数就是从控制台里复制过去的,到底是哪里出错了呢?

该用户从未签到

发表于 2008-9-24 15:52:32 | 显示全部楼层
原帖由 sky206 于 2008-9-24 14:11 发表
在控制台程序能成功,但是到MFC程序里就出意外了,调试成功,抓图时出错,访问冲突,把        width=vp->width();
        height=vp->height();
两行注释掉就能运行。
mfc里的抓图函数就是从控制台里复制过去的,到底是哪里出 ...


这么少信息的话~~抱歉我也猜不出来~~

该用户从未签到

 楼主| 发表于 2008-9-24 20:41:58 | 显示全部楼层
已经能够实现了,代码如下
运行时可以看到抓屏时屏幕一直在变,如果在应用程序里面,这样不太容易接受。有没有可能抓屏时不让它变化呢?即使变,能不能达到让人感觉不到的地步呢?

#include <osgViewer/Viewer>
#include <osgDB/WriteFile>
#include <osgDB/ReadFile>
#include <osgGA/TrackballManipulator>

#include <iostream>
bool  snap(osg::ref_ptr<osgViewer::Viewer> v,int scale=1)
{

        int x=0,y=0;
        int width = v->getCamera()->getViewport()->width();
        int height=v->getCamera()->getViewport()->height();
        double left,right,bottom,top,zNear,zFar;
        double newLeft,newRight,newBottom,newTop;
        v->getCamera()->getProjectionMatrixAsFrustum(left,right,bottom,top,zNear,zFar);
        printf("left=%.2f\tright=%.2f\nbottom=%.2f\ttop=%.2f",left,right,bottom,top);
        double wid=right-left;
        double h=top-bottom;
        osg::ref_ptr<osg::Image> Image=new osg::Image;
        Image->allocateImage(width*scale,height*scale,1,GL_RGB,GL_UNSIGNED_BYTE);
        for(int i=0;i<scale;i++)
        {
                for(int j=0;j<scale;j++)
                {
                        newLeft=left+wid*i/(double)scale;
                        newRight=newLeft+wid/(double)scale;
                        newBottom=bottom+h*j/(double)scale;
                        newTop=newBottom+h/(double)scale;
                        v->getCamera()->setProjectionMatrixAsFrustum(newLeft,newRight,newBottom,newTop,zNear,zFar);
                        v->renderingTraversals();
                        osg::ref_ptr<osg::Image> image=new osg::Image;
                        image->readPixels(x,y,width,height,GL_RGB,GL_UNSIGNED_BYTE);
                        Image->copySubImage(width*i,height*j,0,image.get());
                        char filename[50];
                        sprintf(filename,"d:\\pic%d_%d.jpg",i,j);
                        osgDB::writeImageFile(*image,filename);
                }
        }
        osgDB::writeImageFile(*Image,"d:\\pic.jpg");

        return true;
}
int main()
{
        osg::ref_ptr<osgViewer::Viewer>v=new osgViewer::Viewer;
        v->setSceneData(osgDB::readNodeFile("cow.osg"));
    v->setCameraManipulator(new osgGA::TrackballManipulator());
    v->frame();

        snap(v,2);
       
        return 1;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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