opengl截图

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
    UINT  num = 0;          // number of image encoders
    UINT  size = 0;         // size of the image encoder array in bytes

    ImageCodecInfo* pImageCodecInfo = NULL;

    GetImageEncodersSize(&num, &size);
    if(size == 0)
        return -1;  // Failure

    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
    if(pImageCodecInfo == NULL)
        return -1;  // Failure

    GetImageEncoders(num, size, pImageCodecInfo);

    for(UINT j = 0; j < num; ++j)
    {
        if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
        {
            *pClsid = pImageCodecInfo[j].Clsid;
            free(pImageCodecInfo);
            return j;  // Success
        }
    }

    free(pImageCodecInfo);
    return -1;  // Failure
}

bool CaptureScreenShot(
    int nWidth,
    int nHeight,
    const std::wstring& szDestFile,
    const std::wstring& szEncoderString)
{
    UINT *pixels=new UINT[nWidth * nHeight];
    memset(pixels, 0, sizeof(UINT)*nWidth*nHeight);

    glFlush(); glFinish();

    glReadPixels(0,0,nWidth,nHeight,GL_BGRA_EXT,GL_UNSIGNED_BYTE,pixels);

    if(NULL==pixels)
        return false;

    // Initialize GDI+
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    {
        // Create the dest image
        Bitmap DestBmp(nWidth,nHeight,PixelFormat32bppARGB);

        Rect rect1(0, 0, nWidth, nHeight);

        BitmapData bitmapData;
        memset( &bitmapData, 0, sizeof(bitmapData));
        DestBmp.LockBits(
            &rect1,
            ImageLockModeRead,
            PixelFormat32bppARGB,
            &bitmapData );

        int nStride1 = bitmapData.Stride;
        if( nStride1 < 0 )
            nStride1 = -nStride1;

        UINT* DestPixels = (UINT*)bitmapData.Scan0;

        if( !DestPixels )
        {
            delete [] pixels;
            return false;
        }

        for(UINT row = 0; row < bitmapData.Height; ++row)
        {
            for(UINT col = 0; col < bitmapData.Width; ++col)
            {
                DestPixels[row * nStride1 / 4 + col] = pixels[row * nWidth + col];
            }
        }

        DestBmp.UnlockBits(
            &bitmapData );

        delete [] pixels;
        pixels = NULL;

        DestBmp.RotateFlip( RotateNoneFlipY );

        CLSID Clsid;
        int result = GetEncoderClsid(szEncoderString.c_str(), &Clsid);

        if( result < 0 )
            return false;

        Status status = DestBmp.Save( szDestFile.c_str(), &Clsid );
    }
    // Shutdown GDI+
    GdiplusShutdown(gdiplusToken);

    return true;
}
void saveImage()
{
    wchar_t FullPath[MAX_PATH];
    memset( FullPath, 0, sizeof(FullPath) );
    std::wstring szExePath;
    if (::GetModuleFileNameW( NULL, FullPath, sizeof(wchar_t)*MAX_PATH))
    {
        szExePath = FullPath;

        int pos = szExePath.rfind( L‘\\‘ );

        if( -1 != pos )
        {
            szExePath = szExePath.substr(0,pos+1);
        }
    }

    std::wstring szDestFile = szExePath;
    szDestFile += L"somepic.png";

    RECT rect;
    memset(&rect,0,sizeof(rect));
    HWND g_hWnd=GetFocus();
    GetClientRect(g_hWnd,&rect);

    CaptureScreenShot(
        rect.right,
        rect.bottom,
        szDestFile,
        L"image/png");
}

从这里看的http://forums.codeguru.com/showthread.php?446641-How-can-I-output-an-image-generated-with-openGL-to-an-image-file-such-as-jpg

时间: 2024-10-13 12:31:00

opengl截图的相关文章

图形世界分裂的两派——理清Direct3D和OpenGL的脉络

计算机三维图形是指将用数据描述的三维空间通过计算转换成二维图像并显示或打印出来的技术,API(Application Programming Interface)即"应用程序接口"是连接应用程序与操作系统.实现对计算机硬件控制的纽带,Direct3D和OpenGL是目前的两大3D图形 API,要在你的3D显卡上进行3D特效的制作.实现都必须通过它们(Vooodoo迷们肯定对Glide接口记忆尤深,可惜已随着3dfx的倒闭而作古,其它还有Heidi等接口).关于D3D和OpenGL的理论

