【LCD 应用编程】获取LCD屏幕参数信息(分辨率、像素深度、RGB格式)

天天见闻 天天见闻 2023-06-16 综合 阅读: 93
摘要: 每个像素点用三种颜色表示:R、G和B。这意味着设备的设备文件/dev/fdX(X=0,1,2...),第二个参数,设备的可变参数信息设置,第三个参数接收类型根据第二个参数变化。//获取设备可变参数信息;struct fb_var_screeninfo fb_var;perror(“open fb failed”);&fb_var;试图获取有关自适应参数的信息。

目录

一、LCD显示的基本原理 1、认识

是帧缓冲,可以看做是一块内存,帧缓冲是一种显示驱动接口,该接口屏蔽了显示设备(如LCD)硬件层面的实现。在应用层看来,显示设备就是一块内存,操作这块内存就相当于在操作显示设备。

在Linux 系统中,显示设备也叫做 设备,LCD就是 设备, 设备对应的设备文件为 /dev/fdX(X=0、1、2 ...),一般 /dev/fb0 代表LCD显示屏。应用程序读写 /dev/fbX 就相当于读写显示设备的显存(显示缓冲区)

2、理解LCD的分辨率和深度

说到显示设备或者图片,我们经常会提到 分辨率 和 像素深度的概念

假设LCD 的分辨率是 800*480,每个像素点用 来表示。

800*480

每行有 800 个像素点,每列有 480 个像素点

每个像素点由R、G、B三种颜色表示

-R 占 5 bit

-G 占 6 bit

-B 占 5 bit

前面说到,显示设备其实可以看做是显示缓冲区,显示缓冲区的大小 = 分辨率 * 像素深度

二、接口函数 ioctl 1、函数声明

ioctl 的用途会根据其传入的参数发生变化,ioctl函数声明如下:

第一个参数是文件描述符,即 设备对应的设备文件 /dev/fdX(X=0、1、2 ...)

第二个参数需传入一个宏,第二个参数决定了 ioctl 函数的用途

第二个参数

含义

获取 设备的可变参数信息

设置 设备的可变参数信息

获取 设备的固有参数信息

第三个参数所传入的类型会随着第二个参数变化。

第二个参数

第三个参数类型

*

*

*

// 获取设备可变参数信息
struct fb_var_screeninfo fb_var;
int fd = 0;
if((fd = open("/dev/fb0", O_RDWR) < 0))
{
    perror("open fb failed");
    exit(-1);
}
ioctl(fd, FBIOGET_VSCREENINFO, &fb_var);

2、结构体介绍

上面第三个参数中涉及到多种结构体 、 ,我们如果要获取到可变参数的信息,势必需要了解对应结构体包含的成员变量。

struct fb_var_screeninfo {
     __u32 xres; /* 可视区域,一行有多少个像素点,X 分辨率 */
     __u32 yres; /* 可视区域,一列有多少个像素点,Y 分辨率 */    
     __u32 bits_per_pixel; /* 每个像素点使用多少个 bit 来描述,也就是像素深度 bpp */
     __u32 grayscale; /* =0 表示彩色, =1 表示灰度, >1 表示 FOURCC 颜色 */
     /* 用于描述 R、G、B 三种颜色分量分别用多少位来表示以及它们各自的偏移量 */
     struct fb_bitfield red; /* Red 颜色分量色域偏移 */
     struct fb_bitfield green; /* Green 颜色分量色域偏移 */
     struct fb_bitfield blue; /* Blue 颜色分量色域偏移 */
     struct fb_bitfield transp; /* 透明度分量色域偏移 */
    
    // ... ...
};

其中 结构体的声明如下。下面的 “偏移量” 可以参考本文最后一部分的结果分析

struct fb_bitfield {
     __u32 offset; /* 偏移量 */
     __u32 length; /* 长度 */
     __u32 msb_right; /* != 0 : Most significant bit is right */
}   

struct fb_fix_screeninfo {
     char id[16]; /* 字符串形式的标识符 */
     unsigned long smem_start; /* 显存的起始地址(物理地址) */
     __u32 smem_len; /* 显存的长度 */
     __u32 type;
     __u32 type_aux;
     __u32 visual;
     __u16 xpanstep;
     __u16 ypanstep;
     __u16 ywrapstep;
     __u32 line_length; /* 一行的字节数 */
     unsigned long mmio_start; /* Start of Memory Mapped I/O(physical address) */
     __u32 mmio_len; /* Length of Memory Mapped I/O */
     __u32 accel; /* Indicate to driver which specific chip/card we have */
     __u16 capabilities;
     __u16 reserved[2];
};

三、获取LCD屏的信息(分辨率、深度)

