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

这篇具有很好参考价值的文章主要介绍了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 screen
    glColor3f(1.0, 0.0, 0.0); // Red color
    glBegin(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 dimensions

    GLubyte 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 system
    y = viewport[3] - y - 1;

    glReadBuffer(GL_FRONT); // Set the buffer to read from the front buffer
    glReadPixels(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 time


    glutMainLoop();
    return 0;
}

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

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

#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;
}

OpenGL-入门-BMP像素图glReadPixels(1)实现读取屏幕中间的颜色和获取屏幕上鼠标点击位置的颜色,OpenGL,glReadPixels文章来源地址https://www.toymoban.com/news/detail-690586.html

到了这里,关于OpenGL-入门-BMP像素图glReadPixels(1)实现读取屏幕中间的颜色和获取屏幕上鼠标点击位置的颜色的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32配置读取BMP280气压传感器数据

    BMP280是在BMP180基础上增强的绝对气压传感器,在飞控领域的高度识别方面应用也比较多。 BMP280和BMP180的区别: 市面上也有一些模块: 这里介绍STM32芯片和BMP280的连接和数据读取。 BMP280和STM32的供电范围一致,可以在1.8V, 2.5V和3.3V多个供电电压点直接连接。 BMP280和STM32可以通

    2024年02月13日
    浏览(28)
  • 用 Image 和 cv2 库读取 BMP 图 像

    本次内容中包含了图片的读取和写入,以及“图片融合”、‘图片拼接’、‘图片的灰度直方图展示’ 使用深度为8位24位的格式为bmp的图片,存放在“file”文件夹,实现位数为8和24的BMP图像读取和存储,并绘制其对应的灰度直方图。 (1)导入标准库numpy,赋给对象np,用于

    2024年02月08日
    浏览(20)
  • 【PyAutoGUI操作指南】05 屏幕截图与图像定位:截图+定位单个目标+定位全部目标+灰度匹配+像素匹配+获取屏幕截图中像素的RGB颜色

    PyAutoGUI可以拍摄屏幕截图,将其保存到文件中,并在屏幕中定位图像。OSX使用操作系统附带的screencapture命令。Linux使用scrot命令,可以通过运行sudo-apt-get-install-scrot来安装该命令。 功能介绍:一个需要点击的按钮,并且想在屏幕上找到它。

    2024年02月14日
    浏览(26)
  • flutter开发实战-获取屏幕显示大小及物理像素分辨率

    flutter开发实战-获取屏幕显示大小及物理像素分辨率 在开发过程中,经常遇到需要获取屏幕显示的大小及物理像素分辨率,这里会用到MediaQuery,MediaQuery必须依赖BuildContext的上下文才能使用。 flutter中MediaQuery是一个用于获取设备屏幕信息的类。可以用它来获取屏幕宽度、高度

    2024年02月11日
    浏览(39)
  • 读取图像,显示图像,输出图像像素矩阵

    方法一:使用matplotlib matplotlib是模仿matlab中plot绘图函数的一个library(库)。使用matplotlib.image读取的图片,直接就是数组形式,方便后续处理。 plt.imshow()是对图像进行格式化,后面要跟plt.show()才能显示图片。 方法二:使用PIL和numpy 方法一和方法二效果对比 显示图像: matp

    2023年04月24日
    浏览(36)
  • 【OpenGL】读取视频并渲染

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍opencv读取视频并在opengl渲染增加3D图形。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 编译: g++ -o video_rendering main.cpp -lglut -lGL -lGLU pkg-config -

    2024年02月12日
    浏览(35)
  • android获取屏幕分辨率的正确方法;获取到分辨率(垂直方向像素)的不正确

    我通过下面的方法去获取屏幕分辨率的,但获取到的分辨率有时会不准确。原因是此方法有时候会忽略一些布局或控件的高度,从而得不到正确的高度。 而通过另外一个方法则没有上述那种问题,可以获取到正确的屏幕分辨率。

    2024年02月14日
    浏览(42)
  • OpenGL ES 2.0 for Android教程(三):编译着色器并绘制到屏幕

    文章传送门 OpenGL ES 2.0 for Android教程(一) OpenGL ES 2.0 for Android教程(二) OpenGL ES 2.0 for Android教程(四) OpenGL ES 2.0 for Android教程(五) OpenGL ES 2.0 for Android教程(六) OpenGL ES 2.0 for Android教程(七) OpenGL ES 2.0 for Android教程(八) OpenGL ES 2.0 for Android教程(九) 本章将继续我

    2023年04月26日
    浏览(45)
  • C#图像处理-使用OpenCVSharp读取或修改图像像素值

    图像处理是计算机视觉领域的重要应用之一,而OpenCV是一个强大且广泛使用的开源计算机视觉库。在C#中,我们可以通过OpenCVSharp库来实现图像处理的各种功能,包括读取和修改图像像素值。本文将介绍如何使用OpenCVSharp来读取和修改图像像素值,并提供相应的源代码。 首先,

    2024年04月28日
    浏览(27)
  • 【移动端网页布局】流式布局 ① ( 流式布局简介 | 百分比布局 / 非固定像素布局 | 根据屏幕尺寸 / 设备类型自动调整网页布局 )

    流式布局 又称为 百分比布局 / 非固定像素布局 ; 为 流式布局 中 盒子模型 设置 百分比宽度 , 其大小可以根据屏幕宽度自适应伸缩 , 该盒子没有像素限制 , 内容自动向左右两边填充 ; 流式布局 可以 根据 设备屏幕尺寸 和 设备类型 自动调整 网页布局 和 标签元素大小 , 以适应

    2024年02月03日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包