如何使用C语言在framebuffer中绘制graphics?

我是这个Linux帧缓冲区的新手,所以任何人都可以引导我在framebuffer中绘制线条图。 我有代码在turbo c中绘制graphics,但现在在linux中。 所以请帮助我。

谢谢,拉胡尔

/dev (例如/dev/fb0 )的右边文件中使用open() ,然后使用mmap()将其映射到内存中。 如果你不知道如何使用这些系统调用,manpages将会帮助你。

那么在<linux/fb.h>有一些ioctl()的结构和常量。 像许多内核头文件一样,您只需浏览文件就可以学到很多东西。

特别有趣的是带有struct fb_var_screeninfo的ioctl FBIOGET_VSCREENINFO 。 注意这有xresyres (分辨率)和bits_per_pixel 。 然后是FBIOGET_FSCREENINFOstruct fb_fix_screeninfo FBIOGET_FSCREENINFO ,它有更多的信息,比如typeline_length

所以(x,y)处的像素可能在mmap_base_address + x * bits_per_pixel/8 + y * line_length 。 像素的确切格式将取决于您通过ioctl检索的结构; 这是你的工作,决定如何读/写他们。

我已经工作了一段时间,所以我有点朦胧的更多的细节..

这里有一个快速和肮脏的代码示例,只是为了说明如何完成…我没有测试过这个。

 #include <sys/types.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <linux/fb.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> int main() { struct fb_var_screeninfo screen_info; struct fb_fix_screeninfo fixed_info; char *buffer = NULL; size_t buflen; int fd = -1; int r = 1; fd = open("/dev/fb0", O_RDWR); if (fd >= 0) { if (!ioctl(fd, FBIOGET_VSCREENINFO, &screen_info) && !ioctl(fd, FBIOGET_FSCREENINFO, &fixed_info)) { buflen = screen_info.yres_virtual * fixed_info.line_length; buffer = mmap(NULL, buflen, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (buffer != MAP_FAILED) { /* * TODO: something interesting here. * "buffer" now points to screen pixels. * Each individual pixel might be at: * buffer + x * screen_info.bits_per_pixel/8 * + y * fixed_info.line_length * Then you can write pixels at locations such as that. */ r = 0; /* Indicate success */ } else { perror("mmap"); } } else { perror("ioctl"); } } else { perror("open"); } /* * Clean up */ if (buffer && buffer != MAP_FAILED) munmap(buffer, buflen); if (fd >= 0) close(fd); return r; } 

作为asveikau答案的替代方案,您可以使用DirectFB ,这可能会大大简化您的工作。

从Rasbian的Synaptic:“DirectFB是一个设计了嵌入式系统的图形库,它以最小的资源使用和开销提供最大的硬件加速性能。

无论如何,我还没有看到帧缓冲区中的这个工作,但我希望这是我的大部分图形。 你有一些线性地址空间,高度*宽度*字节/像素的字节数。 如果要写入特定的x,y位置,则该空间中的位置由(y * width * bytes per pixel)+(x * 3)给出。 颜色是相邻字节RGB(通常),以便获取红色像素的地址,为绿色添加1,为蓝色添加2。 你malloc(高*宽*每像素字节)的地址空间,写入它,然后选择libpng,libjpeg,libtiff选择将该缓冲区写出到文件。 如果你想把文本也放在里面,你必须自己推出,所以我偷了一个旧的libgif。 我已经达到了年龄和经验水平,而我自己做起来更容易,而不是去了解其他人是否应该这样做。 我的图形如下所示: 从rtl_power获取的数据为CSV

我一直在尝试使用帧缓冲,如http://raspberrycompote.blogspot.com/2014/04/low-level-graphics-on-raspberry-pi.html所述,但有些错误&#x3002; 我在Pi 3上,它可能是为2014年的Pi 1而编写的,而不是在2017年。 但是由于GPU运行显示,Pi与传统的帧缓冲区不同。 使用这个方法: http : //elinux.org/RPi_Framebuffer