当前位置: 首页 > news >正文

framebuffer

framebuffer:帧缓冲、帧缓存

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

分辨率:像素点的总和

像素点:

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

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

RGB:(8个bitR,8个bitG,8个bitB)

RGB888(PC,4412)

RGB565(S3C2440)

原理:

通过内存映射技术,向显存空间写入RGB值

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

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

3.建立内存映射

4.写入RGB颜色值

5.解除映射

6.关闭显

#include "framebuffer.h"
#include <linux/fb.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <math.h>void* pmem;
struct fb_var_screeninfo vinf;
//初始化
int init_fb(char *devname)
{int fd = open(devname, O_RDWR);if(-1 == fd){perror("open fail");return -1;}int ret = ioctl(fd, FBIOGET_VSCREENINFO, &vinf);if(-1 == ret){perror("ioctl fail");return -1;}size_t len = vinf.xres_virtual * vinf.xres_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;}
//点
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 = (unsigned int*)pmem;*(p + y * vinf.xres_virtual + x) = col;}else if (vinf.bits_per_pixel == RGB565_FMT){unsigned short *p  = (unsigned short*)pmem;*(p + y * vinf.xres_virtual + x) = col;}return ;
}
//横线
void draw_xline(int x, int y, int xlen, unsigned int col)
{if (x >= vinf.xres || y >= vinf.yres){return ;}int i = 0;for(i = 0; i < xlen; ++i){if (vinf.bits_per_pixel == RGB888_FMT){unsigned int *p = (unsigned int*)pmem;*(p + y * vinf.xres_virtual + (x + i)) = col;}else if (vinf.bits_per_pixel == RGB565_FMT){unsigned short *p  = (unsigned short*)pmem;*(p + y  * vinf.xres_virtual + (x + i)) = col;}}return ;}
//竖线
void draw_yline(int x, int y, int ylen, unsigned int col)
{if (x >= vinf.xres || y >= vinf.yres){return ;}int i = 0;for(i = 0; i < ylen; ++i){if (vinf.bits_per_pixel == RGB888_FMT){unsigned int *p = (unsigned int*)pmem;*(p + (y + i) * vinf.xres_virtual + x) = col;}else if (vinf.bits_per_pixel == RGB565_FMT){unsigned short *p  = (unsigned short*)pmem;*(p + (y + i) * vinf.xres_virtual + x) = col;}}return ;}
//矩形
void draw_rectangle(int x, int y, int xlen, int ylen, unsigned int col)
{if (x >= vinf.xres || y >= vinf.yres){return ;}draw_xline(x,y,xlen,col);draw_xline(x,y + ylen, xlen, col);draw_yline(x,y,ylen,col);draw_yline(x + xlen, y, ylen, col);return ;
}
//清屏
void clear_scream_col(unsigned int col)
{int i = 0, j = 0;for(i = 0; i < vinf.xres; ++i){for(j = 0; j < vinf.yres; ++j){draw_point(i, j, col);}}}
//斜线
void draw_xyline(double x1, double y1, double x2, double y2, unsigned int col)
{double k = (y2 - y1) / (x2 - x1);double b = y1 - (k * x1);int i = 0;for(i = 0; i < (x2 - x1); ++i){draw_point((int)x1 + i, (int)(k * (x1 + i) + b), col);}return ;
}
//圆
void draw_circle(double x, double y, double r, unsigned int col)
{double a = x, b = y;int i = 0;for (i = 0; i < 360; i++) {  float theta = 2 * 3.14 * i / 360; float x1 = r * cos(theta) + x;   float y1 = r * sin(theta) + y;draw_point(x1,y1,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);
}

示设备

相关文章:

framebuffer

framebuffer&#xff1a;帧缓冲、帧缓存 Linux内核为显示提供的一套应用程序接口&#xff08;驱动内核支持&#xff09; 分辨率&#xff1a;像素点的总和 像素点&#xff1a; 显示屏&#xff1a;800*600&#xff08;横向有800个像素点&#xff0c;纵向有600个像素点&#x…...

7.科学计算模块Numpy(4)ndarray数组的常用操作(二)

引言 书接上回&#xff0c;numpy能作为python中最受欢迎的数据处理模块&#xff0c;脱离不了它最核心的部件——ndarray数组。那么&#xff0c;我们今天就来了解一下numpy中对ndarray的常用操作。 通过阅读本篇博客&#xff0c;你可以&#xff1a; 1.掌握ndarray数组的分割 …...

抖音评论区截流脚本软件详细使用教学,抖音私域获客引流的五种方法。

1.先说下什么是抖音截流玩法&#xff0c;截流顾名思义就是在别的博主的视频下面去截流评论潜在流量&#xff0c;然后用评论文案的形式或者其它方式吸引用户加我们的私域~ 玩截流一定不是主动去私信别人&#xff0c;这个就不叫截流了&#xff0c;且一个账号私信多了一定会降权和…...

Linux_kernel移植uboot07

一、移植 根据硬件平台的差异&#xff0c;将代码进行少量的修改&#xff0c;修改过后的代码在目标平台上运行起来 移植还需要考虑硬件环境&#xff0c;驱动只需要考虑内核的环境 二、移植内容 1、移植Uboot uboot属于bootloader的一种&#xff0c;还有其他的bootloader&#x…...

Day-04-QFile打开文件的两种方式

一、UI界面设置两个按键&#xff0c;并直接转到槽函数 二、两种代码展示 #include <QFile> #include <QDebug>//此两种方式中调用函数&#xff0c;应包含的头文件void Widget::on_btnReadFile01_clicked()//第一种打开方式 {//1. 打开文件QFile file;file.setFile…...

第三部分:4---进程地址空间

目录 数组的空间分配解析&#xff1a; 物理地址和虚拟地址&#xff1a; 虚拟地址空间&#xff1a; 进程地址空间的本质&#xff1a; 为什么要有进程地址空间&#xff1f; 页表对进程访问内存的检查&#xff1a; 进程地址空间和页表如何关联起来&#xff1f; 进程的独立…...

【Android】程序开发组件—探究Jetpack

引言 Jetpack是一个开发组件工具集&#xff0c;它的主要目的是帮助我们编写出更加简洁的代码&#xff0c;并简化我们的开发过程&#xff0c;在这么多的组件当中&#xff0c;最需要我们关注的其实还是架构组件&#xff0c;接下来就对Jetpack的主要架构组件进行学习&#xff01;…...

pytorch torch.norm函数介绍

torch.norm 函数用于计算张量的范数&#xff08;norm&#xff09;&#xff0c;可以理解为张量的“长度”或“大小”。根据范数的不同类型&#xff0c;它可以衡量不同的张量性质。该函数可以计算 向量 和 矩阵 的多种范数&#xff0c;如 L1范数、L2范数、无穷范数 等。 1. 函数…...

【lc_hot100】刷题心得

链表 二叉树 二叉树相关的题目基本都有个基本的框架&#xff0c;基本框架就是二叉树的四种遍历方法&#xff1a;前序遍历、中序遍历、后序遍历、层序遍历 往往常用的是前序遍历和中序遍历 图 图跟二叉树一样都有自己的的基本框架&#xff0c;基本框架就是图的两种遍历方法&am…...

FANUC 数控 A06B-6058-H227 伺服放大器

‌发那科伺服放大器是一种控制电机的电子装置&#xff0c;属于电机控制系统的一部分&#xff0c;用于将输入信号放大并转换成电动机可以理解的信号&#xff0c;从而实现运动控制和定位。‌ 发那科伺服放大器的主要作用包括&#xff1a; ‌实现运动控制‌&#xff1a;通过控制…...

Python将表格文件中某些列的数据整体向上移动一行

本文介绍基于Python语言&#xff0c;针对一个文件夹下大量的Excel表格文件&#xff0c;对其中的每一个文件加以操作——将其中指定的若干列的数据部分都向上移动一行&#xff0c;并将所有操作完毕的Excel表格文件中的数据加以合并&#xff0c;生成一个新的Excel文件的方法。 首…...

基于YOLOv8的PCB缺陷检测算法,加入一种基于内容引导注意力(CGA)的混合融合方案(一)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文内容&#xff1a;针对基于YOLOv8的PCB缺陷检测算法进行性能提升&#xff0c;加入各个创新点做验证性试验。 1&#xff09;提出了一种基于内容引导注意力(CGA)的混合融合方案&#xff0c;mAP0.5由原始的0.966提升至0.975 1.PCB缺陷…...

如何在红米手机中恢复已删除的照片?(6 种方式可供选择)

凭借出色的相机和实惠的价格&#xff0c;小米红米系列已成为全球知名品牌。但是&#xff0c;最近有些人抱怨他们在 红米设备上丢失了许多珍贵的图片或视频&#xff0c;并希望弄清楚如何从小米手机恢复已删除的照片。好吧&#xff0c;在小米设备上恢复已删除的视频/照片并不难。…...

嵌入式实时操作系统(RTOS):原理、应用与发展

摘要&#xff1a;本文围绕嵌入式实时操作系统&#xff08;RTOS&#xff09;展开。首先介绍嵌入式系统与实时操作系统的概念&#xff0c;阐述嵌入式 RTOS 的体系结构。接着分析其关键特性&#xff0c;包含任务管理&#xff08;如任务的创建与删除、调度、同步与通信&#xff09;…...

C#里使用位图容器BitArray

由于经常需要操作一些位表示的数据结构,那么就需要采用位图的管理方式。 在C#里就是使用BitArray来管理位图数据结构,这样就比较方便处理。 这个类可以有多种构造函数,可以满足绝大部分的要求。 比如从网络协议里传送过来的字节流,就可以直接写入到里面,就可以直接获取…...

如何在 Kali Linux 上安装 pip3

如何在 Kali Linux 上安装 pip3 在 Kali Linux 上安装 pip3 的过程非常简单。按照以下步骤&#xff0c;你可以轻松完成安装并开始使用 pip3 管理 Python 软件包。 步骤 1&#xff1a;打开终端 首先&#xff0c;打开你的 Kali Linux 终端。 步骤 2&#xff1a;更新软件包列表…...

5.2 排列与代数余子式

一、求行列式的方法 计算机是利用主元计算行列式的。本节介绍其它两种计算行列式的方法。一是 “大公式”&#xff08;big formula&#xff09;&#xff0c;它使用了全部 n ! n! n! 个排列计算&#xff1b;二是 “代数余子式公式”&#xff08;cofactor formula&#xff09;&…...

java框架第五课(终极版本)SpringBoot

一.关于SpringBoot (1)回忆Spring 传统的Spring由Spring 框架(ioc,aop)加mybatis加Springweb组成&#xff0c;虽然相比原生的java程序Spring框架帮我们大大减少了代码量&#xff0c;减少了冗余&#xff0c;提高了开发效率但是由于Spring框架下的配置和相关的jar包依赖过多&am…...

聚类案例——汽车是否值得购买

对汽车是否值得购买&#xff0c;进行聚类分析&#xff1a; 1、数据指标解释&#xff1a; buying, 购买费用 maint, 维修费用 doors, 车门数量 person, 乘坐人数 lug_boot, 行李箱容量 safety, 安全性 2、对数据进行转换 将字符串转换映射量化为数字 数据加载&#xff1a…...

网络编程9.10

使用数据库完成工人管理系统: ubuntuubuntu:DB$ ubuntuubuntu:DB$ cat 2.c #include <myhead.h> #include <sqlite3.h> #include <string.h>typedef struct {int id;char name[20];double salary; } Worker;int do_insert(sqlite3 *ppDb) {Worker work;pri…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...