framebuffer帧缓存

framebuffer:帧缓冲,帧缓存

Linux内核为显示提供的一套应用程序接口。(驱动内核支持)

framebuffer本质上是一块显示缓存,往显示缓存中写入特定格式的数据就意味着向屏幕输出内容。framebuffer驱动程序控制LCD显示设备,通过映射framebuffer设备到用户空间,应用程序可以直接对显存进行操作,从而控制LCD显示内容

framebuffer使用

显示屏:800*600(横向有800个像素点,纵向有600个像素点)

显卡(显存(保存像素点的值))

RGB

888(R,G,B各占八个比特)

PC,4412:RGB888

S3C2440:RGB565

显存空间不允许用户直接访问

所以可以采用内存映射,将用户空间与显存空间建立起一一对应的关系

根据显存的大小的多少,来申请空间

1.打开显示设备(/dev/fb0)

2.获取显示设备相关参数(分辨率、位深度)

3.建立内存映射

4.写入RGB颜色值

5.解除映射

6.关闭显示设备

和硬件有关的接口都只能用open打开

获取显示设备相关文件

/usr/include/linux/fb.h

偏移量:从什么位置开始映射

framebuffer使用:

1.获取显示设备相关参数

int init_fb(char *devname)
{int fd = open(devname, O_RDWR);	if (-1 == fd){perror("fail open fb");return -1;}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;pmem = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if ((void *)-1 == pmem){perror("fail mmap");return -1;}return fd;
}

2.画点

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 ;
}

3.清屏

void screen_clear(int color)
{int i = 0;int j = 0;for(i = 0;i < vinf.xres;++i){for(j = 0;j < vinf.yres;++j){draw_point(i,j,color);}}
}

4.划线

void draw_line(int x1,int x2,int y1,int y2,int color)
{if(x1 > 0 && x1 < vinf.xres_virtual && x2 > 0 && x2 < vinf.xres_virtual && y1 > 0 && y1 < vinf.yres_virtual && y2 > 0 && y2 < vinf.yres_virtual){int xmax = x1 > x2 ? x1 : x2;int xmin = x1 > x2 ? x2 : x1;int x = 0;int y = 0;if(x1 == x2){int ymax = y1 > y2 ? y1 : y2;int ymin = y1 > y2 ? y2 : y1;for(y = ymin;y < ymax;++y){draw_point(x1,y,color);}}for(x = xmin;x < xmax;x++){y = (x - x1)*(y2 - y1) / (x1 - x2) + y1;draw_point(x,y,color);}}
}

5.画圆

void draw_circle(int a,int b,int r,int color)
{int x = 0;int y = 0;int tmp;for(x = a -r;x < a + r;++x){tmp = sqrt(r*r - (x-a)*(x-a));int ymax = b + tmp;int ymin = b - tmp;for(y = ymin;y < ymax;++y){draw_point(x,y,color);}}
}

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

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

相关文章

进程与计划任务

top 查看进程 x users 表示有几个shell开启 x stopped 前台任务在后台暂停firefox & 在后台运行&#xff0c;不在前面显示 ​​​​​​​这种方式常用于需要长时间运行且不需要即时交互的程序或命令&#xff0c;以便用户可以在终端中使用其他命令或进行其他操作&#…

JAVA实习生(月薪3K-5K)应该具备哪些知识、能力

实习生其实属于 Java 基础水平&#xff0c;所以应该具备有基础知识的能力如下: 1、Java 语言基础 Java 语言基础是 Java 开发的必备知识&#xff0c;包括语法、数据类型、运算符、控制语句、类和对象等内容。掌握 Java 语言基础是进一步深入学习和应用的某础 也是通过Java编写…

Linux平台屏幕|摄像头采集并实现RTMP推送两种技术方案探究

技术背景 随着国产化操作系统的推进&#xff0c;市场对国产化操作系统下的生态构建&#xff0c;需求越来越迫切&#xff0c;特别是音视频这块&#xff0c;今天我们讨论的是如何在linux平台实现屏幕|摄像头采集&#xff0c;并推送至RTMP服务。 我们知道&#xff0c;Linux平台&…

debug对于开发工程师很重要

在日常开发中&#xff0c;总会遇到一些出人意料的bug&#xff0c;程序跑飞&#xff0c;上电就挂&#xff0c;程序没有按预期执行诸如此类的问题&#xff0c;没有好的调试方法&#xff0c;真的很难定位问题&#xff0c;更别说解决了。在这里分享我用过的一些调试方法&#xff0c…

后端开发面经系列--百度秋招一二三面

百度秋招一二三面 公众号&#xff1a;阿Q技术站 来源&#xff1a;https://www.nowcoder.com/discuss/550679042400317440 一面 1、虚函数&#xff1f; 什么是虚函数&#xff1a; 虚函数是在基类中声明的&#xff0c;而在派生类中进行重写&#xff08;override&#xff09…

“论剑”智算时代,长沙已经站在计算产业的“华山之巅”

文 | 智能相对论 作者 | 陈泊丞 共赴全新十年之约&#xff0c;长沙又来搞大事情了&#xff01; 2024互联网岳麓峰会以“AI汇湘江 数智领航未来”为主题&#xff0c;全面聚焦在“AI”时代把握数字化、网络化、智能化发展机遇&#xff0c;积极响应当前人工智能技术迅猛发展的势…

Qt5.4.1连接odbc驱动操作达梦数据库

