如何从 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# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

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

    我有一个页面没有填满整个屏幕的高度 但我希望页脚位于屏幕正下方 这样当您开始滚动时它就会显示出来 无论用户的屏幕高度如何 我如何使用 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