OpenGL-入门-BMP像素图glReadPixels(1)实现读取屏幕中间的颜色和获取屏幕上鼠标点击位置的颜色

glReadPixels函数用于从帧缓冲区中读取像素数据。它可以用来获取屏幕上特定位置的像素颜色值或者获取一块区域内的像素数据。下面是该函数的基本语法:


void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *data);

x 和 y:读取区域左下角的像素坐标。
width 和 height:读取区域的宽度和高度。
format:像素数据的格式,可以是 GL_RGBA、GL_RGB、GL_DEPTH_COMPONENT 等等。
type:数据的数据类型,如 GL_UNSIGNED_BYTE、GL_FLOAT 等。
data:存储像素数据的缓冲区。
举个例子,如果你想获取屏幕上位置 (100, 100) 处的像素颜色值,你可以这样使用 glReadPixels:

GLubyte pixel[3];
glReadPixels(100, 100, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel);

这将会把位置 (100, 100) 处的 RGB 像素颜色值存储在 pixel 数组中。

如果你想读取一个区域的像素数据,可以调整 width 和 height 参数的值。

请注意,glReadPixels 函数是一个相对慢的操作,因为它涉及到从显存中读取数据,这可能会在性能方面产生一些影响。在实际应用中,如果需要频繁地读取像素数据,最好考虑使用一些其他的技术来减少性能开销。

标题示例一:实现读取屏幕中间的颜色

//实现读取屏幕中间的颜色
#define WindowWidth 400
#define WindowHeight 400#pragma warning(disable:4996)#include <GL/glut.h>
#include <iostream>
#include <math.h>void display() {glClearColor(0.0, 0.0, 0.0, 1.0);glClear(GL_COLOR_BUFFER_BIT);// Draw something on the screenglColor3f(1.0, 0.0, 0.0); // Red colorglBegin(GL_TRIANGLES);glVertex2f(-0.5, -0.5);glVertex2f(0.5, -0.5);glVertex2f(0.0, 0.5);glEnd();glFlush(); // Ensure all drawing commands are executed
}void readPixelData() {GLint viewport[4]; // Viewport dimensions [x, y, width, height]glGetIntegerv(GL_VIEWPORT, viewport); // Get viewport dimensionsGLubyte pixel[3];/*在例子中,GLubyte pixel[3]; 定义了一个长度为3的数组,用来存储从glReadPixels函数中读取到的像素颜色值。由于我们在这个例子中读取的是RGB颜色,所以数组的长度是3,分别用于存储红、绿和蓝三个颜色分量的值。*/GLint x = viewport[2] / 2; // X coordinate at the center/*viewport[2] 表示视口(viewport)的宽度。视口是屏幕上用于显示OpenGL图形的区域。数组索引为 2 的元素存储的就是视口的宽度。viewport[2] / 2 就是将视口的宽度除以 2,从而得到了视口的中心位置的 x 坐标。*/GLint y = viewport[3] / 2; // Y coordinate at the center// Invert y-coordinate to match OpenGL's coordinate systemy = viewport[3] - y - 1;glReadBuffer(GL_FRONT); // Set the buffer to read from the front bufferglReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel);printf("Pixel color at center: R=%u, G=%u, B=%u\n", pixel[0], pixel[1], pixel[2]);
}int main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(800, 600);glutCreateWindow("glReadPixels Example");glutDisplayFunc(display);glutIdleFunc(readPixelData); // Read pixel data after drawing and during idle timeglutMainLoop();return 0;
}

在这里插入图片描述

标题示例二:获取屏幕上鼠标点击位置的颜色