OpenGL全景视频

全景视频其实在实现上和一般的视频播放基本差不多,解码可以用ffmpeg,只是对解码后的图片在绘制的时候要绘制在一个球上(我这里是球,好像有说有的格式要绘制在四面体上的,美做深入研究),而不是画在一个表面上.所以这里应该要用纹理. 1.计算球的顶点坐标和纹理坐标 球的顶点坐标和纹理坐标的计算可以说是全景的关键.这里参考android opengl播放全景视频 int cap_H = 1;//必须大于0,且cap_H应等于cap_W int cap_W = 1;//绘制球体时,每次增加的角度 flo

OpenGL笔记12

OpenGL入门学习[十二] 片断测试其实就是测试每一个像素,只有通过测试的像素才会被绘制,没有通过测试的像素则不进行绘制.OpenGL提供了多种测试操作,利用这些操作可以实现一些特殊的效果.我们在前面的课程中,曾经提到了“深度测试”的概念,它在绘制三维场景的时候特别有用.在不使用深度测试的时候,如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这样的效果并不是我们所希望的.如 果使用了深度测试,则情况就会有所不同:每当一个像素被绘制,Op

OpenGL入门学习

说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色来做吗?显然是不行的. 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物. OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的

Opengl 导入3Dmax制作的.3ds模型 并显示出来

由于opengl并没有原始支持这种模型,所以导入是件麻烦事,但是又有很多的模型是这个格式的,这次在做图形学大作业的时候,特别想用到. 开始以为很简单,就几十行代码就能解决,但是翻了好多列子,都从解析文件格式,到分离顶点,纹理格式等等,非常复杂的工作,最后才能显示模型. 因此我把网上的列子总结成了2个文件,一个头文件和一个CPP文件,文件在最后面贴出来 叫做CLoad3DS.cpp   CLoad3DS.h 下面用nehe最简单的一个列子来展现如何导入,非常的简单 不需要管这个两个文件里面具体复杂

以sb7code为基础创建一个基本的OpenGL项目

? ? 从github上面下载sb7code代码: https://github.com/openglsuperbible/sb7code 打开HOWTOBUILD.TXT(在 GITHUB网页上直接打开格式比较友好). 根据这个文档中说的,在本地编译第一步中下载的sb7code代码,编译是为了得到我们需要的.lib文件. 在VS2013中建一个c++的空项目. 将红框中所示的这些文件和文件夹拷贝到当前项目目录下,或者一个公共目录下: (其中.h文件都是在sb7code目录下能找到的,.lib文

outdated: 43.FreeType Fonts in OpenGL

FreeType一个字体库,主要体现FreeType抗锯齿效果. 图中第一行为ttf字体,第二行为点阵字体,各有各的好处,不过ttf用的比较多.可以看出第一行字体的效果更好. 这是用到的库文件,放到了我的GitHub,下载地址. 配置方法即文件放置位置还是按以前的来,在VS2015中,项目属性->链接器->附加依赖项加入libfreettpe.lib. 在原文中有两个bugfix,链接在这.我也在文中直接修改了. 在原本的代码中还有两个bug且都在FreeType.cpp文件中,为print(

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型 作者:u0u0 - iTyran 在上一节中,我们分析了OBJ格式.OBJ格式优点是文本形式,可读性好,缺点也很明显,计算机解析文本过程会比解析二进制文件慢很多.OBJ还有个问题是各种3D建模工具导出的布局格式还不太一样,face还有多边形(超过三边形),不利于在OpenGL ES里面加载. .3ds文件是OBJ的二进制形式,并且多很多信息.有一个C语言写的开源库可以用来加.3ds文件,这就是l

看opengl 写代码(4) 画一个圆

opengl 编程指南 P30 下面代码 是 用 直线 连起来 画一个圆. // circle.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <gl/glut.h> #include <cmath> #define LENGTH 100 #define PI 3.1415926 void init(){ glClearColor(0,0,0,0); } void display(){ glColor3f