如何从 Linux 帧缓冲区获取 RGB 像素值?

2024-01-06

我想使用 Linux 以最有效的方式获取屏幕像素的 RGB 值。所以我决定使用C中的framebuffer库(fb.h)访问帧缓冲设备(/dev/fb0)并直接从中读取。

这是代码:

#include <stdint.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/mman.h>

int main() {

    int fb_fd;
    struct fb_fix_screeninfo finfo;
    struct fb_var_screeninfo vinfo;
    uint8_t *fb_p;

    /* Open the frame buffer device */
    fb_fd = open("/dev/fb0", O_RDWR);
    if (fb_fd < 0) {
        perror("Can't open /dev/fb0\n");
        exit(EXIT_FAILURE);
    }

    /* Get fixed info */
    if (ioctl(fb_fd, FBIOGET_FSCREENINFO, &finfo) < 0) {
        perror("Can't get fixed info\n");
        exit(EXIT_FAILURE);
    }

    /* Get variable info */
    if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &vinfo) < 0) {
        perror("Can't get variable info\n");
        exit(EXIT_FAILURE);
    }

    /* To access to the memory, it can be mapped*/
    fb_p = (uint8_t *) mmap(0, finfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb_fd, 0);
    if (fb_p == MAP_FAILED) {
        perror("Can't map memory\n");
        exit(EXIT_FAILURE);
    }

    /* Print each byte of the frame buffer */
    for (int i = 0; i < finfo.smem_len; i++) {
        printf("%d\n", *(fb_p + i));

        // for (int j = 0; j < 500000000; j++);       /* Delay */
    }

    munmap(fb_p, 0);
        close(fb_fd);

    return 0;
}

但是当我打印这些值时,我没有得到我所期望的......

如果我使用类似的工具选择像素 (0, 0) 的 RGB 值grabc,我明白了:

#85377e
133,55,126

但我的代码的第一个打印是:

126
145
198
...

看起来我很好地获得了第一个像素的第一个值,对应于蓝色,但其余的都是错误的。


