如何在 Linux (Raspberry Pi) 上从帧缓冲区获取像素颜色

2024-03-23

我正在尝试编写一个小程序来根据屏幕上某些像素的颜色来控制 RGB LED 的颜色。 由于这是在运行 Raspbmc 的 Raspberry Pi 上,我无法使用 XLib,因为所有内容都是从帧缓冲区中绘制的(不确定这是否属实,但从我在常见问题解答中读到的内容来看,情况似乎是这样)。我尝试使用 XLib 但无法检测到显示(这就是它现在不起作用的原因)。

这是我在网上找到的一个例子。问题是,它编译得很好,但运行时,出现第二条错误消息:“读取固定信息时出错”。 我尝试显示 fbfd 的内容,但这会导致分段错误。那么看来 fbfd 中没有写入任何内容?

我无法理解它,因为我发现的有关帧缓冲区的所有内容基本上都是相同的代码,所以我不知道为什么它不起作用。

希望有人可以帮忙!

#include <unistd.h>
#include <fcntl.h>        /* for fcntl */
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>        /* for mmap */
#include <sys/ioctl.h>
#include <linux/fb.h>

#include <stdio.h>
#include <stdlib.h>

int main() {
    long int screensize = 0;    
    int fbfd =0;                    /* frame buffer file descriptor */
    struct fb_var_screeninfo vinfo;
    struct fb_fix_screeninfo finfo;
    char* fbp;                    /* pointer to framebuffer */
    int location;                    /* iterate to location */

    int x, y;                    /* x and y location */

    /* open the file for reading and writing */
    fbfd = open("/dev/fb0", O_RDWR);
    //printf("%s\n",fbfd);
    if (!fbfd) {
        printf("Error: cannot open framebuffer device.\n");
        exit(1);
    }
    printf ("The framebuffer device was opened successfully.\n");

    /* get the fixed screen information */
    if (ioctl (fbfd, FBIOGET_FSCREENINFO, &finfo)) {
        printf("Error reading fixed information.\n");
        exit(2);
    }

    /* get variable screen information */
    if (ioctl (fbfd, FBIOGET_VSCREENINFO, &vinfo)) {
        printf("Error reading variable information.\n");
        exit(3);
    }

    /* figure out the size of the screen in bytes */
    //screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;

    /* map the device to memory */
    fbp = (char*)mmap(0, finfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);

    if ((int)fbp == -1) {
        printf ("Error: failed to map framebuffer device to memory.\n");
        exit(4);
    }
    printf ("Framebuffer device was mapped to memory successfully.\n");

    // Figure out where in memory to put the pixel
    for ( y = 0; y < (vinfo.yres/2); y++ )
        for ( x = 0; x < vinfo.xres; x++ ) { 
            location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) + (y+vinfo.yoffset) * finfo.line_length;
            if ( vinfo.bits_per_pixel == 32 ) { 
                *(fbp + location) = 100; // Some blue 
                *(fbp + location + 1) = 15+(x-100)/2; // A little green 
                *(fbp + location + 2) = 200-(y-100)/5; // A lot of red
                *(fbp + location + 3) = 0; // No transparency 
            } else { //assume 16bpp 
                int b = 10; int g = (x-100)/6; // A little green 
                int r = 31-(y-100)/16; // A lot of red 
                unsigned short int t = r<<11 | g << 5 | b; 
                *((unsigned short int*)(fbp + location)) = t; 
            }
        }
    munmap(fbp, screensize);
    close(fbfd);

    return 0;
}

None

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

如何在 Linux (Raspberry Pi) 上从帧缓冲区获取像素颜色 的相关文章

