实现代码如下:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <GL/glut.h>
using namespace std;#define BMP_Header_Length 54
#define WindowWidth 400
#define WindowHeight 400static bool gbSaveBMP =false;typedef struct tagPoint {GLfloat fx;GLfloat fy;
}Point;Point point[] = {{   0.0f,  0.0f},{  70.0f,  0.0f},{   0.0f, 70.0f},{  70.0f, 70.0f},
};static const Point kDestPoint = {0.0f, 0.0f};
static GLfloat kFactor = 1.0f;
static GLfloat kRotateAngle = 0.0f;static bool gbRotate = false;void displayShape();
void reShape(GLint w, GLint h);
void handleMessage(unsigned char key, GLint x, GLint y);
void idleFunc();void readPixels() {FILE*     pDummyFile = 0;FILE*     pWritingFile = 0;GLubyte*  pPixelData = 0;GLubyte   BMP_Header[BMP_Header_Length];GLint     pixelWidth = WindowWidth * 3;//3 is the 24 bit of the BMP file format GLint     j = 0;GLint     PixelDataLength = 0;while( pixelWidth % 4 != 0 )       // 补充数据,直到i是的倍数++pixelWidth;               PixelDataLength = pixelWidth * WindowHeight;// get the num of the pixels is width * heigh// 分配内存和打开文件pPixelData = (GLubyte* )malloc(PixelDataLength);memset(pPixelData, 0, PixelDataLength);if( pPixelData == 0 )exit(0);pDummyFile = fopen("d:\\dummy.bmp", "rb");if( pDummyFile == 0 )exit(0);pWritingFile = fopen("d:\\grab.bmp", "wb");if( pWritingFile == 0 )exit(0);// 读取像素glFlush();glPixelStorei(GL_UNPACK_ALIGNMENT, 4);glReadPixels(0, 0, WindowWidth, WindowHeight,GL_RGB, GL_UNSIGNED_BYTE, pPixelData);//把dummy.bmp的文件头复制为新文件的文件头GL_BGR_EXTfread(BMP_Header, sizeof(BMP_Header), 1, pDummyFile);fwrite(BMP_Header, sizeof(BMP_Header), 1, pWritingFile);fseek(pWritingFile, 0x0012, SEEK_SET);pixelWidth = WindowWidth;j = WindowHeight;fwrite(&pixelWidth, sizeof(pixelWidth), 1, pWritingFile);fwrite(&j, sizeof(j), 1, pWritingFile);// 写入像素数据fseek(pWritingFile, 0, SEEK_END);fwrite(pPixelData, PixelDataLength, 1, pWritingFile);// 释放内存和关闭文件fclose(pDummyFile);fclose(pWritingFile);free(pPixelData);
}/*
*
*/void handleMessage(GLint key, GLint x, GLint y) {switch(key){case GLUT_KEY_LEFT:gbRotate = true;break;case GLUT_KEY_RIGHT:kFactor -= 0.01f;gbRotate = true;break;case GLUT_KEY_UP:kRotateAngle -= 0.01f;gbRotate = false;break;case GLUT_KEY_DOWN:kRotateAngle += 0.01f;gbRotate = false;break;default:break;}glLoadIdentity();//flush Screen;
}void reShape(GLint w, GLint h) {if(h == 0) h = 1;  glViewport(0, 0, w, h);  glMatrixMode(GL_PROJECTION);  glLoadIdentity();  if(w <= h) {  glOrtho(-200.0f, 200.0f * h / w, -200.0f, 200.0f * h / w, -200.0f, 200.0f);  } else {  glOrtho(-200.0f * w / h, 200.0f * w / h, -200.0f, 200.0f, -200.0f, 200.0f);  }glMatrixMode(GL_MODELVIEW);  glLoadIdentity();  }void idleFunc() {displayShape();
}void displayShape() {glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.0f, 1.0f, 0.0f);glBegin(GL_QUAD_STRIP);GLint length = sizeof(point) / sizeof(point[0]);for(GLint i = 0; i < length; ++i) {glVertex2f(point[i].fx, point[i].fy);}  glEnd();glutSwapBuffers();readPixels();//after drawing the pixels to the screen, the get the pixels from the buffer
}int main(int argc, char *argv[]) {glutInit(&argc, argv); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize(400, 400);glutCreateWindow("Five-Pointed Star");glutDisplayFunc(displayShape);glutSpecialUpFunc(handleMessage);glutReshapeFunc(reShape);glutIdleFunc(idleFunc);glutMainLoop();return 0;
}

需要注意一点的是:在创建bmp文件的时候一定是真彩图(24位位图),不然会失败导致的结果要么是黑色要么什么都没有。