#include 
#include 
#include 
#include 
#include 
#include 
int main(int args, char **argv)
{
    struct fb_fix_screeninfo fb_fix;        // 固定参数信息
    struct fb_var_screeninfo fb_var;        // 可变参数信息
    int fd = open("/dev/fb0", O_RDWR);
    if (fd < 0)
    {
        perror("open fb failed");
        return -1;
    }
    ioctl(fd, FBIOGET_FSCREENINFO, &fb_fix);    // 获取固定参数信息
    ioctl(fd, FBIOGET_VSCREENINFO, &fb_var);    // 获取可变参数信息
    printf(
        "分辨率:%d * %d \n"    \
        "像素深度:%d bit \n"   \
        "像素格式: R<%d %d> G<%d %d> B<%d %d>\n",  \
        "每行所占大小:%d 字节 \n", \
        fb_var.xres, fb_var.yres, \
        fb_var.bits_per_pixel, \
        fb_var.red.offset, fb_var.red.length,  \
        fb_var.green.offset, fb_var.green.length, \
        fb_var.blue.offset, fb_var.blue.length, \
        fb_fix.line_length
    );
    close(fd);
    return 0;
}

分辨率:每行有 800 个像素点,每列有 480 个像素点

像素深度:用 16bit 来表示每个像素点

像素格式:使用的格式是 ,红色(R)占 5 bit,绿色(G)占 6 bit,蓝色(B)占 5 bit

每行所占字节数 =行像素点数 * 像素深度 = 800 * 16 = 12800 bit = 1600 字节

其他相关
安卓什么手机像素最好 什么手机像素最好

安卓什么手机像素最好 什么手机像素最好

作者: 天天见闻 时间:2024-04-09 阅读: 2
请问:你拍照片和视频时用手机自带相机,还是无他相机呢?哪个拍摄效果更好些随着智能手机的普及,很多朋友外出旅游或者公司活动等,大都不带专业的相机了,占地方不说,还要时刻注意这个“大”家伙丢掉,现在的人们,出门一部手机搞定,现在的手机像素都很好,拍照、视频都是很清晰,还能随手拍几张照片、拍几个视频发个朋友圈,而专业……...
国产手机有哪些品牌 国产手机有哪些

国产手机有哪些品牌 国产手机有哪些

作者: 天天见闻 时间:2024-03-25 阅读: 21
国产苹果的机型都有哪些平果机型有平果4,4s,5,5s,5sE,6,6s,6p,6sp,7,7p,8,8p,x,xs,xR,xsmAx,11,11pro,11promAx,12,12mini,12pro,12promAx苹果还是国内最受欢迎的手机品牌。具体机型方面,iPhone12销量排名第一,iPhone13……...
手机号被拍出两千万 12000万像素怎么样

手机号被拍出两千万 12000万像素怎么样

作者: 天天见闻 时间:2023-11-27 阅读: 73
12000万像素无关紧要。目前手机的最高像素为1.2亿像素(12000万像素)。手机像素的提升一直是手机领域的重要发展方向。随着科技的进步,手机摄像头的像素数也在逐步提高。目前市面上有多款拥有超过1亿像素摄像头的手机,这也是目前手机的最高像素。除了像素数之外,手机摄像头还具备光圈大小、焦距、自动对焦等其他重要性能指标…...
年会奖品选什么?这四款新机值得推荐

年会奖品选什么?这四款新机值得推荐

作者: 天天见闻 时间:2023-10-27 阅读: 77
不过,此次推荐的2017年底新机,凭良心购买作为年会奖品绝对不会落下。当然,由负责人自己购买一台送给家人也不错啊!...
两百万像素拍照是什么样的

两百万像素拍照是什么样的

作者: 天天见闻 时间:2023-10-13 阅读: 82
200万像素的照片是用什么样的200万像素拍摄的是模糊的,分辨率低,扭曲的照片,现在的手机大多是1200万像素。200万像素的手机落后于十几年前的水平。...
vivo Y27 4G正式推出 搭载联发科G85 售价约1100元

vivo Y27 4G正式推出 搭载联发科G85 售价约1100元

作者: 天天见闻 时间:2023-07-21 阅读: 94
手机中国从外媒了解到,作为vivo旗下位于主流市场的产品排列,Y系列机型凭借亲民的定价策略和优异的性能,vivo Y27 4G机身正面采用了目前主流的水滴屏,vivo Y27 4G搭载了6.64英寸屏幕。红酒红和蓝两种配色供消费者选择,800万像素自拍摄像头前置,LED闪光灯,vivo Y27 4G搭载连发科G85芯片...
我来说两句

年度爆文