Qt5.4.1连接odbc驱动操作达梦数据库 1 环境介绍2 Qt5.4.1 安装2.1 图形化界面安装Qt5.4.12.2 配置Qt5.4.1 环境变量2.3 Qt5.4.1 生成 libqsqlodbc.so 并配置2.3.1 生成Makefile2.3.2 查看 libqsqlodbc.so 文件并配置 3 配置Qt测试用例4 达梦数据库学习使用列表 1 环境介绍 CPU…

实现卷积层的前向传播(Pythom版)

在TensorFlow框架中&#xff0c;实现卷积层&#xff08;2维&#xff09;的代码是 tf.keras.layers.Conv2D()。它主要接收如下几个参数&#xff0c; filters&#xff1a;卷积核的个数&#xff0c;也就是卷积层输出的通道数&#xff08;沿axis-1的维度&#xff09; kernel_size&a…

【CSS】mask-image属性的详细介绍

mask-image属性是CSS中一个用于指定元素遮罩图像的属性。它允许开发者通过图像来遮罩元素的背景或其他图像内容&#xff0c;实现复杂的视觉效果。以下是对mask-image属性的详细介绍&#xff1a; 一、属性定义 mask-image属性定义了一个图像的遮罩层&#xff0c;该遮罩层将应用…

风语者:CG-23超声波风速风向传感器,与自然对话的桥梁

超声波风速风向传感器&#xff0c;又名超声波风速风向计或超声波风速风向仪&#xff0c;是一款基于超声波原理研发的风速风向测量仪器。以下是对该传感器的详细介绍&#xff1a; 一、工作原理 超声波风速风向传感器的工作原理主要基于超声波时差法。传感器通常由发射器和接收…

性能碾压pandas、polars的数据分析神器来了

来源&#xff1a;python大数据分析 费弗里 1 简介 就在几天前&#xff0c;经过六年多的持续开发迭代&#xff0c;著名的开源高性能分析型数据库DuckDB发布了其1.0.0正式版本。 DuckDB具有极强的单机数据分析性能表现&#xff0c;功能丰富&#xff0c;具有诸多拓展插件&#xf…

时空特征融合方向小论文创新点一次性都给你!看到就是赚到

朋友们&#xff0c;今天给大家推荐一个发小论文很不错的方向&#xff1a;时空特征融合。 时空特征融合是一种提高模型性能和准确性的关键技术&#xff0c;通过结合空间和时间维度的信息&#xff0c;它可以显著提高模型的预测精度和泛化能力&#xff0c;给我们提供更全面的数据…

惊!还有这种邮件群发神器!?

邮件群发工具是推广营销的重要利器。这种软件具备强大的功能&#xff0c;能够批量发送邮件&#xff0c;确保所发送的邮件不易被标记为垃圾邮件。同时&#xff0c;它还包括自动地址采集和整理功能&#xff0c;能够快速获取邮箱地址&#xff0c;省去了寻找地址的麻烦。 功能亮点&…

Trm理论 2(Word2Vec)

神经网络模型&#xff08;NNLM&#xff09;和Word2Vec NNLM模型是上次说过的模型&#xff0c;其目的是为了预测下一个词。 softmax(w2tanh(w1x b1)b2) 会得到一个副产品词向量 而Word2Vue就是专门求词向量的模型 softmax(w2*(w1*x b1)b2) Word2Vec softmax(w2*(w1*x b1)b…

好父母的新定义,看完后,你就不会再焦虑了!

前言 曾几何时&#xff0c;我们认为的完美父母应该是不打不骂&#xff0c;不吼不叫&#xff0c;能够理解孩子的需求&#xff0c;能够接受孩子的情绪&#xff0c;能够温和且坚定的拒绝孩子的请求..... 是的&#xff0c;这些都没有错&#xff0c;但我们把自己放在哪里&#xff…

Android SSE 单向接收数据

Server-Sent Events&#xff08;SSE&#xff09;是一种在客户端和服务器之间实现单向实时通信的技术。它允许服务器向客户端推送数据&#xff0c;但客户端无法使用 SSE 向服务器发送数据。这使得其适用于需要持续接收服务器数据的应用场景&#xff08;如实时通知、股票行情、社…

连续信号的matlab表示

复习信号与系统以及matlab 在matlab中连续信号使用较小的采样间隔来表四 1.单位阶跃信号 阶跃信号:一个理想的单位阶跃信号在时间 t 0 之前值为0&#xff0c;在 t 0 及之后值突然变为常数 A&#xff08;通常取 A 1&#xff09; %matlab表示连续信号,是让信号的采样间隔很小…

鸿蒙 ArkTS声明式 UI 语法

鸿蒙&#xff08;HarmonyOS&#xff09;的ArkTS&#xff08;ArkUI的TypeScript扩展&#xff09;确实支持声明式UI语法&#xff0c;这种语法允许开发者以声明的方式描述UI组件的结构、样式和行为&#xff0c;而不是直接操作DOM或类似的结构。然而&#xff0c;需要注意的是&#…

Unity3D DOTS系列之Struct Change核心机制详解

在Unity3D的DOTS&#xff08;Data-Oriented Technology Stack&#xff09;体系中&#xff0c;Struct Change是一个核心的内存管理机制&#xff0c;它涉及对Entity和Component数据的重新排列和内存分配。DOTS通过ECS&#xff08;Entity Component System&#xff09;模型&#x…

Python 中的 SHAP 简介

本文中有多篇计划文章,后期会补充相关链接。鉴于公众号内无法后期修改文章,请关注原文链接。 如何创建和解释 SHAP 图:瀑布图、力图、平均 SHAP 图、蜂群图和依赖图 可直接在橱窗里购买,或者到文末领取优惠后购买: SHAP 是用于理解和调试模型的最强大的 Python 包。它可以…