OpenGL窗体中如何实现屏幕截图

Pause_break 2008-04-17 05:47:24
Windows采用GDI绘图,OpenGL采用RC绘图,我想在OpenGL窗体中截屏,点击菜单项就可以截取整个窗口,输出BMP图像,不用截图工具,不知道用程序如何实现,能用GDI的截图方式吗?
...全文
1340 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
rageliu 2008-04-30
  • 打赏
  • 举报
回复
好的方法是使用hook,不过对刷新fps帧率有一些影响
qianlima888 2008-04-30
  • 打赏
  • 举报
回复
bool SnapScreen(LPCSTR filename,int x, int y, int width, int height)
{
//CAcModuleResourceOverride res;
wglMakeCurrent(m_hDC,m_hRC);

if (pDlgPrintSet->m_radiu == 0)
{

GLint viewport[4];
glGetIntegerv( GL_VIEWPORT, viewport );
width = viewport[2];
height = viewport[3];
width -= width%4;
}

GLubyte * bmpBuffer = NULL;
bmpBuffer = (GLubyte *)malloc(width*height*3*sizeof(GLubyte));
if (!bmpBuffer)
return FALSE;
glReadPixels((GLint)x, (GLint)y, (GLint)width, (GLint)height,
GL_BGR_EXT, GL_UNSIGNED_BYTE, bmpBuffer);
wglMakeCurrent(m_hDC,NULL);


FILE *filePtr;
fopen_s(&filePtr, filename, "wb");
if (!filePtr)
return FALSE;

BITMAPFILEHEADER bitmapFileHeader;
BITMAPINFOHEADER bitmapInfoHeader;

bitmapFileHeader.bfType = 0x4D42; //"BM"
bitmapFileHeader.bfSize = width*height*3;
bitmapFileHeader.bfReserved1 = 0;
bitmapFileHeader.bfReserved2 = 0;
bitmapFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

bitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapInfoHeader.biWidth = width;
bitmapInfoHeader.biHeight = height;
bitmapInfoHeader.biPlanes = 1;
bitmapInfoHeader.biBitCount = 24;
bitmapInfoHeader.biCompression = BI_RGB;
bitmapInfoHeader.biSizeImage = 0;
bitmapInfoHeader.biXPelsPerMeter = 0;
bitmapInfoHeader.biYPelsPerMeter = 0;
bitmapInfoHeader.biClrUsed = 0;
bitmapInfoHeader.biClrImportant = 0;

fwrite(&bitmapFileHeader, sizeof(bitmapFileHeader), 1, filePtr);
fwrite(&bitmapInfoHeader, sizeof(bitmapInfoHeader), 1, filePtr);
fwrite(bmpBuffer, width*height*3, 1, filePtr);
fclose(filePtr);
free(bmpBuffer);

return TRUE;
}
Kudeet 2008-04-18
  • 打赏
  • 举报
回复
使用glReadPixels
icosagon 2008-04-17
  • 打赏
  • 举报
回复
ls的方法能截获opengl??
n_yHHy_n 2008-04-17
  • 打赏
  • 举报
回复

// 截屏,将要截的屏幕存放到bitmap对象中。
void CopyScreenToBitmap(int xStartPt, int yStartPt, int width, int height, int xToCopy, int yToCopy)
{
if ( NULL == m_pBackBitmap )
{
m_pBackBitmap = new CBitmap();
}

CDC ScrDC,MemDC;

ScrDC.CreateDC("DISPLAY", NULL, NULL, NULL);
MemDC.CreateCompatibleDC(&ScrDC);

m_pBackBitmap->CreateCompatibleBitmap(&ScrDC,width,height);
MemDC.SelectObject(m_pBackBitmap);

MemDC.BitBlt(xStartPt, yStartPt, width, height,&ScrDC,xToCopy,yToCopy,SRCCOPY);

ScrDC.DeleteDC();
MemDC.DeleteDC();
}


之后再借用http://blog.csdn.net/wltg2001/archive/2008/04/17/2300258.aspx这位大虾的保存bitmap
的方法,保存为bmp文件。

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