framebuffer开发有我想象的那么简单吗

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/49301177 (一):写...
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/49301177

(一):写在前面

在这个小节中,主要介绍了frame buffer中的R,G,B以及透明度的位域属性.由于在上一个小节当中,我自私的以为这几个位域能够获得相应的R,G,B以及透明度的数值,然后再将其转化为图像,但是,经过我后来的学习,发现我错了.正确的将frame buffer读取并转换为图像的方法是首先读取(read)frame buffer,然后,再将读取的char数组转换为相应的图片.所以,后面,着重学习如何读取frame buffer,以及如何将其转化为图片.

(二):R,G,B以及透明度位域

在fb.h头文件中的结构 fb_var_screeninfo中定义了R,G,B以及透明度的位域,他们都是一个结构体fb_bitfield的一个实例.下面我们来看一下bitfield的定义:

struct fb_bitfield {
    __u32 offset;           /* 位域的开始    */
    __u32 length;           /* length of bitfield 位域的长度 */
    __u32 msb_right;        /* != 0 : Most significant bit is right 不等于0,大多数重要的位是右边的 */ 
};

那么如果要打印该值的话,我们就需要使用该结构体.

(三):完善上一节中的p_rgbt(PFBDEV pFbdev)函数

在我们的上一节中,我们留下了这个函数而没有去实现,这个来源于我的无知.所以,现在我们来完善一下这个函数.在上面我们知道这个关系之后,这个函数的实现就显得相对简单了.

//打印R,G,B和透明度
void p_rgbt(PFBDEV pFbdev)
{
    //R位域
    printf("R位域:\n");
    struct fb_bitfield bf = pFbdev->fb_var.red;
    printf("\t开始:%d\n",bf.offset);
    printf("\t长度:%d\n",bf.length);
    printf("\tMSB:%d\n",bf.msb_right);

    //G位域
    printf("G位域:\n");
    bf = pFbdev->fb_var.green;
    printf("\t开始:%d\n",bf.offset);
    printf("\t长度:%d\n",bf.length);
    printf("\tMSB:%d\n",bf.msb_right);

    // B位域
    printf("B位域:\n");
    bf = pFbdev->fb_var.blue;
    printf("\t开始:%d\n",bf.offset);
    printf("\t长度:%d\n",bf.length);
    printf("\tMSB:%d\n",bf.msb_right);

    // 透明度位域
    printf("透明度位域:\n");
    bf = pFbdev->fb_var.transp;
    printf("\t开始:%d\n",bf.offset);
    printf("\t长度:%d\n",bf.length);
    printf("\tMSB:%d\n",bf.msb_right);
}

(四):编译运行方法

编译和运行方法和上一节的编译运行方法是一样的.

(五):运行结果展示

下面我们来看一下我们的运行结果:

frame buffer所占内存的开始地址为:-1341710336
frame buffer 的类型为:0
frame buffer的可见清晰度为:
    x = 1366
    y = 768
frame buffer的虚拟清晰度为:
    x = 1366
    y = 768
frame buffer的虚拟分辨率到可见分辨率的偏移量为:
    x = 0
    y = 0
frame buffer的BPP为:32
R位域:
    开始:16
    长度:8
    MSB:0
G位域:
    开始:8
    长度:8
    MSB:0
B位域:
    开始:0
    长度:8
    MSB:0
透明度位域:
    开始:0
    长度:0
    MSB:0
frame buffer在内存中所占的高度和宽度分别是:
    宽度 = -1
    高度 = -1
R位域:
    开始:16
    长度:8
    MSB:0
G位域:
    开始:8
    长度:8
    MSB:0
B位域:
    开始:0
    长度:8
    MSB:0
透明度位域:
    开始:0
    长度:0
    MSB:0

(六):写在后面

今天很残酷,明天很残酷,后天很没有,但是绝大多数人死在了明天晚上.----马云

注意:源代码我已经长传到github中,下面是地址:

源代码下载

目录
相关文章
|
6月前
|
编解码 Ubuntu Linux
Linux应用开发基础知识——Framebuffer 应用编程(四)
Linux应用开发基础知识——Framebuffer 应用编程(四)
124 0
Linux应用开发基础知识——Framebuffer 应用编程(四)
ly~
|
1月前
|
并行计算 算法 API
SDL 图形库优化对硬件要求有何变化
SDL(Simple DirectMedia Layer)图形库是一个跨平台的多媒体库,适用于多种操作系统和设备。优化后的SDL 2.0对硬件的要求有所提升,特别是显卡性能。优化包括提高渲染效率、利用硬件加速功能、支持高效解码算法等,以增强图形处理能力和流畅度。同时,优化后的SDL对输入设备的交互体验要求更高,需确保键盘、鼠标、触摸屏等设备的顺畅操作。尽管如此,SDL仍保持良好的兼容性,能在较低配置的硬件上运行,只是性能表现会有所差异。
ly~
106 4
|
3月前
|
开发者 图形学 Java
Unity物理引擎深度揭秘:从刚体碰撞到软体模拟,全面解析实现复杂物理交互的技巧与秘诀,助你打造超真实游戏体验
【8月更文挑战第31天】物理模拟在游戏开发中至关重要,可让虚拟世界更真实。Unity作为强大的跨平台游戏引擎,内置物理系统,支持从刚体碰撞到布料模拟的多种功能。通过添加Rigidbody组件,可实现物体受力和碰撞;使用AddForce()施加力;通过关节(如Fixed Joint)连接刚体以模拟复杂结构。Unity还支持软体物理,如布料和绳索模拟,进一步增强场景丰富度。掌握这些技术,可大幅提升游戏的真实感和玩家体验。
114 0
|
5月前
|
编解码 算法 程序员
老程序员分享:OpenGL学习进程(10)第七课:四边形绘制与动画基础
老程序员分享:OpenGL学习进程(10)第七课:四边形绘制与动画基础
|
5月前
|
编解码 图形学 开发者
【unity小技巧】使用三种方式实现瞄准瞄具放大变焦效果
【unity小技巧】使用三种方式实现瞄准瞄具放大变焦效果
95 0
|
6月前
|
定位技术 Python
Pyglet综合应用|推箱子游戏之关卡图片载入内存
Pyglet综合应用|推箱子游戏之关卡图片载入内存
101 0
|
Linux Android开发 芯片
Linux驱动分析之Framebuffer驱动
前面我们了解了LCD的基本架构《Linux驱动分析之LCD驱动架构》,接下来我们拿个具体的实例来分析分析。这样可以了解其大概是如何使用和工作的。
|
小程序 C++ 索引
学习OpenGL之准备工作
学习OpenGL之准备工作
114 0
学习OpenGL之准备工作