Linux应用开发-LCD显示BMP图片

1. 前言 bmp是一种与硬件设备无关的图像文件格式,是windows环境中交换与图有关的数据的一种标准,在windows环境中运行的图形图像软件都支持bmp图像格式。bmp格式的图片存放的就是原始的rgb数据,一般没有做压缩,也就是图片的画质是最原始的,也导致bmp图片占用的内存非常大。现在常用的jpg、jpeg格式都是压缩格式,保存的时候通过算法编码压缩,显示的时候再解压成rgb数据渲染显示。
bmp格式在嵌入式设备里用的还是较多的,bmp虽然占用内存大,优点是显示速度快,因为不需要解码,在性能一般,不是很强的设备上使用bmp显示效率较高。
为了解bmp格式,这篇文章就采用linux开发板作为实验平台,在lcd屏上读取bmp图片,完成绘制,不需要借助任何第三方库,全部由纯c语言代码一行一行敲出来,深入理解linux下帧缓冲编程框架、bmp图片的存储结构原理。
一般bmp图片由以下4个部分组成: 1:文件头 2:图像参数 3:调色板 4:位图数据
现在一般采用的图片都是rgb888,24位真彩色,就没有调色板,只有3个部分组成。
其中文件头存放图片的属性,位图数据偏移量。图像参数存放图片的宽高、像素位数等信息。位图数据就是存储的原始rgb数据,可以直接在lcd屏上显示。
下面列出bmp图片的结构:
位图数据存储规则:
(1)每行的字节数必须是4的倍数,如果不是,则需要用0补齐。 (2)bmp位图数据的存放是从下到上,从左到右的。先读最后一行,读完后在读倒数第二行。
按照上面的介绍,就可以定义一个bmp解码专用的结构体,对应文件里每个字节数据,结构体成员变量必须按照上面截图里的说明定义。整个结构体还需要进行强制1个字节对齐,不然每个编译器对结构体的空间开辟规则有差异,会导致数据错位。
#pragma pack(1) //强制1个字节对齐//bmp的文件头struct _bmp_head{ char type[2]; //图片的类型 bm unsigned int size; //文件大小 unsigned short r1; //保留1 unsigned short r2; //保留2 unsigned int seek; //数据偏移字节(真实像素点数据)};//bmp的参数信息struct _bmp_info{ unsigned int size; //当前结构体大小 unsigned int w; //宽度 unsigned int h; //高度 unsigned short flag; //固定为1 unsigned short bit; //像素点的位数 unsigned int r1; //压缩方式 0 unsigned int r2; //水平分辨率 unsigned int r3; //垂直分辨率 unsigned int r4; //垂直分辨率 unsigned int r5; //引用色彩 unsigned int r6; //关键色彩};复制代码 2. 实现代码 要在lcd屏上完成bmp图片的显示,编写代码需要分几步完成,先编写lcd屏的基本显示代码,封装画点函数,lcd屏测试没有问题之后,再编写bmp解码代码,完成图片的渲染显示。
2.1 封装lcd屏画点函数 #include  #include  #include  #include  unsigned char *fb_mem; struct fb_var_screeninfo var;//可变参数 struct fb_fix_screeninfo fix;//固定参数 ​ ​ /*画点*/ void show_pixel(int x,int y,int color) {  unsigned long  *show32 = null;  /* 定位到lcd屏上的位置*/  show32=(unsigned long*)(fb_mem+y*var.xres*var.bits_per_pixel/8 + x*var.bits_per_pixel/8);    *show32 =color;  /*向指向的lcd地址赋数据*/ } ​ ​ int main(int argc,char**argv) { ​  int fb;  fb=open(/dev/fb0,2);  if(fb 2.2 显示bmp图片 在工程目录下准备几张测试的bmp图片,程序运行时,在命令行上传入要显示的图片文件地址接口。


三极管放大电路的性能指标是什么?
荷兰正在试图利用人类的能源来给加密货币采矿计算机供电
这款耳机可给手机充电 总续航超过100小时
IoT已逐步改变现有商业模式
智能移动电源支持高电压充电
Linux应用开发-LCD显示BMP图片
国内首个大板级扇出型封装示范线建设推进
红米Note5A发布:骁龙435加柔光自拍,699元起
工装夹具在焊接机器人的使用中起到什么作用
MOS管FHL300N1F2A型号参数常用于电池管理系统BMS
STM32基础知识:IIC总线操作EEPROM存储模块AT24C02
本田冠道能否成为爆款?价格说明一切
一文详解MES/MOM系统基础知识
Nexperia推出用于自动安全气囊的专用MOSFET (ASFET)新产品组合
芯片设计企业泰凌微拟科创板上市
INTEL这十年挤牙膏之旅
增材制造晶格模型自动生成平台软件解决方案
高温环境影响三极管性能的案例
6G 第六代移动通信和sub6G第五代移动通信的中低频段
中国铁塔在5G领域未来将向三个方向发展