framebuffer帧缓存

1. framebuffer

Framebuffer(帧缓冲区)是用于存储图像数据的一块内存区域。我们可以将我们想要显示的图像数据写到framebuffer中,驱动程序每隔一段时间会自动的去读取Framebuffer中的图像数据,并根据读取到的图像数据在屏幕上显示对应的图像。

2. 颜色的表示

 我们知道一幅图像其实是由一个一个的像素点组成的,诸多的不同颜色的像素最终组成了一幅图像,因此上面提到的图像数据指的就是这一幅图像中每个像素点的颜色数据。

 在美术中,将红绿蓝三种颜色称为三原色,通过将不同亮度的三元色进行组合,就可以调配出任何一种颜色。在计算机中颜色数据的表示同样利用了这个原理。在计算机中,颜色通常用 RGB(红绿蓝)模型来表示。RGB 模型将颜色描述为三个分量的组合,即红色、绿色和蓝色分量的亮度值。而根据每个分量所占的位数不同,又产生了三种不同的颜色格式,分别为:RGB888 、RGB565、RGB555。

RGB888:

RGB888 格式使用 24 位来表示一个像素的颜色信息,其中 8 位用于红色通道、8 位用于绿色通道、8 位用于蓝色通道。这意味着每个颜色通道可以有 256(2^8)种不同的亮度级别,共同组合形成一个广泛的颜色范围。

RGB565:

RGB565 格式使用 16 位来表示一个像素的颜色信息,其中 5 位用于红色通道、6 位用于绿色通道、5 位用于蓝色通道。这种格式相比 RGB888 来说更加节省存储空间,但同时牺牲了一定的颜色精度。

RGB555:

RGB555 格式也使用 16 位来表示一个像素的颜色信息,其中 5 位用于红色通道、5 位用于绿色通道、5 位用于蓝色通道。与 RGB565 相比,RGB555 在绿色通道上减少了一位,因此在绿色调性上可能会略显不足,但整体颜色表现仍比较均衡。

第(x,y)个像素点地址为 :y*(屏幕x轴最大宽度)+ x

FrameBuffer 开发流程:

1.打开设备(/dev/fd0)
2.获取显示设备相关参数(分辨率,位深度)
3.建立内存映射(映射物理显存到用户虚拟内存空间)
4.写入RGB颜色值
5.解除显存映射
6.关闭设备

void *pmem;
struct fb_var_screeninfo vinf;int init_fb(char *devname)
{//1. 打开显示设备int fd = open(devname, O_RDWR);	if (-1 == fd){perror("fail open fb");return -1;}//2、获取显示设备相关参数 分辨率 位深度int ret = ioctl(fd, FBIOGET_VSCREENINFO, &vinf);if (-1 ==ret){perror("fail ioctl");return -1;}printf("xres = %d, yres = %d\n", vinf.xres, vinf.yres);printf("xres_virtual = %d, yres_virtual = %d\n", vinf.xres_virtual, vinf.yres_virtual);printf("bits_per_pixel : %d\n", vinf.bits_per_pixel);size_t len = vinf.xres_virtual * vinf.yres_virtual * vinf.bits_per_pixel/8;//3, 建立显存和用户空间的映射关系pmem = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if ((void *)-1 == pmem){perror("fail mmap");return -1;}return fd;
}void draw_point(int x, int y, unsigned int col)
{if (x >= vinf.xres || y >= vinf.yres){return ;}if (vinf.bits_per_pixel == RGB888_FMT){unsigned int *p = pmem;*(p + y * vinf.xres_virtual + x) = col;}else if (vinf.bits_per_pixel == RGB565_FMT){unsigned short *p  = pmem;	*(p + y * vinf.xres_virtual + x) = col;}return ;
}void uninit_fb(int fd)
{size_t len = vinf.xres_virtual * vinf.yres_virtual * vinf.bits_per_pixel/8;munmap(pmem, len);close(fd);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/421103.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最全整理:R/Rstudio/R包的更新

R 是开源的数据分析和统计计算语言,功能强大且应用广泛,R 的版本更新频率较高。最近处理数据时突然有一个 R 包无法安装,细探究发现这个 R 包需要新版本 R 的才可以安装。本文主要分享:更新 R、更新 Rstudio 和一键升级 R 包。 更…

web项目如何部署到服务器上呢?——麻烦的方法

只需关注web项目如何部署到服务器上,因为服务器运行时就可以访问web项目了。 一、麻烦的方法 1、首先启动服务器 (1)找到bin文件夹 (2)双击运行startup.bat文件 (3)运行之后的界面如下&#…

上海亚商投顾:沪指探底回升 华为产业链午后爆发

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日探底回升,深成指、创业板指盘中跌逾1%,午后集体拉升翻红。华为产业链午后走强…

Mysql系列-索引简介

索引是排好序的数据结构 1 索引数据结构 hash索引、二叉树、平衡二叉树、B-Tree、BTree 数据结构在线示例:点击跳转 2 索引类型 2.1 聚簇索引 又叫“聚集索引” ,索引和数据存储在一起 2.2 非聚簇索引 又叫“非聚集索引” ,索引和数据分开…

Linux系统玩ppsspp

安装ppsspp 在ppsspp的官网,有提供Linux版本的下载链接,仔细一看是flathub的链接,也就是说ppsspp官方推荐采用flatpak安装。 确实有一些发行版提供了自己的ppsspp包,比如说openSUSE和Fedora,不过我自己试用以后发现系…

我的创作纪念日——第0x100天

官方提示今天是开始创作的第256天,最初没反应过来第256天算是个什么纪念日,好像并没什么特殊的啊。仔细一想,难道是第0x100天的意思吗?哈哈,专属于程序猿的浪漫。 既然这样,还是写一篇文章,交个…

前端使用 Konva 实现可视化设计器(22)- 绘制图形(矩形、直线、折线)

本章分享一下如何使用 Konva 绘制基础图形:矩形、直线、折线,希望大家继续关注和支持哈! 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue 哟~ github源码 gitee源码 示例地址 矩形 先上效…

实现C程序绑定TCP端口

实现C程序绑定TCP端口 步骤概述伪代码C代码实现解释在网络编程中,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。绑定TCP端口是服务器端应用程序在网络通信中的一个关键步骤,它允许服务器监听来自客户端的连接请求。 本文将介绍如何使用C语言…

Caffenie配合Redis做两级缓存

一、什么是两级缓存 在项目中。一级缓存用Caffeine,二级缓存用Redis,查询数据时首先查本地的Caffeine缓存,没有命中再通过网络去访问Redis缓存,还是没有命中再查数据库。具体流程如下 二、简单的二级缓存实现-v1 目录结构 2…

基于SpringBoot+Vue+MySQL的房屋租赁管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿沟,信息的…

uniapp 携带网址跳转webview页面报错解决

然后红框中的代码正常执行的 解决方案: 向webview页面携带参数时做以下处理: 接参后做以下处理: 效果展示:

谷歌怎么导入egd书签

https://support.google.com/chrome/answer/96816?hlzh-Hans

0906作业+思维导图梳理

一、作业: 1、创捷一个类似于qq登录的界面 1)源代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//QPushbutton:登录、退出this-…

