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

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

通过文件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个字节 ARGB
        bmpbuf[0]-->B
        bmpbuf[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.kler.cn/a/598866.html

相关文章:

  • 基于springboot的新闻推荐系统(045)
  • 【NLP 42、实践 ⑪ 用Bert模型结构实现自回归语言模型的训练】
  • 人脸表情识别系统分享(基于深度学习+OpenCV+PyQt5)
  • Spring Boot框架中常用注解
  • 【mysql】同一个字段,字符串相加
  • 从Oracle到OceanBase数据库迁移:全方位技术解析
  • 如何让Go 的regexp包支持 (?!...) 这样的 Perl 语法?
  • PHP转GO Day3 函数定义与包管理实践(创建数学工具包)
  • 2.1.项目管理前言
  • 【Linux】:守护进程化
  • 【JavaEE】Mybatis基础使用注解 增删改查操作
  • DeepSeek政务应用场景与解决方案【清华大学最新版】
  • 996引擎-接口测试:背包
  • 开源AI大模型赋能私域流量:S2B2C场景下品牌文化建构的智能路径研究
  • webscoket爬虫之某旺(1)分析篇
  • 深度学习闭环检测算法实现与优化指南
  • 学术型ppt制作经验分享 - 如何美化科研ppt?
  • Linux下JDK1.8安装配置
  • 深度学习 Deep Learning 第5章 机器学习基础
  • Cloudfare内网穿透配置