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

    ImageCodecInfo* pImageCodecInfo = NULL;

    GetImageEncodersSize(&num, &size);
    )
        ;  // Failure

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

    GetImageEncoders(num, size, pImageCodecInfo);

    ; j < num; ++j)
    {
         )
        {
            *pClsid = pImageCodecInfo[j].Clsid;
            free(pImageCodecInfo);
            return j;  // Success
        }
    }

    free(pImageCodecInfo);
    ;  // Failure
}

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

    glFlush(); glFinish();

    glReadPixels(,,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(, , nWidth, nHeight);

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

        int nStride1 = bitmapData.Stride;
         )
            nStride1 = -nStride1;

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

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

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

        DestBmp.UnlockBits(
            &bitmapData );

        delete [] pixels;
        pixels = NULL;

        DestBmp.RotateFlip( RotateNoneFlipY );

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

         )
            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, , sizeof(FullPath) );
    std::wstring szExePath;
    if (::GetModuleFileNameW( NULL, FullPath, sizeof(wchar_t)*MAX_PATH))
    {
        szExePath = FullPath;

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

         != pos )
        {
            szExePath = szExePath.substr(,pos+);
        }
    }

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

    RECT rect;
    memset(&rect,,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

opengl截图的更多相关文章

  1. Android OpenGL ES 开发(N): OpenGL ES 2.0 机型兼容问题整理

    在使用OpenGL ES做开发的时候,发现不是所有机型对OpenGL的代码都兼容的那么好,同样的代码在某些机型上总是会出现问题,但是在其他手机上就是好的.下面是本人总结的OpengGL 兼容问题: 一 ...

  2. iOS 截屏,openGL ES 截图,以及像素颜色判断

    代码整理了2种截图,类似.(没苹果自带那种截图彻底) 方法一: +(UIImage *)fullScreenshots{ UIWindow *screenWindow = [[UIApplicatio ...

  3. CSharpGL(27)讲讲清楚OpenGL坐标变换

    CSharpGL(27)讲讲清楚OpenGL坐标变换 在理解OpenGL的坐标变换问题的路上,有好几个难点和易错点.且OpenGL秉持着程序难以调试.难点互相纠缠的特色,更让人迷惑.本文依序整理出关于 ...

  4. OpenGL中坐标系的理解(一)

    在OpenGL中,存在着至少存在着三种矩阵,对应着函数glMatrixMode()的三个参数:GL_MODELVIEW,GL_PROJECTION,GL_TEXTURE. 以下主要描述GL_MODEL ...

  5. OpenGL 多视图与截屏

    最近看红宝书学习 OpenGL 一段时间了,写了简单的 demo 程序温习一下知识. 主要是 使用 glScissor 多视图显示画面和使用 glReadPixels 给画面截屏,使用显示列表(dis ...

  6. OpenGL阴影,Shadow Volumes(附源程序,使用 VCGlib )

    实验平台:Win7,VS2010 先上结果截图:    本文是我前一篇博客:OpenGL阴影,Shadow Mapping(附源程序)的下篇,描述两个最常用的阴影技术中的第二个,Shadow Volu ...

  7. OpenGL阴影,Shadow Mapping(附源程序)

    实验平台:Win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): 本文描述图形学的两个最常用的阴影技术之一,Shadow Mapping方法(另一种是Sh ...

  8. OpenGL管线(用经典管线代说着色器内部)

    图形管线(graphics pipeline)向来以复杂为特点,这归结为图形任务的复杂性和挑战性.OpenGL作为图形硬件标准,是最通用的图形管线版本.本文用自顶向下的思路来简单总结OpenGL图形管 ...

  9. OpenGL坐标变换及其数学原理,两种摄像机交互模型(附源程序)

    实验平台:win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): a.鼠标拖拽旋转物体,类似于OGRE中的“OgreBites::CameraStyle: ...

随机推荐

  1. Javascript 偏移量总结

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  2. POJ 2653 Pick-up sticks(线段相交)

    题目链接 题意 : 把每根棍往地上扔,找出最后在上面的棍,也就是说找出所有的没有别的棍子压在它的上面的棍子. 思路 : 对于每根棍子,压在他上面的棍子一定是在它之后扔的棍子,所以在找的时候只要找它之后 ...

  3. C#中毫米与像素的换算方法

    C#中以像素作为尺寸单位,像素是一种相对的尺寸概念,与毫米的转换与当前显示器的分辨率有关.在不同分辨率下转换的系数不同. 借助GDI可以完成毫米至像素的转换. public static double ...

  4. 在Unity中使用贝塞尔曲线(转)

    鼎鼎大名的贝塞尔曲线相信大家都耳熟能详.这两天因为工作的原因需要将贝塞尔曲线加在工程中,那么MOMO迅速的研究了一下成果就分享给大家了哦.贝塞尔曲线的原理是由两个点构成的任意角度的曲线,这两个点一个是 ...

  5. soa思想,就是远程服务调用

    dubbo是Java下的一套RPC框架(soa思想)

  6. Struts2笔记——struts.xml配置详解

    访问HelloWorld应用的路径的设置 * 在struts1中,通过<action path=“/primer/helloWorldAction.action”>节点的path属性指定访 ...

  7. php 写入数据到MySQL以及从MySQL获取数据,页面出现乱码的解决方法

    现象如标题. 解决思路: 1确定数据库charset是否是utf-8 a. charset不是utf-8 1, 更改数据库charset为utf-8 ALTER DATABASE db_name DE ...

  8. Java应用发布后,需要关注的7个性能指标

    在某个重大发布之后,都需要记录相应的指标,本文介绍了最重要的几个 Java 性能指标,包括响应时间和平均负载等.为理解应用程序在生产环境中如何运行,就需要遵循一些 Java 性能指标. 在以前,当软件 ...

  9. 298. Binary Tree Longest Consecutive Sequence

    题目: Given a binary tree, find the length of the longest consecutive sequence path. The path refers t ...

  10. WebService另一种轻量级实现—Hessian 学习笔记

    最近和同事聊天,得知他们在使用一种叫做Hessian的WebService实现方式实现远 程方法调用,是轻量级的,不依赖JavaEE容器,同时也是二进制数据格式传输,效率比SOAP的XML方式要高.感 ...