代码随想录训练营 Day56打卡 图论part06 108. 冗余连接 109. 冗余连接II

代码随想录训练营 Day56打卡 图论part06 一、卡码108. 冗余连接 题目描述 有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图),如图&…

二、Android Studio集成ffmpeg so

目录 1、前言 2、新建AS工程 2.1 选择Native C 2.2 按图编辑和编辑 2.3 选择C标准 2.4 最初工程目录展示 3、拷贝so库到AS 4、编辑CMakeLists.txt 5、修改build.gradle 6、编辑Native-lib.cpp 7、修改MainActivity.java 8、效果展示 1、前言 本文章之前也是参考了…

HTML5中IndexedDB前端本地数据库

一、indexedDB为何替代了Web SQL Database? 跟小朋友的教育从来没有什么“赢在起跑线”这种说法一样,在前端领域,也不是哪来先出来哪个就在日后引领风骚的。 HTML5 indexedDB和Web SQL Database都是本地数据库数据存储,Web SQL Da…

DX-5009N 10G交换机 SFP接口+猫棒 代替运营商光猫 【注册状态O5但是无法PPPoe拨号踩坑——交换机VLAN配置】

买了个诺基亚 猫棒,准备代替光猫,还弱电箱一个清净 参数填完一切正常,注册状态O5 但是openwrt拨号死活上不去。windows拨号也是651 网络架构 SPF口与网口8为同一vlan,做光电转换,交给路由器wan口 路由器PPPoe拨号 1-7网…

『功能项目』播放动画时禁止点击移动【40】

我们打开上一篇39GameObject对象池 - 第三职业的项目, 本章要做的事情是在第三职业播放续航攻击动画时禁止点击时触发的移动函数,换句话说是在播放攻击动画时禁止移动 修改脚本:PlayerRayClickNavigation.cs 运行项目 - 播放第三职业续航技能…

(十四)、为 SpringCloud 项目生成 Docker 镜像

文章目录 1、原理2、最佳实践2.1、获得 SpringCloud 微服务启动模块的 jar 文件2.2、准备文件夹和 Dockerfile 文件2.3、 Dockerfile 文件的内容2.4、通过命令行构件新镜像 3、异常情况和处理:failed to create LLB definition3.1、现象3.2、解决配置国内镜像仓库清…

OpenGL——着色器画一个点

一、 绘制 在窗口中间画一个像素点&#xff1a; #include <GL/glew.h> #include <GLFW/glfw3.h> #include <iostream>using namespace std;#define numVAOs 1GLuint renderingProgram; GLuint vao[numVAOs];GLuint createShaderProgram () {const char *v…