OpenG利用glreadPixel实现截屏功能相关推荐

  1. android4.3 截屏功能的尝试与失败分析

    感谢网友cjd6568358的帮助,新版的Android系统截屏功能已经实现,需要的朋友请移步项目主页:https://github.com/Android-ScreenShot/AndroidScr ...

  2. android自动截图实现,Android实现截屏功能

    原标题:Android实现截屏功能 该方法主要利用SDK提供的view.getDrawingCache()方法,主要步骤如下: 设置view.setDrawingCacheEnabled(true) ...

  3. 苹果xr截屏怎么截_原来苹果手机自带长截屏功能!以前一直不知道,真让人相见恨晚...

    阅读本文前,请您先点击上面的蓝色字体,再点击"关注",这样您就可以继续免费收到文章了.每天都有分享,完全是免费订阅,请放心关注. 注:本文转载自网络,如有侵权,请联系删除 你关注的 ...

  4. 苹果平板如何截屏_原来苹果手机自带长截屏功能!以前一直不知道,真让人相见恨晚...

    原来苹果手机自带长截屏功能!以前一直不知道,真让人相见恨晚. 关于长截图,苹果用户总是比安卓用户更加艰难一些,因为还需要利用一些第三方软件才能够截图. 最近才发现,原来苹果手机也能够轻松实现长截图功能 ...

  5. python全局键盘监听(pynput快捷键);利用pywin32快速截屏并生成视频

    python全局键盘监听(pynput快捷键):利用pywin32快速截屏并生成视频 第一次在CSDN写博客,有点小紧张(/ω\) 以下内容完全个人理解,有错误请指出~ 最近在用python做一个小工 ...

  6. android实现长截屏,Android实现全屏截图或长截屏功能

    本文实例为大家分享了Android实现全屏截图或长截屏功能的具体代码,供大家参考,具体内容如下 全屏截图: /** * 传入的activity是要截屏的activity */ public stati ...

  7. Cocos2d-x 截屏功能集成

    1.集成到Director 这里选择把截屏功能继承到Director中,让全局的导演来执行截屏功能是一个很好的主意. void Director::saveScreenshot(const std:: ...

  8. Atitit截屏功能的设计解决方案

    Atitit截屏功能的设计解决方案 自己实现.... 使用快捷键.. 弹出自己的win,,背景是屏幕快照 点击鼠标光标变成十字状态 出现截屏窗口 调整截屏窗口位置与大小 释放鼠标,三个btn,,  复 ...

  9. java网页截图_Java实现的简单网页截屏功能示例

    本文实例讲述了Java实现的简单网页截屏功能.分享给大家供大家参考,具体如下: package awtDemo; import java.awt.AWTException; import java.a ...

最新文章

  1. AI校招程序员最高薪酬曝光!腾讯80万年薪领跑,还送北京户口
  2. iphone-common-codes-ccteam源代码 CCGraphics.m
  3. 浅析网站备案的三大好处——你的网站备案了吗?
  4. 设计模式——UML图
  5. 皁新哪学计算机好,北京科技大学计算机基础模拟AB .doc
  6. ORACLE 动态SQL中的多个单引号
  7. Windows下安装scikit-learn
  8. 细说说傲腾与哈娜的那些事儿
  9. 用python海龟制图画花瓣_Python竟能画这么漂亮的花,帅呆了(代码分享)
  10. yarn当中各个主要组件的作用及调度器
  11. python在windows 输入和输出文件_Python文件、目录和输入输出操作
  12. 怎么设置java内存_如何修改jvm内存 内存设置过大
  13. sql_插入,修改,删除
  14. Deepin 深度Linux系统安装教程
  15. vscode插件 中文一键转英文并生成多种命名格式 提效神器
  16. 微信小程序--一--文件夹及内容解析
  17. CSS实验案例02简单专业介绍网页
  18. MySQL数据库体系 全面梳理(漂亮简洁的思维导图)
  19. clipboard.js 实现动态获取内容并复制到剪切板
  20. 发布3天获推荐10w+,视频号内容出现新玩法?

热门文章

  1. Redis-设置过期时间及淘汰策略
  2. 结构化数据与非结构化数据
  3. c++实现STL标准库
  4. 短信定位 android,短信定位
  5. microsoftstore连不上网_Microsoft Store登录不了怎么办 Microsoft Store登录不了解决方法...
  6. App 上线被拒绝的原因有哪些?
  7. Win10系统把桌面变成苹果iOS界面的小技巧
  8. 25_深度学习_汇聚层
  9. Hessian矩阵正定与函数凹凸性的关系
  10. 学会Python后利用WiFi就可以获取妹子的微信号啦