如何使用 OpenGL 保存 OpenGL 绘图?

2023-11-30

我用 OpenGL 命令绘制屏幕。我必须将此屏幕保存为 .bmp 或 .png 格式。但我做不到。我正在使用 glReadpixels 但我无法继续。如何使用 OpenGL 在 C++ 中保存此绘图?


它来了!你必须包含 WinGDI.h (我认为 GL 会做到这一点!)

void SaveAsBMP(const char *fileName)
{
    FILE *file;
    unsigned long imageSize;
    GLbyte *data=NULL;
    GLint viewPort[4];
    GLenum lastBuffer;
    BITMAPFILEHEADER bmfh;
    BITMAPINFOHEADER bmih;
    bmfh.bfType='MB';
    bmfh.bfReserved1=0;
    bmfh.bfReserved2=0;
    bmfh.bfOffBits=54;
    glGetIntegerv(GL_VIEWPORT,viewPort);
    imageSize=((viewPort[2]+((4-(viewPort[2]%4))%4))*viewPort[3]*3)+2;
    bmfh.bfSize=imageSize+sizeof(bmfh)+sizeof(bmih);
    data=(GLbyte*)malloc(imageSize);
    glPixelStorei(GL_PACK_ALIGNMENT,4);
    glPixelStorei(GL_PACK_ROW_LENGTH,0);
    glPixelStorei(GL_PACK_SKIP_ROWS,0);
    glPixelStorei(GL_PACK_SKIP_PIXELS,0);
    glPixelStorei(GL_PACK_SWAP_BYTES,1);
    glGetIntegerv(GL_READ_BUFFER,(GLint*)&lastBuffer);
    glReadBuffer(GL_FRONT);
    glReadPixels(0,0,viewPort[2],viewPort[3],GL_BGR,GL_UNSIGNED_BYTE,data);
    data[imageSize-1]=0;
    data[imageSize-2]=0;
    glReadBuffer(lastBuffer);
    file=fopen(fileName,"wb");
    bmih.biSize=40;
    bmih.biWidth=viewPort[2];
    bmih.biHeight=viewPort[3];
    bmih.biPlanes=1;
    bmih.biBitCount=24;
    bmih.biCompression=0;
    bmih.biSizeImage=imageSize;
    bmih.biXPelsPerMeter=45089;
    bmih.biYPelsPerMeter=45089;
    bmih.biClrUsed=0;
    bmih.biClrImportant=0;
    fwrite(&bmfh,sizeof(bmfh),1,file);
    fwrite(&bmih,sizeof(bmih),1,file);
    fwrite(data,imageSize,1,file);
    free(data);
    fclose(file);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 OpenGL 保存 OpenGL 绘图? 的相关文章

  • Visual Studio 2017 中的“onecore”文件夹

    在Visual Studio 2017 RTM VC Tools MSVC 14 10 25017 lib文件夹中 有一个名为 onecore 的文件夹 里面有x64 x86和arm的文件夹 每个文件夹都包含一些VC Tools中已经存在的
  • 带有 std::vector 的 VBO

    我用 C 和 OpenGL 编写了一个模型加载器 我用过std vectors 来存储我的顶点数据 但现在我想将其传递给glBufferData 但是数据类型却截然不同 我想知道是否有办法可以相互转换std vector至已记录的const
  • Windows 上的 OpenGL SDK

    我正在尝试编写一个 OpenGL 应用程序 因此我安装了 Windows 7 SDK 然而 它似乎是OpenGL 1 1 define GL VERSION 1 1 1 如何找到我安装的 OpenGL 版本 dll 以及在哪里可以找到较新的
  • Visual C++ MFC 中窗口启动时的事件顺序

    假设我有一个从 CWnd 派生的类 它具有事件处理函数OnPaint OnCreate and OnSize 如您所知 所有这些都是在窗口启动时发生的 但我想看看它们之间的顺序是什么 例如 当我在其中一个中设置断点时 在结束函数后 控制不会
  • 使用 OpenGL 渲染 QImage

    与我相关的其他问题 https stackoverflow com questions 20126354 render qimage from sooffscreenrenderer in qglwidget 我认为更核心的问题是 如何渲染
  • 不使用 DAO 压缩 Microsoft Access 数据库

    我用CDatabase类开一个ACCDB访问数据库 司机是 T Microsoft Access Driver mdb accdb 我可以打开并使用数据库 已经这样做很多年了 if DatabaseExist m strMDBPath AJ
  • 如何创建自己的 openGL 上下文并将其绑定到 GLCanvas?

    所以当我开始掌握java时 paint Graphics g 我继续创建自己的渲染方法 但我必须了解缓冲区策略以及如何 获取 图形 所以现在我在学习openGL 我必须掌握方法 Override public void display GL
  • glTranslatef 不在 glBegin .. glEnd 中工作

    我正在尝试并排绘制不同颜色的两个方块 我的问题是我无法让 glTranslatef 将第二个方块向右移动 第二个方块只是绘制在第一个方块上 void display void glClear GL COLOR BUFFER BIT glMa
  • std::deque 的内存开销到底是怎么回事?

    我正在研究一种使用外部排序算法std queue并且必须仔细限制其内存使用 我注意到在合并阶段 使用了几个std queues 固定长度 我的内存使用量增加到我预期的大约 2 5 倍 自从std queue默认情况下使用std deque作
  • 将 char[] 转换为 LPCWSTR

    谁能帮我纠正这个代码 char szBuff 64 sprintf szBuff p m hWnd MessageBox NULL szBuff L Test print handler MB OK 错误是 它无法将第二个参数转换为 LPC
  • GLSL memoryBarrierShared() 有用吗?

    我想知道 memoryBarrierShared 的用处 事实上 当我查找屏障功能的文档时 我读到 对于计算着色器中任何给定的静态屏障实例 单个工作组内的所有调用都必须进入该实例 然后才能允许任何调用继续超出该实例 这确保了在给定的屏障静态
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • 如何将tchar指针转换为char指针

    我想将 tchar 转换为 char 这可能吗 如果是的话该怎么做 我使用unicode设置 A TCHAR要么是一个普通的char or a wchar t取决于您的项目的设置 如果是后者 您需要使用WideCharToMultiByte
  • sRGB 纹理。它是否正确?

    我最近阅读了一些有关 sRGB 格式以及它们如何允许硬件自动对典型显示器执行色彩校正的文章 作为我阅读的一部分 我发现您可以使用普通纹理和返回结果上的 pow 函数来模拟此步骤 无论如何 我想问两个问题 因为我以前从未使用过此功能 首先 有
  • 从挂钩的 exe 获取详细的故障转储

    我正在尝试查找我的程序与游戏挂钩的问题 这是 VC 基本上我启动该程序 然后使用 SDL 连接到它 当我从 VS2010 运行代码时 一切正常 但是当我尝试从命令提示符运行时 我的程序可以启动游戏 但之后游戏立即崩溃 我正在查看 Windo
  • MSVC如何在编译期间输出一些内容到“输出”窗口

    有时我看到某些项目在编译期间向输出写入一些内容 在MSVC 中如何实现 thanks use pragma message e g define MESSAGE t message FILE STRINGXXX LINE t define
  • 并排显示图像的一半 - OpenGL

    我为两个图像创建了两个纹理 现在我想在opengl中按图像2的左侧部分 完整的图像1 图像2的右侧部分的顺序显示该纹理 我已经做了如下 Image1 显示在 opengl 屏幕的中央 但屏幕的左右部分不正确 应分别显示 image2 的左侧
  • 在 vc++ 中将 'System::String ^' 转换为 'const char *'

    如何在 vc 中将 System String 转换为 const char My code String Result1 C Users Dev Desktop imag jpg IplImage img1 cvLoadImage Res
  • 如何为 Windows 安装开源 Qt 库 5 二进制版本

    这个问题具体是关于Qt libraries 5 0 0 for Windows VS 2010 406 MB at http qt project org downloads http qt project org downloads 但我
  • std::to_string - 多个重载函数的实例与参数列表匹配

    counter is an int void SentryManager add std string name std shared ptr

随机推荐

  • 如何向未绑定的 DataGridView 添加行?

    我有一个DataGridView在 C 中 我想在 a 中添加行程序化的方式 没有数据绑定到网格 但是当我调用时dataGrid Rows Add 它抛出一个System InvalidOperationException 我查遍了互联网
  • 在没有适当 REST-Api 的情况下测试 RestSharp 的反序列化

    EDIT 问题的答案可以在 John Sheehan 的第一条评论中找到 我想用雷斯特夏普作为我的项目的休息客户端 由于REST服务器尚未运行 我想在没有服务器的情况下测试客户端 我的主要关注点是返回的 XML 响应的反序列化 是否可以在没
  • Vue.js 2 中 v-for 语句内的转换组

    我有一个projects我之后填写的对象axios称呼 然后我就循环了projects对象使用v for指示 这是代码 ul class row projects list li project project name br li ul
  • WebGL 浮点模数行为

    我遇到以下片段着色器的奇怪行为 varying vec3 worldSpaceCoords uniform float rows void main float testNumber 7 0 vec4 outputColor vec4 0
  • 如何按第一个元素(字符串)按字母顺序对元组列表进行排序[PYTHON] [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我有一个像这样的元组列表 peter 1 mary 5 anthony 6 brandon 4 如果我想对这个列表进行排序并得到类似的内容 anthony 6 brandon
  • matplotlib pyplot.show:无效的 RGBA

    我只需要绘制 3D 散点图 from mpl toolkits import mplot3d from matplotlib import pyplot as plt ax plt axes projection 3d ax scatter
  • 以编程方式从图像中提取文本

    我正在寻找一种编程方式来检索图像上的文本 我不知道是否有任何此类工具可用 我需要先下载图像 然后从中提取文本 有没有任何编程方法可以做到这一点 超立方 OCR可以从图像中提取文本 你到底是什么意思extract
  • 替换失败的模板专门化

    考虑这个函数 template
  • 使用 MongoDB 聚合框架四舍五入到小数点后两位

    我正在使用 mongodb 聚合框架并进行一些计算 如下所示 db RptAgg aggregate group id Region RegionTxt Mth Month ActSls sum ActSls PlnSls sum PlnS
  • 优化列表视图,包含 1k 对象列表

    我想知道是否有任何优化的方法来创建一个可容纳超过 1k 对象的适配器 我尝试了以下方法 但结果仍然不乐观 A 视图支架模式 它有帮助 但当对象尺寸增加时 它开始出现问题 B 注意 我可以使用分页 api 来传递定义数量的对象 但我的场景中没
  • 如何在PHP编辑页面中选中单选按钮?

    在 php 形式中 我将数据从单选按钮获取到数据库 效果很好 但是在编辑页面中如何从数据库中获取选中的值 td align left valign middle td
  • Linq to Entities - SQL“IN”子句

    在 T SQL 中 您可以有如下查询 SELECT FROM Users WHERE User Rights IN Admin User Limited 您将如何在 LINQ to Entities 查询中复制它 有可能吗 你需要彻底改变你
  • 如何生成某个公历年到回历的日期

    我想自动适应或生成一年中的日子 从公历到回历 我的意思是您想选择或写入年份作为示例 选择2015年 获取公历 2015 年的所有日期 然后将其转换为回历并显示回历列表 所以你想返回 2 个列表 list1 公历天列表 vs 另一个列表2 h
  • 添加 QLPreviewController 作为子视图不会加载 PDF

    我正在尝试添加 QLPreviewController 的视图作为子视图 不 我不能使用导航控制器或模式 它仅显示 QLPreviewController 的结构背景 我创建一个并将其添加为子视图 QLPreviewController p
  • 如何设置自定义控件的描述以显示在工具箱中?

    我想在设计时添加一个文本 告诉设计者我的控件是什么到我的自定义控件中 就像这里的 VS 默认控件一样 我努力了 summary但这对我不起作用 如何做呢 你可以用以下方式装饰你的班级Description属性 然后 当您使用以下命令将控件添
  • 如何根据自动缩小的标签为多个标签设置相同的字体比例?

    我有 4 个标签视图 其中一个应该显示较大的数值并设置为自动收缩 我的要求是在自动调整该标签以适合其内容后 将该标签设置为与其他标签相同的字体缩放或大小 以便文本内容在整个过程中看起来统一 设置最小比例因子对其他标签没有帮助 因为它们的内容
  • 为 SBT 依赖项设置 javac 选项

    我在编译通过 GIT 加载的 Java 依赖项时遇到问题 object ApplicationBuild extends Build lazy val project Project root file dependsOn RootProj
  • 使用 ADODB 连接打开存储在 SharePoint 上作为数据源的 Excel 文件

    我正在尝试使用以下 VBA 代码片段打开 Excel 文件作为数据源 Dim cn As ADODB Connection Set cn New ADODB Connection With cn Provider Microsoft ACE
  • 是否可以通过积分加速度计数据随时间的变化来计算速度?

    我想知道是否可以使用 线性 加速度计和指南针来计算速度而不使用位置服务 我想通过计算北 西 上轴的加速度分量并随着时间的推移对它们进行积分来做到这一点 那行得通吗 一般来说 Android 设备上的加速度计噪音太大 无法整合信号并获取速度
  • 如何使用 OpenGL 保存 OpenGL 绘图?

    我用 OpenGL 命令绘制屏幕 我必须将此屏幕保存为 bmp 或 png 格式 但我做不到 我正在使用 glReadpixels 但我无法继续 如何使用 OpenGL 在 C 中保存此绘图 它来了 你必须包含 WinGDI h 我认为 G