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: ...
随机推荐
- swift-基础部分
变量常量,注释,分号,整数,浮点数.数值行类型转换,类型别名,波尔值,元组,可选,断言 let binaryInteger = 0b10001 let twoThousan ...
- PHP使用SOAP调用.net的WebService数据
需要和一个.net系统进行数据交换,对方提供了一个WebService接口,使用PHP如何调用这个数据呢,下面就看看使用SOAP调用的方法吧 这个与一般的PHP POST或GET传值再查库拿数据的思路 ...
- Android Activity 阻止软键盘自动弹出
在AndroidManifest.xml里面 选择那个acitivity, 把他的window soft input mode设置成stateHidden和 adjustUnspecified < ...
- 小鲜肉初学JS做得仿京东淘宝竖排二级导航
<!DOCTYPE html><html><head><meta charset="utf-8"><meta http-equ ...
- 8天学通MongoDB——第一天 基础入门
原文地址:http://www.cnblogs.com/huangxincheng/archive/2012/02/18/2356595.html 关于mongodb的好处,优点之类的这里就不说了,唯 ...
- 关于WII光枪定位的设计(转)
方法1. 简单1 LED方法 这是一个很忽悠的方法,把LED看成是屏幕中心,把光枪摄像头的视野范围看作是屏幕范围. 假设WII枪头摄像头的数据范围为[0,1024]*[0,768],显示器屏幕分辨率为 ...
- E时代主机,其实做一个小虚拟主机还是不错的
http://www.idcen.com/ 做微信没有网上测试地址,找了一下发现以前用过的.记录一下.一个100m的虚拟主机需要三四十块钱,做微信,做一个小型网站还是够用的,就是mysql有点问题,不 ...
- Java:进制转换
进制转换是常常需要的一种数据处理,在java中的一些类中封装了具有转换功能的方法,这个不做介绍.其实,进制之间的转化是通过先位异或&,再位移动>>>的方式实现的. 例如,对于 ...
- OSI
1.物理(硬:HUB位) *****************信道接口型状.尺寸.引脚.排列电压.电流.阻抗.波形.速率及平衡单.半双.全双工RS232,RS422,RS423,RS485X.25.X. ...
- IMP导入数据 报错 IMP-00058 ORA-01691 IMP-00028
查看导入日志,发现错误如下: oracle@sspt:/back/log> cat imp.HD_HDXX.log Connected to: Oracle Database 11g Enter ...