如何通过Linux帧缓冲区在屏幕上显示某些内容?

2024-01-04

我发现以下代码旨在在屏幕上绘制一个正方形。

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

 int main()
 {
     int fbfd = 0;
     struct fb_var_screeninfo vinfo;
     struct fb_fix_screeninfo finfo;
     long int screensize = 0;
     char *fbp = 0;
     int x = 0, y = 0;
     long int location = 0;

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

 // Get fixed screen information
 if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo) == -1) {
     perror("Error reading fixed information");
     exit(2);
 }

 // Get variable screen information
 if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo) == -1) {
     perror("Error reading variable information");
     exit(3);
 }

 printf("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);

 // 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, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,
                    fbfd, 0);
 if ((int)fbp == -1) {
     perror("Error: failed to map framebuffer device to memory");
     exit(4);
 }
 printf("The framebuffer device was mapped to memory successfully.\n");

 x = 300; y = 100;       // Where we are going to put the pixel

 // Figure out where in memory to put the pixel
 for (y = 100; y < 300; y++)
     for (x = 100; x < 300; 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;
 }

当我运行它时没有错误,但不幸的是,没有任何反应,也没有显示任何内容。我应该怎么做才能在屏幕上获得图片?我正在 ubuntu 14 上工作。


它运行良好。

帧缓冲程序使用 Linux“文本”控制台(它们的作用不仅仅是文本),而不是 XWindows,也不是 ssh 终端会话。

对于大多数用途来说,帧缓冲区并不是一个非常好的接口。写一个接管机器的游戏可能还可以。新的 Linux 桌面程序应该使用 XWindows 兼容的东西。

To run:

  1. 从 XWindows Linux 桌面按 Control+Alt+F1 即可获得 Linux“文本”控制台。 (不要使用终端窗口)。
  2. 使用您的密码登录
  3. 将程序放入square.c。用类似的东西编译程序gcc square.c -o square它会给出关于指针/int 转换的警告,看起来没问题。
  4. [*] use sudo su成为根
  5. 运行编译好的程序./square

它形成一个阴影粉红色正方形。

或者它打印Error: cannot open framebuffer device如果你不是root。

[*] 切勿以 root 身份运行您不完全信任的程序

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

如何通过Linux帧缓冲区在屏幕上显示某些内容? 的相关文章

