OpenGL-入门-BMP像素图glReadPixels(2)保存显示的界面

news2024/11/19 5:56:30

用glReadPixels保存显示的界面

#include <GL/glut.h>
#include <iostream>
#include <fstream>
#include <vector>

// Save pixel data as BMP image
void saveBMP(const std::string& filename, int width, int height, const std::vector<GLubyte>& data) {
    std::ofstream file(filename, std::ios::binary);

    if (!file) {
        std::cerr << "Error opening file for writing" << std::endl;
        return;
    }

    int imageSize = width * height * 3; // RGB data, 3 bytes per pixel
    int fileSize = 54 + imageSize; // BMP header size + image size

    unsigned char bmpFileHeader[14] = {
        'B', 'M', // Magic number
        static_cast<unsigned char>(fileSize), static_cast<unsigned char>(fileSize >> 8),
        static_cast<unsigned char>(fileSize >> 16), static_cast<unsigned char>(fileSize >> 24),
        0, 0, 0, 0, // Reserved
        54, 0, 0, 0 // Offset to pixel data
    };

    unsigned char bmpInfoHeader[40] = {
        40, 0, 0, 0, // Info header size
        static_cast<unsigned char>(width), static_cast<unsigned char>(width >> 8),
        static_cast<unsigned char>(width >> 16), static_cast<unsigned char>(width >> 24),
        static_cast<unsigned char>(height), static_cast<unsigned char>(height >> 8),
        static_cast<unsigned char>(height >> 16), static_cast<unsigned char>(height >> 24),
        1, 0, // Number of color planes
        24, 0, // Bits per pixel (RGB)
        0, 0, 0, 0, // Compression method
        0, 0, 0, 0, // Image size
        0, 0, 0, 0, // Horizontal resolution
        0, 0, 0, 0, // Vertical resolution
        0, 0, 0, 0, // Number of colors in color palette
        0, 0, 0, 0 // Number of important colors
    };

    file.write(reinterpret_cast<char*>(bmpFileHeader), sizeof(bmpFileHeader));
    file.write(reinterpret_cast<char*>(bmpInfoHeader), sizeof(bmpInfoHeader));
    file.write(reinterpret_cast<const char*>(&data[0]), imageSize);

    file.close();
}

void display() {
    // Your OpenGL drawing code here
    // ...
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Clear color to black
    glClear(GL_COLOR_BUFFER_BIT); // Clear the color buffer

    // Draw something on the screen
    glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 0.0f, 0.0f); // Red color
    glVertex2f(-0.5f, -0.5f);
    glVertex2f(0.5f, -0.5f);
    glVertex2f(0.0f, 0.5f);
    glEnd();

    glFlush(); // Ensure all drawing commands are executed

    GLint viewport[4];
    glGetIntegerv(GL_VIEWPORT, viewport); // Get viewport dimensions

    int width = viewport[2];
    int height = viewport[3];

    std::vector<GLubyte> pixelData(width * height * 3); // RGB data

    if (!pixelData.empty()) {
        glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, &pixelData[0]);

        // Convert RGBA to BGR format for BMP
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                int index = (y * width + x) * 3;
                GLubyte temp = pixelData[index]; // Store red component
                pixelData[index] = pixelData[index + 2]; // Replace red with blue
                pixelData[index + 2] = temp; // Set blue to stored red
            }
        }

        saveBMP("screenshot.bmp", width, height, pixelData);
    }
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(800, 600);
    glutCreateWindow("OpenGL Screenshot Example");

    glutDisplayFunc(display);

    glutMainLoop();
    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/955937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OA项目之左侧菜单动态选项卡

目录 1.左侧导航 参考地址&#xff1a;http://layui.org.cn/doc/element/nav.html 2.导入数据表及无限级分类 1) 数据导入&#xff08;此步骤在第一次文章已完成&#xff09; 2) 无限级分类&#xff1a;父亲找儿子的过程&#xff0c;将对应的儿子放在父亲下面&#xff0c;形…

无涯教程-Flutter - 简介

Flutter是一个由谷歌开发的开源移动应用软件开发工具包&#xff0c;用于为Android、iOS、 Windows、Mac、Linux、Google Fuchsia开发应用。 通常&#xff0c;创建移动应用程序是一个非常复杂和具有挑战性的任务。有许多框架可用&#xff0c;它提供了开发移动应用程序的出色函数…

yolov5的pytorch配置

1. conda create -n rdd38 python3.82、pip install torch1.8.0 torchvision0.9.0 torchaudio0.8.0 -f https://download.pytorch.org/whl/cu113/torch_stable.html -i https://pypi.tuna.tsinghua.edu.cn/simple 3、conda install cudatoolkit10.2

Flutter的未来与趋势,23年还学吗?

随着移动应用市场的不断扩大&#xff0c;跨平台开发框架的需求也越来越大。Flutter框架可以帮助开发者在不同平台上快速开发高质量的移动应用程序&#xff0c;这种趋势将进一步推动Flutter的发展和普及。 作为一名前端开发工程师&#xff0c;学习Flutter框架是非常有必要的。因…

NameError: name ‘_mysql‘ is not defined

