我总结为以下四步:

1)打开液晶屏文件、打开bmp图片文件、完成液晶屏内存映射

2)读取bmp图片文件到临时数组temp,等待处理数组里面的数据。

3)处理数据、映射到液晶屏上,此处是bmp图片算法:

  • 将bmp图片每个像素点BGR数据转化为ARGB。
  • 上下180度颠倒 ,并且直接写入液晶屏显示。

4)关闭液晶屏、bmp图片文件。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <stdbool.h>#define UINT  unsigned short
#define DWORD unsigned  int
#define LONG unsigned  int
#define WORD unsigned short
#define BMP_WIDTH   800
#define BMP_HEIGHT  480int lcdfd;
int *lcd_p;//前面14个字节 文件信息头
typedef struct tagBITMAPFILEHEADER{UINT bfType;  //2DWORD bfSize; //DWORD 4UINT bfReserved1; //2UINT bfReserved2; //2DWORD bfOffBits; //DWORD 4
}BITMAPFILEHEADER;//40个字节 位图信息头
typedef struct tagBITMAPINFOHEADER{ /* bmih */DWORD biSize; //DWORD 4LONG biWidth; //4  图像的宽度LONG biHeight;//4  图像的高度WORD biPlanes; //2WORD biBitCount;//2 DWORD biCompression; //DWORD 4DWORD biSizeImage; //DWORD 4LONG biXPelsPerMeter;//4LONG biYPelsPerMeter;//4DWORD biClrUsed; //DWORD 4DWORD biClrImportant; //DWORD 4
}BITMAPINFOHEADER;//得到bmp图片的宽度
int getBmpWidth(BITMAPINFOHEADER *head)
{printf("Width:%d\n",head->biWidth);//图像的宽度return head->biWidth;
}
//得到bmp图片的高度
int getBmpHeight(BITMAPINFOHEADER *head)
{printf("Height:%d\n",head->biHeight);//图像的高度return head->biHeight;
}
//得到bmp图片的大小
int getBmpSize(BITMAPINFOHEADER *head)
{printf("fileSize:%d\n",head->biSizeImage+54);//文件的大小return head->biSizeImage+54;
}
//初始化液晶屏 和 内存映射
bool initLcdAndMmap()
{//1、打开液晶屏文件  lcdfd = open("/dev/fb0",O_RDWR);if(lcdfd == -1){perror("open lcd error");//perror将错误的原因打印出来return false;}//将液晶屏文件 通过内存映射mmap的方式 映射到虚拟内存空间的某一块空间上,得到这一块内存的起始地址,后续我们操作这片内存空间,就相当于直接操作液晶屏文件lcd_p = mmap(NULL, //你要映射的内存空间的起始地址,为NULL系统自动给你分配800*480*4,//你要映射的内存空间的大小PROT_READ|PROT_WRITE,//映射的权限 MAP_SHARED,//1、进程共享  2、对应的文件会同步发生变化     lcdfd,//映射液晶屏文件0//偏移量 ,默认为0);if(lcd_p == MAP_FAILED)   {printf("mmap lcd error\n");return false;}return true;
}
//解除初始化
void uinitLcd()
{//解除映射munmap(lcd_p, 800*480*4);//5、关闭液晶屏文件、bmp图片文件 close(lcdfd);
}
//核心showBmp函数调用
int showBmp(char *bmpPath)
{int i,j;int tempbuf[800*480];int lcdbuf[800*480];//2、打开bmp图片文件  int bmpfd = open(bmpPath,O_RDONLY);if(bmpfd == -1){perror("open bmpfile error");//perror将错误的原因打印出来return -1;}//读取bmp图片的文件头 + 信息头数据BITMAPFILEHEADER fileHead;BITMAPINFOHEADER infoHead;read(bmpfd,&fileHead,14);//读取14个字节read(bmpfd,&infoHead,40);//读取40个字节//判断是否宽度等于 800 if(BMP_WIDTH != getBmpWidth(&infoHead)){printf("你要打印的图片宽度 不等于 800 请重新修改图片 error\n");//5、bmp图片文件  close(bmpfd);return -1;}//判断是否高度等于 480if(BMP_HEIGHT != getBmpHeight(&infoHead)){printf("你要打印的图片高度 不等于 480 请重新修改图片 error\n");//5、bmp图片文件  close(bmpfd);return -1;}//3、读取bmp图片的数据char bmpbuf[800*480*3]={0};read(bmpfd,bmpbuf,800*480*3);//将bmp图片每个像素点的 B G R -->A R G  Bfor(i=0,j=0; i<800*480;i++,j+=3){tempbuf[i] = 0x00<<24 | bmpbuf[j+2]<<16 | bmpbuf[j+1]<<8 | bmpbuf[j];}//上下180度颠倒 for(j=0; j<480; j++){for(i=0; i<800; i++){lcd_p[j*800+i] = tempbuf[(479-j)*800+i];}}close(bmpfd);
}
int main(int argc,char*argv[])
{if(argc<2)// ./showbmp  2.bmp{printf("请把图片的名字传递进来,argv[1]现在是空的\n");return -1;}//初始化if(!initLcdAndMmap()) //if(initLcdAndMmap() = false){//如果初始化失败printf("initLcdAndMmap error\n");return -1;}showBmp(argv[2]);//此处调用即可显示图片相应图片 //解除初始化uinitLcd();return 0;
}

