opengl截图
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截图的更多相关文章
- Android OpenGL ES 开发(N): OpenGL ES 2.0 机型兼容问题整理
在使用OpenGL ES做开发的时候,发现不是所有机型对OpenGL的代码都兼容的那么好,同样的代码在某些机型上总是会出现问题,但是在其他手机上就是好的.下面是本人总结的OpengGL 兼容问题: 一 ...
- iOS 截屏,openGL ES 截图,以及像素颜色判断
代码整理了2种截图,类似.(没苹果自带那种截图彻底) 方法一: +(UIImage *)fullScreenshots{ UIWindow *screenWindow = [[UIApplicatio ...
- CSharpGL(27)讲讲清楚OpenGL坐标变换
CSharpGL(27)讲讲清楚OpenGL坐标变换 在理解OpenGL的坐标变换问题的路上,有好几个难点和易错点.且OpenGL秉持着程序难以调试.难点互相纠缠的特色,更让人迷惑.本文依序整理出关于 ...
- OpenGL中坐标系的理解(一)
在OpenGL中,存在着至少存在着三种矩阵,对应着函数glMatrixMode()的三个参数:GL_MODELVIEW,GL_PROJECTION,GL_TEXTURE. 以下主要描述GL_MODEL ...
- OpenGL 多视图与截屏
最近看红宝书学习 OpenGL 一段时间了,写了简单的 demo 程序温习一下知识. 主要是 使用 glScissor 多视图显示画面和使用 glReadPixels 给画面截屏,使用显示列表(dis ...
- OpenGL阴影,Shadow Volumes(附源程序,使用 VCGlib )
实验平台:Win7,VS2010 先上结果截图: 本文是我前一篇博客:OpenGL阴影,Shadow Mapping(附源程序)的下篇,描述两个最常用的阴影技术中的第二个,Shadow Volu ...
- OpenGL阴影,Shadow Mapping(附源程序)
实验平台:Win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): 本文描述图形学的两个最常用的阴影技术之一,Shadow Mapping方法(另一种是Sh ...
- OpenGL管线(用经典管线代说着色器内部)
图形管线(graphics pipeline)向来以复杂为特点,这归结为图形任务的复杂性和挑战性.OpenGL作为图形硬件标准,是最通用的图形管线版本.本文用自顶向下的思路来简单总结OpenGL图形管 ...
- OpenGL坐标变换及其数学原理,两种摄像机交互模型(附源程序)
实验平台:win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): a.鼠标拖拽旋转物体,类似于OGRE中的“OgreBites::CameraStyle: ...
随机推荐
- POJ 3685
Matrix Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 4428 Accepted: 1102 Descriptio ...
- swift函数和初始化控件(// MARK:分割线)
import UIKit , , , ) view.backgroundColor = UIColor.redColor() self.view.addSubview( ...
- Educational Codeforces Round 4 D. The Union of k-Segments 排序
D. The Union of k-Segments You re given n segments on the coordinate axis Ox and the number k. The ...
- 可运行jar包生成步骤和jar包的生成
一.可运行jar包生成步骤 1.进入.class文件所在目录,新建一个记事本文件,假设为1.txt,文件内容: 1> Main-Class:可运行类的名字 ( 例如:Main-Class:T ...
- IOS开发中的几种设计模式
ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则 ...
- Java-斐波那契数
1.目标:使用非递归求斐波那契,0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ... 2.思路:观察规律得:从第3个数起,把和从为下一个数的加数,把加数作为下一个数的被加数,即三个 ...
- 创业者拿到融资别高兴太早,当心TS中的优先清算权
最近创投圈的新闻读起来真是让人有些绝望啊,一家家创业公司接连宣告倒闭,其中不乏一些走在比较后面的“明星企业”,冷不丁冒出点消息,却是创始人发的公告,宣布公司资金链断裂,进入破产清算程序,或被低价并购. ...
- MFC中Edit Control值的获取与赋值
void CEditControlDlg::OnClickedButton() { // TODO: Add your control notification handler code here / ...
- C 中变参函数的处理方式
C 函数中变化的参数用‘...’ 表示.变化的参数依旧按照C函数传参的规则入栈,即从右往左依次入栈,保证参数从左往右地址依次升高. 解析变参的主要思想是:将变参缓冲区像容纳了不同类型的数组(当然实际的 ...
- 1、Hibernate之生成SessionFactory源码追踪
Hibernate的所有session都是由sessionFactory来生成的,那么,sessionFactory是怎么得来的呢?它与我们配置的xxx.cfg.xml文件以及xxx.hbm.xml文 ...