报错信息 Traceback (most recent call last):File "/Users/xuruilong/Desktop/cmabc_back/.enve/lib/python3.9/site-packages/MySQLdb/__init__.py", line 18, in <module>from . import _mysql ImportError: dlopen(/Users/xuruilong/Desktop/cmabc_back/.…

报文信息转换器

HttpMessageConverter HttpMessageConverter:报文信息转换器&#xff0c;将请求报文转换为Java对象&#xff0c;或将Java对象转换为响应报文。它提供了两个注解和两个类型&#xff1a; RequestBody, ResponseBody, RequestEntity, ResponseEntity(响应用的较多) 准备 创建模块并…

HCIP学习--扩展知识点

端口镜像-SPAN 抓包软件只能抓取经过本地的网卡的流量 也就是抓取流量只能抓取本设备的流量 [r1]observe-port interface GigabitEthernet 0/0/2 定义一个SPAN的会话&#xff0c;然后定义监控接口&#xff08;也就是你要用的接口&#xff0c;你连接这个接口来对其他接口抓包…

IDEA批量处理行尾注释

前言 行尾注释写起来比较方便&#xff0c;所以很多时候我们都会习惯把注释写在行尾。 但这个是不符合编程规范的&#xff0c;写的代码注释主要是给后续接手人进行阅读帮助的。按照正常的阅读方式都是先读注释&#xff0c;然后再看代码&#xff0c;如果先看代码再看注释&#…

创建智能问答机器人:上线智能机器人客服,实时为客户提供解决方案

随着企业扩大规模和业务增长&#xff0c;客户咨询和服务请求增加。传统人工客服难以处理大量咨询&#xff0c;而智能化的AI客服可以同时满足多个客户需求。 智能问答机器人 创建智能问答机器人后&#xff0c;能自动化处理大量客户咨询&#xff0c;显著降低企业运营成本&#xf…

Multimedia-播放器-架构1

目录 引言 概念 播放器 播放器的工作流程 播放器的架构 IO模块 Parser&Demuxer模块 Decoder模块 渲染模块 小结 引言 什么是播放器&#xff1f; 播放器是做什么的&#xff1f;怎么做的&#xff1f; 概念 播放器 可以指软件&#xff0c;也可以指硬件 软件&am…

代码随想录算法训练营之JAVA|第四十一天|139. 单词拆分

今天是第 天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天。 算法挑战链接 139. 单词拆分https://leetcode.cn/problems/word-break/ 第一想法 看完之后完全没有想法。 看完代码随想录之后的想法 这是一个完全背包的问题&#xff0c;使用完全背包的解法。 单词就…

「C++程序设计 (面向对象进阶)」学习笔记・一

0、引言 本专栏的系列文章是在学习 北京邮电大学 崔毅东 老师的《C程序设计 (面向对象进阶)》课程过程中整理的。欢迎前往专栏了解更多相关内容~ &#x1f600; 有关于现代 C 的基本介绍&#xff0c;请前往《现代C基本介绍》&#xff01; &#x1f514; 先决条件 本专栏的系列…

微信小程序发布一个npm包

参考:https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html 同npm一样流程 npm install weixin_heath_apis

gRPC-Gateway 快速实战

今天来分享一波 gRPC-Gateway &#xff0c; 之前咱们有分享过什么是 gRPC 及其使用方式&#xff0c;可以看看这些关于 gRPC 的历史文章&#xff1a; gRPC介绍 gRPC 客户端调用服务端需要连接池吗&#xff1f; gRPC的拦截器 gRPC的认证 分享一下 gRPC- HTTP网关 I 今天主要是分…

大门设得好,财旺运也旺

大门作为我们家庭里一扇保护家人的屏障&#xff0c;可以说是非常重要的&#xff0c;它不仅能起到安全作用&#xff0c;在风水上也是非常关键的。大门在风水中是财运进气的门道&#xff0c;大门风水的好坏直接影响到房屋的整体风水&#xff0c;好的大门风水可以让主人旺财又旺运…

Jaeger的经典BUG原创

前端&#xff0c;笔者在使用Jaeger进行Trace监控的时候&#xff0c;当数据量增大到一定数量级时&#xff0c;出现了一次CPU暴增导致节点服务器挂了的经典案例&#xff0c;这里对案例进行一个简单的抽象&#xff0c;供大家参考&#xff1a; 首先通过pprof对耗时的函数进行定位&…

华为云CodeArts IDE快速入门和使用详解

华为云CodeArts IDE使用详解 一、用户界面1. 初始界面2. 打开项目界面3. 资源管理器4. 编辑器5. 命令面板6. 扩展应用7. Git管理 二、设置1. 设置编辑器2. settings.json 三、代码编辑1. 快捷操作2. 代码补全 四、RemoteShell1. 添加主机连接 文档参考: 华为云CodeArts IDE文档…

【高级程序设计语言C++】异常与智能指针

1. 异常2. 智能指针2.1. auto_ptr2.2. unique_ptr2.3. shared_ptr2.4. 循环引用2.5. weak_ptr2.6. 定制删除器 1. 异常 当我们编写程序时&#xff0c;可能会遇到各种错误和异常情况&#xff0c;例如除以零、访问无效的内存地址等。为了能够处理这些异常情况&#xff0c;C提供了…

(笔记六)利用opencv进行图像滤波

&#xff08;1&#xff09;自定义卷积核图像滤波 import numpy as np import matplotlib.pyplot as plt import cv2 as cvimg_path r"D:\data\test6-6.png" img cv.imread(img_path)# 图像滤波 ker np.ones((6, 6), np.float32)/36 # 构建滤波器&#xff08;卷积…

Three.js后处理后物体表面出现条纹

初始化 WebGLRenderer 时简单启用 logarithmicDepthBuffer: true 解决了问题。 根据文档&#xff0c;启用可能会导致性能下降&#xff0c;因此请根据您的性能预算考虑使用它。 缩小相机的near和far 后处理对于深度精度非常敏感。大视锥体很快就会使此类 AO 通道变得无法使用 th…