【Linux文件IO】通过文件IO把bmp图片显示到Linux开发板的实现

devtools/2025/3/26 4:06:29/

通过文件IO把bmp图片显示到Linux开发板的实现

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>/* 
显示24位的BMP图片特点1:每个像素点占3个字节,分别是BGR的值 B蓝色G绿色R红色特点2:bmp图片最前面有54个字节的头信息,真实的BGR数据从55字节开始的理论计算:800*480*3=1152000个字节实际大小:1152054多了54个字节头信息:里而存放的图片的宽高,格式这些信息特点3:液晶屏每个像素点占多少字节占4个字节,分别是ARGB的值,A代表透明度,写代码的时候可以忽略(设置为0)特点4:bmp图片是微软公司发明的图片格式,在计算机中存放的时候是上下颠倒
练习:解决图片3个字节BGR-->转换成液晶屏需要的4个字节 ARGBbmpbuf[0]-->Bbmpbuf[1]-->G bmpbuf[2]-->R
*/#define BMP_SIZE (800*480*3)
#define LCD_WRITE_SIZE (800*480)int main(int argc, char const *argv[])
{char bmpbuf[BMP_SIZE] = {0}; int lcdbuf[LCD_WRITE_SIZE] = {0}; // 存放bmp转换后的需要写入液晶屏的数据int tempbuf[LCD_WRITE_SIZE] = {0}; // 存放像素点翻转的数据int bmpfd, lcdfd; int i, x, y;//打开要显示的bmp图片-->图片要下载到开发板对应的路径下bmpfd = open("/1.bmp", O_RDWR);if (bmpfd == -1){perror("打开bmp文件失败\n");return -1;}//打开液晶屏的驱动lcdfd = open("/dev/fb0", O_RDWR);if (lcdfd == -1){perror("打开液晶屏文件失败\n");return -1;}//跳过最前面的54个字节的头信息lseek(bmpfd, 54, SEEK_SET);//读取图片的颜色数据-->从55字节开始读取read(bmpfd, bmpbuf, BMP_SIZE);for (i = 0; i < LCD_WRITE_SIZE; i++){lcdbuf[i] = 0x00 << 24 | bmpbuf[2+3*i] << 16 | bmpbuf[1+3*i] << 8 | bmpbuf[2+3*i];}// 把翻转的图片进行对调for (x = 0; x < 800; x++){for (y = 0; y < 480; y++)tempbuf[(479-y)*800+x] = lcdbuf[(y*800)+x];}//把读取的颜色值写入液晶屏write(lcdfd, tempbuf, LCD_WRITE_SIZE);// 关闭文件close(bmpfd);close(lcdfd);return 0;
}

http://www.ppmy.cn/devtools/171246.html

相关文章

java项目之基于ssm的游戏攻略网站(源码+文档)

项目简介 游戏攻略网站实现了以下功能&#xff1a; 管理员主要负责填充图书和其类别信息&#xff0c;并对已填充的数据进行维护&#xff0c;包括修改与删除&#xff0c;管理员也需要审核老师注册信息&#xff0c;发布公告信息&#xff0c;管理自助租房信息等。 &#x1f495;…

判断是不是完全二叉树(C++)

目录 1 问题描述 1.1 示例1 1.2 示例2 1.3 示例3 2 解题思路 3 代码实现 4 代码解析 4.1 定义队列&#xff0c;初始化根节点 4.2 层序遍历&#xff0c;处理每个节点 4.3 处理空节点 4.4 处理非空节点 5 总结 1 问题描述 给定一个二叉树&#xff0c;确定他是否是一…

学习记录-Ajax-自封装axios函数

目录 自封装axios函数封装axios函数实现步骤1. 准备阶段2. 实现无参get请求3.实现有参get请求4. 实现post请求 完整实例代码 自封装axios函数 封装axios函数实现步骤 1. 准备阶段 理解axios函数的底层原理&#xff0c;包括Promise,XMLHttpRequest等概念 XMLHttpRequest工作…

贪心算法(11)(java)加油站

题目&#xff1a;在一条环路上有n个加油站&#xff0c;其中第i个加油站有汽油 gas[i]升.。 你有一辆油箱容量无限的的汽车&#xff0c;从第i个加油站开往第i1个加油站需要消耗汽油 cost[i]升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定…

Spring Security核心源码和功能实现

Spring Security 是一个强大的安全框架,用于保护基于 Spring 的应用程序。它提供了认证、授权、防止常见安全攻击等功能。下面是对 Spring Security 的核心功能和实现的详细分析,并使用 Mermaid 绘制相关流程图。 1. 核心功能 1.1 认证(Authentication) 用户认证:验证用…

【41】单片机编程核心技巧:const 与 code 的存储优化

【41】单片机编程核心技巧&#xff1a;const 与 code 的存储优化 七律 存储优化 常量存储ROM中&#xff0c;const与code异同。 变量常量分两域&#xff0c;RAM省空间有功。 查表阀值一键改&#xff0c;代码优化显神通。 单片机中精设计&#xff0c;资源管理更从容。 摘要 本…

A l密码学(Deepseek)

我&#xff1a;qwertyuiopasdfghjklzxcvbnm deepseek:深度思考中&#xff0e; Okay, lets see. The user input is "qwertyuiopasdfghjklzxcvbnm". At first glance, it looks like a jumbled sequence of letters with some spaces or maybe other characters in …

数据结构--堆

一&#xff0c;引言 堆作为一种特殊的二叉树类型有这很重要的实现意义&#xff0c;本文不详细堆的堆的感念性问题&#xff0c;注意进行讲解堆算法的实现。 由于堆为完全二叉树中间没有空隙&#xff0c;所以用数组来进行存储&#xff0c;以数组的下标来确认其二叉树各个节点的…