在6818开发板上显示bmp图片的基本步骤
我总结为以下四步:
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图片的基本步骤相关推荐
- 嵌入式Linux开发-在6818开发板上显示图案
lcd屏幕的显示原理 我们常说开发板的屏幕是800*480的 单位是什么? 像素点! 屏幕一行有800个像素点 一列有480个像素点. 像素点? 显示颜色的点 怎么让像素点显示自己想要的颜色? OS规 ...
- C语言用句柄显示bmp图片,VC编程之VC MFC界面上显示BMP图片
本文主要向大家介绍了VC编程之VC MFC界面上显示BMP图片,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助. 1.通过点击界面浏览按钮选择BMP图像文件. 点击浏览按钮打开文件对话框选择 ...
- QT 开发板无法显示GIF图片,windows能正常显示问题
.h头文件 #include <QLabel> #include <QMovie>QLabel *lable=nullptr; QMovie *movie=nullptr; . ...
- VC MFC界面上显示BMP图片
1.通过点击界面浏览按钮选择BMP图像文件. 点击浏览按钮打开文件对话框选择BMP图像文件,得到文件所在的路径目录.关键代码如下: void ShowBMPDlg::OnButtonSelectiam ...
- 基于粤嵌6818开发板上通过网络连接实现文件传输
下面分别介绍三种通过网线来传输文件的方式,其配置方式如下: 1.计算机与开发板通过网线连接.(计算机可以连接wifi) 首先查找到个人计算机上的IP,要保证前三个参数相同保证在同一个网段上. 例如:1 ...
- linux开发板lcd上显示jpg图片,关于在嵌入式开发板上显示一张jpeg图片
#include "lcdjpg.h" static char g_color_buf[FB_SIZE]={0}; static int g_fb_fd; static int ...
- 在开发板上显示彩虹c语言(800*480屏幕)
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio ...
- 在arm开发板上实现播放内存里所有的jpg和bmp格式图片
之前学习的时候一个作业,趁机会发表一下做个记录,bmp图片较为简单就可以实现了,关于bmp图片的原理可参考这个链接https://blog.csdn.net/u013066730/article/de ...
- 开发板连续显示图片 | BAD APPLE 万耦中的二次元世界
本文分享自中移OneOS微信公众号<万耦中的二次元世界!>,作者:小M哥. BAD APPLE原本是东方游戏里的一首歌曲,后来被加了一个MAD,由于MAD非常惊艳华丽,使得BAD APPL ...
最新文章
- 在夕阳下第一次写文章的菜鸟
- 编写Linux内核模块——第一部分:前言
- 对QT学习之路12-14的源代码补充与修正
- 规则引擎Easy-rules
- 一篇能加深理解linux 虚拟文件系统的博文
- 微软为.NET程序员带来了最优的跨平台开发体验-WSL
- shell脚本if和switch语句编写案例
- 攀达计算机usb控制器,[如何用注册表打开被屏蔽的USB插口.docx
- 转行AI需要看的一些文章
- Android ProgressDialog示例
- Android 代码中的常见的问题总结
- SpringMVC表单标签简介
- latex参考文献bib基本格式_Latex如何添加参考文献——使用bib
- ios苹果开发者账号申请流程(2017)
- 编译原理(二)文法和语言、符号和符号串、文法的类型、语法树
- linux flash插件安装方法,Linux系统下安装Flash浏览器插件的方法
- 量子计算机叠加算法,量子计算中的叠加
- return 的含义
- 破解RVDS2 2方法分享
- Speex 一个开源的声学回声消除器(Acoustic Echo Cancellation)
热门文章
- Java新浪微博客户端开发第四步
- 怎样下载ps2020软件和安装,ps2021安装包怎么下载
- 深入浅出谈谈IP协议
- python turtle库在哪里_Python中turtle库的使用
- CADD课程学习(9)-- 不同类型分子结构转换(Open Babel)
- 计算机毕设(附源码)JAVA-SSM基于java的图书管理系统
- 【ffmpeg】ffmpeg视频添加水印并解决字体问题Could not load font FreeSerif.ttf:cannot opencv resource
- java反射路径_java反射
- 阿联酋标准局 (ESMA)认证办理流程
- springboot启动报错Parameter 0 of method a in com.* required a bean of type 'java.lang.String' that could