#include <GL/glut.h>
#include <iostream>// 存储窗口大小
int windowWidth = 800;
int windowHeight = 600;// 存储鼠标点击位置的颜色
GLubyte clickedColor[3] = { 0, 0, 0 };
void display() {glClearColor(0.0f, 0.0f, 0.0f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 绘制渐变色矩形glBegin(GL_QUADS);// 左上角顶点,红色glColor3ub(255, 0, 0);glVertex2f(-0.5f, 0.5f);// 右上角顶点,绿色glColor3ub(0, 255, 0);glVertex2f(0.5f, 0.5f);// 右下角顶点,蓝色glColor3ub(0, 0, 255);glVertex2f(0.5f, -0.5f);// 左下角顶点,黄色glColor3ub(255, 255, 0);glVertex2f(-0.5f, -0.5f);glEnd();glFlush();
}
//鼠标左键按下并释放时,获取鼠标点击位置的像素颜色,并将该颜色信息显示在控制台中
void mouse(int button, int state, int x, int y) {if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {GLint viewport[4];//这一行代码获取当前窗口的视口信息,并将信息存储在 viewport 数组中。视口包括窗口的位置和尺寸。glGetIntegerv(GL_VIEWPORT, viewport);// 使用glReadPixels获取点击位置的像素颜色glReadPixels(x, viewport[3] - y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, clickedColor);//viewport[3]表示视口的高度,std::cout << "Clicked pixel color: R=" << static_cast<int>(clickedColor[0]) << ", G=" << static_cast<int>(clickedColor[1]) << ", B=" << static_cast<int>(clickedColor[2]) << std::endl;}
}int main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(windowWidth, windowHeight);glutCreateWindow("Mouse Click Color Picker");glutDisplayFunc(display);glutMouseFunc(mouse);glutMainLoop();return 0;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go实现LogCollect:海量日志收集系统【下篇——开发LogTransfer】

Go实现LogAgent&#xff1a;海量日志收集系统【下篇】 0 前置文章 Go实现LogAgent&#xff1a;海量日志收集系统【上篇——LogAgent实现】 前面的章节我们已经完成了日志收集&#xff08;LogAgent&#xff09;&#xff0c;接下来我们需要将日志写入到kafka中&#xff0c;然后…

【SpringSecurity】十二、集成JWT搭配Redis实现退出登录

文章目录 1、登出的实现思路2、集成Redis3、认证成功处理器4、退出成功处理器5、修改token校验过滤器6、调试 1、登出的实现思路 这是目前的token实现图&#xff1a; 因为JWT的无状态&#xff0c;服务端无法在使用过程中主动废止某个 token&#xff0c;或者更改 token 的权限…

【算法刷题-双指针篇】

目录 1.leetcode-27. 移除元素2.leetcode-344. 反转字符串3.leetcode-剑指 Offer 05. 替换空格4.leetcode-206. 反转链表5.leetcode-19. 删除链表的倒数第 N 个结点6.leetcode-面试题 02.07. 链表相交7.leetcode-142. 环形链表 II8.leetcode-15. 三数之和9.leetcode-18. 四数之…

python unitest自动化框架

以下举一个最简单的unitest实例&#xff0c;包含备注&#xff0c;自己拉取代码运行一次就知道原理了 import unittest import osclass TestSample(unittest.TestCase):classmethoddef setUpClass(cls) -> None:print(整个测试类只执行一次)def setUp(self) -> None:prin…

【python零基础入门学习】python基础篇之判断与for循环(二)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

flutter plugins插件【二】【FlutterAssetsGenerator】

2、FlutterAssetsGenerator 介绍地址&#xff1a;https://juejin.cn/post/6898542896274735117 配置assets目录 ​ 插件会从pubspec.yaml文件下读取assets目录&#xff0c;因此要使用本插件&#xff0c;你需要在pubspec.yaml下配置资源目录 flutter:# The following line ens…

Navicat连接数据库报2003错误解决办法

是防火墙还没有开启 查看防火墙管理的端口 设置3306防火墙开启&#xff0c;重载防火墙 连接成功

2024年java面试--多线程(2)

系列文章目录 2024年java面试&#xff08;一&#xff09;–spring篇2024年java面试&#xff08;二&#xff09;–spring篇2024年java面试&#xff08;三&#xff09;–spring篇2024年java面试&#xff08;四&#xff09;–spring篇2024年java面试–集合篇2024年java面试–redi…

CSS中如何实现弹性盒子布局(Flexbox)的换行和排序功能?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 换行&#xff08;Flexbox Wrapping&#xff09;⭐ 示例&#xff1a;实现换行⭐ 排序&#xff08;Flexbox Ordering&#xff09;⭐ 示例&#xff1a;实现排序⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得…

【uniapp 配置启动页面隐私弹窗】

为什么需要配置 原因 根据工业和信息化部关于开展APP侵害用户权益专项整治要求&#xff0c;App提交到应用市场必须满足以下条件&#xff1a; 1.应用启动运行时需弹出隐私政策协议&#xff0c;说明应用采集用户数据 2.应用不能强制要求用户授予权限&#xff0c;即不能“不给权…

iPhone 14 Plus与iPhone 14 Pro:你应该买哪一款

又到了iPhone季,这意味着你可能会在几种不同的机型之间左右为难,无法决定买哪一款。更令人困惑的是,苹果推出的iPhone变体——iPhone 14 Plus,只比老款iPhone 14 Pro低100美元。 有这么多选择,你可能想知道哪款iPhone最适合你。你应该买一部大屏幕的iPhone 14 Plus并节省…

C语言每日一练--------Day(11)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;找到数组中消失的数字 哈希表 &#x1f493;博主csdn个人主页&#xff…

leetcode原题: 最小值、最大数字

题目1&#xff1a;最小值 给定两个整数数组a和b&#xff0c;计算具有最小差绝对值的一对数值&#xff08;每个数组中取一个值&#xff09;&#xff0c;并返回该对数值的差 示例&#xff1a; 输入&#xff1a;{1, 3, 15, 11, 2}, {23, 127, 235, 19, 8} 输出&#xff1a;3&…

网络编程 http 相关基础概念

文章目录 表单是什么http请求是什么http请求的结构和说明关于http方法 GET和POST区别http常见状态码http响应http 请求是无状态的含义html是什么 &#xff08;前端内容&#xff0c;了解即可&#xff09;html 常见标签 &#xff08;前端内容&#xff0c;了解即可&#xff09;关于…

项目总结知识点记录-文件上传下载(三)

&#xff08;1&#xff09;文件上传 代码&#xff1a; RequestMapping(value "doUpload", method RequestMethod.POST)public String doUpload(ModelAttribute BookHelper bookHelper, Model model, HttpSession session) throws IllegalStateException, IOExcepti…

XSS的分析

目录 1、XSS的原理 2、XSS的攻击类型 2.1 反射型XSS 2.2 存储型XSS 2.3 DOM-based 型 2.4 基于字符集的 XSS 2.5 基于 Flash 的跨站 XSS 2.6 未经验证的跳转 XSS 3、复现 3.1 反射性 3.2 DOM-based型 1、XSS的原理 XSS的原理是恶意攻击者往 Web 页面里插入恶意可执行…

Android中级——消息机制

消息机制 概念ThreadLocalMessageQueueLooperHandlerrunOnUiThread() 概念 MessageQueue&#xff1a;采用单链表的方法存储消息列表Looper&#xff1a;查询MessageQueue是否有新消息&#xff0c;有则处理&#xff0c;无则等待ThreadLocal&#xff1a;用于Handler获取当前线程的…

TypeScript配置-- 1. 新手处理TS文件红色波浪线的几种方式

Typescript 规范化了JS的项目开发&#xff0c;但是对一些项目的一些新手来说&#xff0c;确实是不怎么优好&#xff0c;譬如我&#xff1a;将我之前珍藏的封装JS代码&#xff0c;拿进了配置了tsconfig.json的vue3项目&#xff0c;在vscode下&#xff0c;出现了满屏的红色 &…

UML四大关系

文章目录 引言UML的定义和作用UML四大关系的重要性和应用场景关联关系继承关系聚合关系组合关系 UML四大关系的进一步讨论UML四大关系的实际应用软件开发中的应用其他领域的应用 总结 引言 在软件开发中&#xff0c;统一建模语言&#xff08;Unified Modeling Language&#x…

如何在Spring Boot应用中使用Nacos实现动态更新数据源

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…