微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过linux framebuffer在屏幕上显示的东西?

我发现下面的代码被devise成在屏幕上画一个方块。

#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 @R_275_4045@ion if (ioctl(fbfd,FBIOGET_FSCREENINFO,&finfo) == -1) { perror("Error reading fixed @R_275_4045@ion"); exit(2); } // Get variable screen @R_275_4045@ion if (ioctl(fbfd,FBIOGET_VSCREENINFO,&vinfo) == -1) { perror("Error reading variable @R_275_4045@ion"); exit(3); } printf("%dx%d,%dbppn",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。

mt19937在C ++中依赖于平台的状态?

获取一个打开TCP端口在Windows中

直接读取.evt / .evtx文件

Win32剪贴板和Alpha通道图像

sqlite上执行SELECT命令

它运行良好。

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

对于大多数目的来说,Framebuffer并不是一个非常漂亮的界面。 编写一个接管机器的游戏也许是可以的。 一个新的Linux桌面程序应该使用与XWindows兼容的东西。

跑步:

从XWindows Linux桌面按下Control + Alt + F1以获得Linux“文本”控制台。 (请不要使用终端窗口)。

用您的密码登录

把程序放在square.c 。 编译程序,像gcc square.c -o square它会给出一个关于指针/ int转换的警告,看起来没问题。

使用sudo su来成为root

运行编译的程序./square

它使阴影粉红色的广场。

或者打印Error: cannot open framebuffer device如果您不是root用户, Error: cannot open framebuffer device 。

永远不要以root身份运行你不完全信任的程序

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