linux应用编程--FrameBuffer

Frame 是帧的意思,buffer 是缓冲的意思,所以 Framebuffer 就是帧缓冲,这意味着 Framebuffer 就是一 块内存,里面保存着一帧图像。帧缓冲(framebuffer)是 Linux 系统中的一种显示驱动接口,它将显示设备 (譬如 LCD)进行抽象、屏蔽了不同显示设备硬件的实现,对应用层抽象为一块显示内存(显存),它允 许上层应用程序直接对显示缓冲区进行读写操作,而用户不必关心物理显存的位置等具体细节,这些都由 Framebuffer 设备驱动来完成。

所以在 Linux 系统中,显示设备被称为 FrameBuffer 设备(帧缓冲设备),所以 LCD 显示屏自然而言 就是 FrameBuffer 设备。FrameBuffer 设备对应的设备文件为/dev/fbX(X 为数字,0、1、2、3 等),Linux 下可支持多个 FrameBuffer 设备,最多可达 32 个,分别为/dev/fb0 到/dev/fb31,开发板出厂系统中,/dev/fb0 设备节点便是 LCD 屏。

应用程序读写/dev/fbX 就相当于读写显示设备的显示缓冲区(显存),譬如 LCD 的分辨率是 800*480, 每一个像素点的颜色用 24 位(譬如 RGB888)来表示,那么这个显示缓冲区的大小就是 800 x 480 x 24 / 8 = 1152000 个字节。譬如执行下面这条命令将 LCD 清屏,也就是将其填充为黑色(假设 LCD 对应的设备节点 是/dev/fb0,分辨率为 800*480,RGB888 格式):

dd if=/dev/zero of=/dev/fb0 bs=1024 count=1125

这条命令的作用就是将 1125x1024 个字节数据全部写入到 LCD 显存中,并且这些数据都是 0x0。

LCD应用编程介绍:

步骤:1.首先打开/dev/fbx设备文件

2.使用ioctl()函数获取当前显示设备的参数信息

3.使用存储映射I/O方式将屏幕的显示缓冲区映射到用户空间(mmap)

4映射成功后就可以直接读写屏幕的显示缓冲区,进行绘图和图片显示等操作

5.完成显示后,调用munmap()取消映射,并调用close()关闭设备文件。

使用ioctl()获取屏幕参数数据

对于Framebuffer()设备来说,常用的request()包括FBIOGET_VSCREENINFO、FBIOPUT_VSCREENINFO、FBIOGET_FSCREENINFO。

FBIOGET_VSCREENINFO:表示获取设备的可变参数信息,可变参数信息使用struct fb_var_screeninfo结构体来描述,所以此时ioctl() 需要有参数参数,它会是一个struct fb_var_screeninfo *指针,指向 struct fb_var_screeninfo 类型对象,

struct fb_var_screeninfo fb_var;

 ioctl(fd, FBIOGET_VSCREENINFO, &fb_var);

FBIOPUT_VSCREENINFO:表示涉笔设备的可变参数信息,既然是可变参数,那说 明应用层可对其进行修改、重新配置,当然前提条件是底层驱动支持这些参数的动态调整,譬如在 我们的 Windows 系统中,用户可以修改屏幕的显示分辨率,这就是一种动态调整。同样此时 ioctl() 需要有第三个参数,也是一个 struct fb_var_screeninfo *指针,指向 struct fb_var_screeninfo 类型对 象,表示用 struct fb_var_screeninfo 对象中填充的数据设置 LCD,如下所示:

FBIOGET_FSCREENINFO:表示获取设备的固定参数信息,,既然是固定参数,那就 意味着应用程序不可修改。固定参数信息使用struct fb_fix_screeninfo结构体来描述,所以此时ioctl() 需要有第三个参数,它是一个 struct fb_fix_screeninfo *指针,指向 struct fb_fix_screeninfo 类型对象, 调用 ioctl()会将 LCD 的固定参数信息保存在 struct fb_fix_screeninfo 对象中,如下所示:

struct fb_fix_screeninfo fb_fix;

ioctl(fd, FBIOGET_FSCREENINFO, &fb_fix);

上面所提到的三个宏定义 FBIOGET_VSCREENINFO 、 FBIOPUT_VSCREENINFO 、 FBIOGET_FSCREENINFO 以及 2 个数据结构 struct fb_var_screeninfo 和 struct fb_fix_screeninfo 都定义在 头文件中,所以在我们的应用程序中需要包含该头文件。

struct fb_var_screeninfo 结构体:通过 xres、yres 获取到屏幕的水平分辨率和垂直分辨率,bits_per_pixel 表示像素深度 bpp,即每一个像 素点使用多少个 bit 位来描述它的颜色,通过 xres * yres * bits_per_pixel / 8 计算可得到整个显示缓存区的大 小。red、green、blue 描述了 RGB 颜色值中 R、G、B 三种颜色通道分别使用多少 bit 来表示以及它们各自 的偏移量,通过 red、green、blue 变量可知道 LCD 的 RGB 像素格式,譬如是 RGB888 还是 RGB565,亦或 者是 BGR888、BGR565 等。

struct fb_bitfield 结构体如下所示:smem_start 表示显存的起始地址,这是一个物理地址,当然在应用层无法直接使用;smem_len 表示显 存的长度,这个长度并一定等于 LCD 实际的显存大小。line_length 表示屏幕的一行像素点有多少个字节, 通常可以使用 line_length * yres 来得到屏幕显示缓冲区的大小。

显示BMP图片:

BMP图片介绍:BMP文件的图像深度可选有1、4、8、16、24、32bit。典型的BMP图片有四部分组成:

1.BMP文件头:里面包含了文件的格式,大小,位图数据偏移量。

2.位图信息头:它包含了位图信息头的大小,图像的尺寸,图像大小,位平面数、压缩方式以及颜色索引等信息

3.调色板:这部分可选,如果使用索引来表示图像,调色板即使索引与其对应颜色的映射表

4.位图数据:也就是图像数据

BMP 文件头、位图信息头、调色板和位图数据,总结如下表所示:

一般常见的图像都是以 16 位(R、G、B 三种颜色分别使用 5bit、6bit、5bit 来表示)、24 位(R、G、 B 三种颜色都使用 8bit 来表示)色图像为主,我们称这样的图像为真彩色图像,真彩色图像是不需要调色板 的,即位图信息头后面紧跟的就是位图数据了。

一:bmp头文件

Windows 下为 bmp 文件头定义了如下结构体:

typedef struct tagBITMAPFILEHEADER {

UINT16 bfType; DWORD bfSize;

UINT16 bfReserved1;

UINT16 bfReserved2;

DWORD bfOffBits;

} BITMAPFILEHEADER;

00~01H:0x42、0x4D 对应的 ASCII 字符分别为为 B、M,表示这是 Windows 所支持的位图格式,该字 段必须是“BM”才是 Windows 位图文件。 02~05H:对应于文件大小,0x000BB848=768072 字节,与 image.bmp 文件大小是相符的。 06~09H:保留字段。 0A~0D:0x00000046=70,即从文件头部开始到位图数据需要偏移 70 个字节。 bmp 文件头的大小固定为 14 个字节。

二、位图信息头

  • 28
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值