注意事项:图片大小为800*480,如果想显示任意大小图片,可以对bmp图片算法进行修改。

在6818开发板上显示bmp图片的基本步骤相关推荐

  1. 嵌入式Linux开发-在6818开发板上显示图案

    lcd屏幕的显示原理 我们常说开发板的屏幕是800*480的 单位是什么? 像素点! 屏幕一行有800个像素点 一列有480个像素点. 像素点? 显示颜色的点 怎么让像素点显示自己想要的颜色? OS规 ...

  2. C语言用句柄显示bmp图片,VC编程之VC MFC界面上显示BMP图片

    本文主要向大家介绍了VC编程之VC MFC界面上显示BMP图片,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助. 1.通过点击界面浏览按钮选择BMP图像文件. 点击浏览按钮打开文件对话框选择 ...

  3. QT 开发板无法显示GIF图片,windows能正常显示问题

    .h头文件 #include <QLabel> #include <QMovie>QLabel *lable=nullptr; QMovie *movie=nullptr; . ...

  4. VC MFC界面上显示BMP图片

    1.通过点击界面浏览按钮选择BMP图像文件. 点击浏览按钮打开文件对话框选择BMP图像文件,得到文件所在的路径目录.关键代码如下: void ShowBMPDlg::OnButtonSelectiam ...

  5. 基于粤嵌6818开发板上通过网络连接实现文件传输

    下面分别介绍三种通过网线来传输文件的方式,其配置方式如下: 1.计算机与开发板通过网线连接.(计算机可以连接wifi) 首先查找到个人计算机上的IP,要保证前三个参数相同保证在同一个网段上. 例如:1 ...

  6. linux开发板lcd上显示jpg图片,关于在嵌入式开发板上显示一张jpeg图片

    #include "lcdjpg.h" static char g_color_buf[FB_SIZE]={0}; static int  g_fb_fd; static int ...

  7. 在开发板上显示彩虹c语言(800*480屏幕)

    #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio ...

  8. 在arm开发板上实现播放内存里所有的jpg和bmp格式图片

    之前学习的时候一个作业,趁机会发表一下做个记录,bmp图片较为简单就可以实现了,关于bmp图片的原理可参考这个链接https://blog.csdn.net/u013066730/article/de ...

  9. 开发板连续显示图片 | BAD APPLE 万耦中的二次元世界

    本文分享自中移OneOS微信公众号<万耦中的二次元世界!>,作者:小M哥. BAD APPLE原本是东方游戏里的一首歌曲,后来被加了一个MAD,由于MAD非常惊艳华丽,使得BAD APPL ...

最新文章

  1. 在夕阳下第一次写文章的菜鸟
  2. 编写Linux内核模块——第一部分:前言
  3. 对QT学习之路12-14的源代码补充与修正
  4. 规则引擎Easy-rules
  5. 一篇能加深理解linux 虚拟文件系统的博文
  6. 微软为.NET程序员带来了最优的跨平台开发体验-WSL
  7. shell脚本if和switch语句编写案例
  8. 攀达计算机usb控制器,[如何用注册表打开被屏蔽的USB插口.docx
  9. 转行AI需要看的一些文章
  10. Android ProgressDialog示例
  11. Android 代码中的常见的问题总结
  12. SpringMVC表单标签简介
  13. latex参考文献bib基本格式_Latex如何添加参考文献——使用bib
  14. ios苹果开发者账号申请流程(2017)
  15. 编译原理(二)文法和语言、符号和符号串、文法的类型、语法树
  16. linux flash插件安装方法,Linux系统下安装Flash浏览器插件的方法
  17. 量子计算机叠加算法,量子计算中的叠加
  18. return 的含义
  19. 破解RVDS2 2方法分享
  20. Speex 一个开源的声学回声消除器(Acoustic Echo Cancellation)

热门文章

  1. Java新浪微博客户端开发第四步
  2. 怎样下载ps2020软件和安装,ps2021安装包怎么下载
  3. 深入浅出谈谈IP协议
  4. python turtle库在哪里_Python中turtle库的使用
  5. CADD课程学习(9)-- 不同类型分子结构转换(Open Babel)
  6. 计算机毕设(附源码)JAVA-SSM基于java的图书管理系统
  7. 【ffmpeg】ffmpeg视频添加水印并解决字体问题Could not load font FreeSerif.ttf:cannot opencv resource
  8. java反射路径_java反射
  9. 阿联酋标准局 (ESMA)认证办理流程
  10. springboot启动报错Parameter 0 of method a in com.* required a bean of type 'java.lang.String' that could