随机推荐

  • 具有 HTML 支持的 Angular Material 工具提示

    我只是想知道有没有好的第三方angular material tool tip plugin在 的支持下HTML 我在用Material design with Angular 7仅 无引导程序 虽然我正在使用ng2 工具提示指令 http
  • 函数超时(Windows)?

    我正在尝试为特定功能实现超时 我检查了SE中的许多问题 但找不到任何适合我的问题的解决方案 因为 我在 Windows 中运行 python 超时应用于我无法控制的Python函数 即它是在已经设计的模块中定义的 python函数不是子进程
  • 如何通过 ID 检查 Scratch 项目是否被共享?

    我不希望很多人知道这一点 但是有没有办法检查 Scratch 项目 ID 是否属于共享项目 例如 项目 ID3是一个实际项目 但不共享 而 ID399293697是共享的 那么我如何使用 JavaScript 来查看这些是否共享呢 我搜索了
  • “RVM 不是函数”错误

    RVM 已正确安装在我的计算机上 运行 Mac OSX 10 6 8 并且运行良好 奇怪的是 要运行它 我必须使用source rvm scripts rvm对于每个新会话 我尝试从它创建一个符号链接 opt local bin rvm 但
  • 如何删除 poi 3.8 中的超链接?

    我在读取包含 poi 中超链接文本的 Excel 文件时遇到一些问题 数据是这样的 excel文件 1 type category job type position name email 2 测试 开发商 兼职 经理 洪 asdf dsa
  • 广播接收器中的 Android AlarmManager

    我有广播接收器 该广播接收器应安排警报 通常我会这样做 AlarmManager am AlarmManager getSystemService ALARM SERVICE am set AlarmManager RTC time myP
  • 如何保持 Mercurial 存储库较小?

    我的中央存储库存储在 8GB USB 记忆棒上 我不小心提交了一些大文件 因此存储库不再适合放在内存条上 有办法纠正这种情况吗 我投票赞成了吸引人的答案 因为他有你可能会使用的步骤 但这里有一个方便的列表 不过 首先要提醒一下 如果您已经将
  • 使用 Boost::spirit 编写的解析器存在性能问题

    我想解析一个如下所示的文件 类似 FASTA 的文本格式 gt InfoHeader Some text sequence that has a line break after every 80 characters gt InfoHea
  • Facebook og:图像未以全尺寸显示

    从 ElfYourself com 共享视频时 发送到 Facebook 的 OG 图像为 130x130 像素 Facebook 表示 这是它将在新闻提要 时间轴中显示的最大尺寸 然而 Facebook 在图像提要中实际显示的是 90x9
  • 我们可以在 sails 中的 Create() 回调之后/之前更改属性值吗?

    我有一个场景 我必须用模型的 id 填充模型的属性 对于例如 在用户模型中 module exports attributes activation link string afterCreate function value cb val
  • java.lang.ClassNotFoundException:org.apache.commons.fileupload.FileItemFactory [重复]

    这个问题在这里已经有答案了 我已关注本教程 http www tutorialspoint com servlets servlets file uploading htm用于使用 servlet 进行文件上传 这是文件夹结构 使用 Ecl
  • 无法获取默认调试密钥库位置

    我在 Android Studio 设置中更改了项目默认位置 Documents Android Studio projects to Documents AndroidProjects 然后我在文件资源管理器中将现有项目从前者移动到后者
  • Play框架:继承按类型排序

    在我的应用程序中 我有两个课程 Group Model 和一个基类Element 我使用单表策略来持久化这些模型 strategy InheritanceType SINGLE TABLE 因此一列dtype在我的表中创建 我现在尝试根据此
  • 修复了使用 FlatList 进行原生反应的页脚

    下列的这个问题 https stackoverflow com questions 29447715 react native fixed footer在带有 ScrollView 的固定页脚上 我试图在屏幕上实现固定页脚FlatList
  • jquery防止窗口滚动

    我正在 jquery 中开发一个选择菜单替换 首先 我必须通过添加来使新的选择菜单可聚焦tabindex 0 到容器 然后 我禁用原始选择菜单的焦点并将焦点放在新菜单上 当新的焦点被聚焦并按下向上和向下箭头时 选项会相应改变 但有一个大问题
  • 在Python中从pdf中提取印地语编写的文本[重复]

    这个问题在这里已经有答案了 我想从 pdf 文档中提取印地文输入的文本 我已附上示例页面的图像 https i stack imgur com UkT86 jpg我正在处理 我尝试使用 pdfminer 从中获取文本 但文本是乱码 可能是由
  • 悬停时的 jQuery 卡片动画

    当鼠标悬停在其中一张卡片上时 其余卡片应正确地逐一减小大小 例如 将鼠标悬停在卡片 1 上 目前我的解决方案是一一添加和删除类 但我想知道是否有更好的方法使用 jQuery 来完成它 card mouseover function card
  • 超出低磁盘水位线 [??%]

    我在我的开发机器 一台笔记本 中使用 Elasticsearch 1 4 4 一切都设置为默认值 因为我从未更改过任何设置 当我启动它时 我通常会收到以下消息 2015 10 27 09 38 31 588 INFO node Milan
  • Android 应用程序关闭时如何保持 Web 套接字连接处于活动状态

    我正在寻找一个应用程序 向 websocket 发送消息 以便在计算机内的特定参数发生变化时启用通知 参数在计算机中发生变化 通过 websocket 传输 然后到达我的应用程序 这部分是正确的 对吧 即使我的应用程序关闭 我如何接收这些
  • 如何在 Linux (Raspberry Pi) 上从帧缓冲区获取像素颜色

    我正在尝试编写一个小程序来根据屏幕上某些像素的颜色来控制 RGB LED 的颜色 由于这是在运行 Raspbmc 的 Raspberry Pi 上 我无法使用 XLib 因为所有内容都是从帧缓冲区中绘制的 不确定这是否属实 但从我在常见问题