随机推荐

  • 带图像的 Xamarin Forms ListView |文字|时间

    我目前正在使用 xamarin 表单构建一个混合应用程序 我正在尝试构建一个列表视图 显示带有图标和时间戳的错误 这是我想重新制作成 xamarin 形式的概念设计 我用了一个ImageCell尝试让带有一些文本的图标正常工作 但现在我想在
  • MongoDB 中复合 _id 的预期行为?

    我有一个包含 3 个数字属性的复合 id id KeyA 0 KeyBOARD 0 Key 0 相关数据库的 KeyA 有 200 万个相同值 KeyB 有 50 万个相同值的集群 我的理解是 我可以使用以下命令有效地查询 KeyA 和 K
  • 如何在 JupyterLab 中拆分和合并单元格

    In Jupyter实验室 https jupyterlab readthedocs io en latest 给定以下代码单元格 如何将其拆分为多个单元格 同样 给定以下单元格 如何将它们组合成单个单元格 直接使用 JupyterLab
  • opencv颜色检测

    使用opencv 可以在图像或视频帧中检测某种颜色 在一定范围的rgb值之间 吗 您需要定义 RGB 阈值 并处理图像中适合定义的像素 希望不是整个图像 而是较小的感兴趣区域 可能是移动的前景形状 与所讨论的内容类似here http ww
  • Symfony2:验证因第一个错误而停止

    看来 validator gt validate class Symfony2 的验证服务 http symfony com doc current book validation html在 if 返回之前运行所有验证检查 error班级
  • 尽管 rasterized=True,为什么 matplotlib 图文件大小很大?

    一个简单的例子 from matplotlib pyplot import plot savefig from numpy random import randn plot randn 100 randn 100 500 k alpha 0
  • 智能生成String排列组合的方法

    String database a b c 我想根据给定生成以下字符串序列database a b c aa ab ac ba bb bc ca cb cc aaa 我只能想到一个相当 虚拟 的解决方案 public class JavaA
  • 为什么 findstr 不能正确处理大小写(在某些情况下)?

    在 cmd exe 中编写最近的一些脚本时 我需要使用findstr使用正则表达式 客户需要标准 cmd exe 命令 无 GnuWin32 Cygwin VBS 或 Powershell 我只是想知道变量是否包含任何大写字符并尝试使用 g
  • 在 C# 中绘制到新“层”

    构建一个小绘画程序并尝试合并图层的概念 我使用 PictureBox 控件来显示图像 并从 PictureBox 显示的图像中获取 Graphics 对象并绘制到该对象 我的问题是我试图弄清楚如何绘制覆盖在图片框顶部的新 Graphics
  • 我可以以纵向模式播放视频吗?

    谁能解释一下如何在 iPhone 设备上以纵向模式播放视频 如果您提供一些示例代码以供参考 将会非常有帮助 提前致谢 如果您想使用 MPMoviePlayerController 以纵向模式显示电影 那就更好 让您的视频旋转 90 度 以便
  • Oracle 行争用导致高吞吐量 JMS 应用程序中的死锁错误

    Summary 我有兴趣了解高吞吐量应用程序的最佳实践是什么 这些应用程序具有批量消息试图更新同一行并出现 Oracle 死锁错误的情况 我知道您无法避免这些错误 但是如何优雅地从这些错误中恢复 而不被一次又一次发生的此类死锁错误所困扰 D
  • iOS 熄屏后如何继续监控 iBeacon?

    我正在开发一个 iOS 应用程序来监控 iBeacons 它在前景和背景中都表现良好 我还需要它即使在屏幕关闭时也能保持监控 现在我的问题是 当我用肩部按钮关闭屏幕时 NSLog显示iBeacon信号相应地关闭 RSSI 0 beacon
  • 导航抽屉覆盖操作栏

    我想在我的应用程序中添加导航抽屉 但是我不希望导航抽屉覆盖我的操作栏 操作栏应该始终可见 我搜索了互联网 从 stackoverflow 和一些博客中得到了一些解决方案 但都是相同的 我参考了这个解决方案使用没有 TitleBar 或 Ac
  • 返回列表到 ajax mvc3

    我正在研究MVC3以下是我的控制器 public List
  • 如何构造一个充满一些统一值的 std::array ?

    std array可以用特定值构造 在使用较新的 C 版本的编译时 例如 std array a 1 4 9 但是 它没有构造函数 也没有标准库命名的构造函数习惯用法 采用单个值并复制它 即我们没有 std array
  • 在存在可选参数的情况下如何处理省略号 (...)?

    当我在函数定义中使用可选参数时 我遇到省略号问题 为了澄清 我定义了以下函数 func1 lt function x x 2 2 func3 lt function fun arg curve user arg curve user exp
  • 从 EVP_PKEY 密钥对中提取公钥?

    我正在使用 OpenSSL 的高级在我的应用程序中实现加密 解密方案EVP 函数 因此我可以轻松切换实际使用的算法 而无需更改 API 调用 我可以创建一个密钥pair相对容易 dumbed down no error checking f
  • 无法使用 Web-Assembly rust impl,因为“初始化之前无法访问 '__wbindgen_throw'”错误

    我正在尝试向我的项目添加一些网络程序集 一开始我创建了一个简单的方法来检查我的 webpack 是否运行良好以及我可以使用我的 wasm模块 所以我创建了这样的东西 wasm bindgen pub fn return char gt ch
  • 调试 CGI python

    除了每次浏览器生成错误时查看日志文件之外 是否有任何简单的方法来调试 cgi python 程序 您可以使用cgitb http docs python org library cgitb html模块 这很简单 import cgitb
  • 如何通过Linux帧缓冲区在屏幕上显示某些内容?

    我发现以下代码旨在在屏幕上绘制一个正方形 include