如果你看一下grabc源代码(https://www.muquit.com/muquit/software/grabc/grabc.html https://www.muquit.com/muquit/software/grabc/grabc.html),你会看到他正在查询 X Windows(并且NOT硬件帧缓冲区本身)。

root_window=XRootWindow(display,XDefaultScreen(display));
target_window=selectWindow(display,&x,&y);
...
ximage=XGetImage(display,target_window,x,y,1,1,AllPlanes,ZPixmap);
...
color->pixel=XGetPixel(ximage,0,0);
XDestroyImage(ximage);

无论它的价值如何 - 并且出于多种不同的原因 - 我强烈鼓励您考虑这样做。

你也可能对此有兴趣:

  • Linux 上的低级图形简介 http://betteros.org/tut/graphics1.php

  • DirectFB https://github.com/DirectFB/directfb

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Linux 帧缓冲区获取 RGB 像素值? 的相关文章

  • C# Socket.receive连续接收0字节且循环中不阻塞

    我正在尝试用 C 编写一个最简单的多线程 TCP 服务器 它接收来自多个客户端的数据 每次连接新客户端时 都会建立套接字连接 并将套接字作为参数传递给新类函数 之后运行 while 循环并接收数据 直到客户端连接为止 这里的问题是 sock
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • Microsoft Graph API 授权错误:无效受众

    我知道这是一个很长的问题 但如果有人能与我分享他们的想法或经验 我真的很感激 因为我已经解决这个问题几天了 现在正在尝试很多事情 我有一个 ASP Net Core 3 1 Web API 应用程序和一个 ASP NET Core 3 1
  • C# 按下按钮时跳出循环

    我有一个简单的 C foreach 循环 如何在按下按钮时跳出循环 它不在backgroundWorker线程中 所以我不能使用backgroundWorker Cancellation Pending 在表单中创建一个布尔标志 将事件处理
  • 如何更改 GridView 内 ListViewItemPresenter 中的 SelectedBackground

    我在 SubSection 中有一个 Clickable Gridview
  • 如何创建 .bat 文件来运行 C# 代码?

    我需要的是 我有一个 C 代码 我想构建它以便在桌面上创建一个 bat 文件 因此 当我从桌面运行这个 bat 文件时 它应该执行 C 代码 有没有办法在编译之前更改 c 项目的设置或属性 以便创建应运行此 c 代码的 bat 文件 将 C
  • 有没有一种方法可以在不测试整个应用程序的情况下对类库(通用 Windows)进行单元测试?

    我需要进行单元测试Class Library Universal Windows 但是从 添加新项目 窗口中 我只看到了这一点 该项目使用应用程序容器运行所有测试 它始终打开一个应用程序 由于我不需要所有这些开销 我想知道是否有一种方法可以
  • C# 中的异步方法如何工作?

    我在我的一些项目中使用异步方法 我喜欢它 因为它使我的应用程序更具可扩展性 但是 我想知道异步方法如何在后台真正工作 NET 或 Windows 如何知道调用已完成 根据我进行的异步调用的数量 我可以看到创建了新线程 但并不总是 为什么 此
  • Clang 使用 -nostdlib 生成崩溃代码

    我正在尝试为可执行文件设置自己的运行时环境 但无法使用 clang v3 4 1ubuntu1 目标 x86 64 pc linux gnu 来生成没有段错误的可执行文件 我已将问题简化为以下内容 如果我有一个文件 crt1 c 除了满足
  • std::atomic 是否会阻止非原子变量对原子变量进行重新排序

    问题很简单 问 如果我有 settings N STNGS used by many threads std atomic
  • C++ 中的静态虚函数

    我有一个基类和一个派生类 我想更改基函数 同时保持它们静态 因为它们应该作为静态传递给其他函数 我怎样才能做到这一点 ATL 框架通过将基类设为模板 然后让派生类将其类类型作为模板参数传递 从而绕过了无虚拟静态的限制 然后 基类可以在需要时
  • 使用 .NET Core Razor Pages 将文件下载到浏览器

    使用 ASP NET Razor Pages 我尝试将文件下载到浏览器 在页面 html 中 使用这样的链接效果很好 href DownloadableFiles testB csv download newname gt Download
  • 更改子进程中的 iostream

    现在 我正在开发一个项目 其中我需要启动一个子进程来使用 C 在 Linux 中执行一个新程序 并且我需要重定向标准输入和输出 就像在 C 中一样 它们是cin and cout 到一个文件 这意味着在子进程中 标准输入和输出都是文件 子进
  • 拦截C# HttpClient GetAsync

    我有一个 Web 项目 C MVC5 但没有 WebAPI 和一个简单的 HTTP REST 客户端 该客户端调用外部 REST 服务并获取 accessToken 等 我想检查所有 Get PostAsync 调用对 statusCode
  • LINQ 中的左外连接

    下面的代码不断给我一个错误消息 你调用的对象是空的 var partsWithDefaults from partsList1 in p join partsList2 in d on new PartNo partsList1 PartN
  • 如何避免函数的多重定义(Linux、GCC/G++、Code::Blocks)

    我有一个代码块项目 它使用许多不同的文件 通常是由其他程序员编写的 目前我遇到的情况是 我有两个不同的子项目 其中包含以相同方式命名的函数 比方说 F int x 因此 F int x 是在两个不同位置的两个源文件中定义的 并且它们有两个不
  • OpenMP 动态调度与引导调度

    我正在研究 OpenMP 的调度 特别是不同的类型 我了解每种类型的一般行为 但澄清一下何时进行选择会很有帮助dynamic and guided调度 英特尔的文档 https software intel com en us articl
  • 如何让c代码执行hex机器代码?

    我想要一个简单的 C 方法能够在 Linux 64 位机器上运行十六进制字节码 这是我的 C 程序 char code x48 x31 xc0 include
  • 我该怎么做才能完全关闭与mcu的tcpClient连接?

    我现在正在研究与 ESP32 中运行的 tcp 服务器的 tcp 套接字连接 通信工作正常 但我无法关闭连接 在搜索关闭 重置 tcpClient 上的解决方案后 似乎关闭 tcpClient 的正确方法应该是 tcpClient GetS
  • 如何为单个函数设置 ICC 属性“fp-model precision”,以防止关联优化?

    我正在实施卡汉求和 http en wikipedia org wiki Kahan summation algorithm 在支持 gcc47 gcc48 clang33 icc13 和 icc14 编译的项目中 作为该算法的一部分 我想

随机推荐

  • 创建位于屏幕下方的页脚元素

    我有一个页面没有填满整个屏幕的高度 但我希望页脚位于屏幕正下方 这样当您开始滚动时它就会显示出来 无论用户的屏幕高度如何 我如何使用 CSS 来实现这一点 EDIT 我努力了 footer position absolute left 0p
  • JavaScript 中的 Require() 函数

    当我打开 Chrome 14 的控制台并输入 require or require 如果这很重要的话 I get ReferenceError 这意味着 JavaScript 默认情况下没有该功能 对吧 至少在网络浏览器上是这样 我为什么要
  • 加载从故事板实例化的 nib 文件

    所以我对这个故事板概念还很陌生 我有一个视图笔尖放入情节提要中 每个视图笔尖都对应于我拥有的 UIViewController 子类 我尝试使用以下代码加载笔尖文件 TestViewController vc TestViewControl
  • 仅在 reloadData 完成后调用函数

    我有一个tableView并且需要执行一次功能tableView已重新加载 我怎么知道是否reloadData已完成 假设我有 methodS 填充tableView 还有一次 tableView1 reloadData 已经完成了 我要调
  • Swagger - Web API - 可选查询参数

    HttpGet Route students SwaggerOperation Tags new Student SwaggerResponse HttpStatusCode OK Type typeof ResponseModel
  • 如何在 iOS 中通过滑动手势实现卷页?

    我需要在 iOS 中使用滑动手势进行卷页 我研究过Leaves项目 https github com brow leaves https github com brow leaves 但不支持滑动手势 有人成功地用滑动手势实现了卷页吗 Th
  • 如何循环jquery返回的JSON数据? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在 MVC 应用程序中返回 JSON 并循环遍历 jQuery 中返回的 json https stackoverflow com questions 5953761 how do i retur
  • 如何允许在 raphael 对象中输入文本,比如矩形?

    我创建了一个拉斐尔矩形 如下所示 var rect1 paper rect 100 100 100 100 现在 我希望当我单击矩形时会出现一个光标 并且允许用户输入 键入一些文本 我对 JS 和 Raphael 非常陌生 这不是拉斐尔的自
  • Spring:在上下文根之外提供静态资源

    在网络应用程序中 我需要提供位于应用程序上下文目录之外的静态内容 图像 整个应用程序架构要求我使用 Tomcat 来执行此操作 我以为我可以从 Spring 中受益
  • Nodejs 驱动程序支持哪些聚合游标方法?

    正如您从 Mongodb 2 6 中了解到的aggregate 操作返回一个游标 但是行为有点不同 http docs mongodb org manual reference method db collection aggregate
  • 垃圾收集是否在 GC.Collect() 之后立即运行? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 这个问题只是为了研究目的 我读过很多关于 C 的书籍 这个问题总是浮现在我的脑海中 据我了解 C 是托管代码 当 CLR 决定何时运行垃圾收
  • LaTeX 中的条件导入?

    我将记下大量的课堂笔记 然后将它们编译成 LaTeX 这样我就可以拥有优秀的文档供将来查看 我正在尝试组织一些事情 以便我可以拥有一堆包含讲座笔记的小文档 然后在学期结束时将它们编译成包含所有这些笔记的大文档 我过去曾成功地使用过 impo
  • 使用 Gradle 覆盖 GCM 权限包前缀

    我有一个 Gradle Android 项目 有 4 种产品风格 每种产品都有自己独特的包名称 这build gradle文件的性质非常简单 buildscript repositories mavenCentral dependencie
  • 将 DataTable 导出到 CSV 时出现逗号问题

    我采用了一些将 DataTable 转换为 CSV 文件的代码 它似乎工作得很好 除了在实际数据中使用逗号时 在这种情况下有没有办法显示逗号 这就是我所做的 StringBuilder sb new StringBuilder IEnume
  • 了解 gc.get_referrers

    我正在尝试跟踪 Python 2 7 中的内存泄漏 我找到了 gc get referrers 但不理解输出 删除后dying node 除了我在狩猎过程中创建的列表之外 这应该删除所有引用 我的代码中有 gc collect print
  • 在 wpf 应用程序中安装窗口服务

    我有两个项目 wpf 和 windows 服务 我已经为 wpf 项目创建了设置 我想使用 wpf 项目安装来安装窗口服务 即一旦用户安装 wpf 项目 窗口服务将自动安装 是否可以 请建议 Thanks None
  • 从相机捕获的iphone图像自动旋转-90度

    以编程方式 我已在应用程序中从相机中获取图像 它已经很好地获取了 但是当我切换到另一个视图并关闭该视图时 我的图像会自动旋转 90 度 这种变化仅在我移动之后第一次发生 当我移动时 没有发生任何变化意味着图像保持在 90 度状态 并且仅当我
  • 如何在 T-SQL 中用年、月、日计算年龄

    在 T SQL SQL Server 2000 中计算某人年龄 以年 月和日为单位 的最佳方法是什么 The datediff函数不能很好地处理年份边界 而且将月份和日期分开将是一个麻烦 我知道我可以相对轻松地在客户端完成此操作 但我希望在
  • PyQt:QGraphicsView中的鼠标事件

    我想用 PyQt 用 Python 编写一个简单的程序 我有一个 QGraphicsScene 我想执行以下操作 使用两个单选按钮有 2 个选项 用于生成点 这样 如果有人单击场景 就会出现一个椭圆 用于选择点 这样 如果有人单击某个点 将
  • 如何从 Linux 帧缓冲区获取 RGB 像素值?

    我想使用 Linux 以最有效的方式获取屏幕像素的 RGB 值 所以我决定使用C中的framebuffer库 fb h 访问帧缓冲设备 dev fb0 并直接从中读取 这是代码 include