目录

1.介绍

2.代码

2.1 定义

2.2 图片显示

2.3 格式转换

3.实现效果

4.源码地址


1.介绍

使用stm32单片机将bmp格式的图片显示在屏幕上,如果图片尺寸大于屏幕就将其缩放,图片文件存储在sd卡中,因此显示图片需要首先实现文件系统的移植及lcd屏幕的驱动(本文不涉及这一部分),本文主要实现图片处理这一部分。图片显示的原理就是通过文件系统打开图片文件,读取各像素点的颜色值进行处理后,使用屏幕显示出来。

注:文末给出的例程,部分驱动代码参考了正点原子的代码,例程仅供参考,如有问题,请自行修改。

2.代码

2.1 定义

主要定义了结构体Picture,用来存放图片的宽度,高度等相关信息。

#define P_LEN 240//屏幕宽度;
#define P_HEN 320//屏幕高度;struct picture
{uint8_t    bmphead[54];    //图片头信息;uint16_t     offset;         //图像数据在文件中的偏移量;uint16_t      hight;          //图片高度(像素点的个数);uint16_t   weight;         //图片宽度;uint32_t      size;           //图片的大小;uint32_t     count;          //几位色彩;uint32_t      color[P_LEN];   //处理后的像素的颜色值;uint8_t     rgba[4 * P_LEN];//处理前的像素的颜色值;
}Picture;

2.2 图片显示

函数LCD_Show_Bmp,就是实现图片显示的主要函数,只需要在主函数中调用该函数传入图片名,就能将图片显示在屏幕上。

void LCD_Show_Bmp(char *pn)
{uint8_t kes = 0, ucRes;FIL ftp;//文件指针;char pname[100];//打开的图片文件名;int i = 0;uint32_t brt;uint32_t Pb = 0;//需要的像素点索引;uint32_t P_L = 0;//缩放后的图片宽度(即实际屏幕上显示的);uint32_t P_H = 0;//缩放后的图片高度;uint32_t P_X = 0;//显示图片的X起始坐标;uint32_t P_Y = 0;//显示图片的Y起始坐标;uint32_t pl = 0; //行像素;uint32_t len1 = 0, len2 = 0;//图片的宽度可能很宽,每次只取240个像素点,//len1表示取的次数,len2表示剩下不足240的像素数;float P_mag;//缩放比例;uint32_t mt1 = 0, mt2 = 0;//与缩放比例有关;pname[0] = '0';//存储的路径;pname[1] = ':';while(pn[i] != '\0'){pname[i + 2] = pn[i];i++;}pname[i + 2] = '\0';kes = PutGetFile_Sys(); //挂载文件系统;if(kes == 0){printf("文件系统挂载失败!\n");return;}ucRes = f_open(&ftp, pname, FA_OPEN_ALWAYS | FA_READ | FA_WRITE);//打开bmp格式的图片文件;if(ucRes != 0){printf("图片文件打开失败!\n");return;}f_lseek(&ftp, 0);f_read(&ftp, Picture.bmphead, 54, &brt);//读取文件头信息;//计算偏移量,宽度,高度等;Picture.offset = Picture.bmphead[10] + Picture.bmphead[11] * 256 + Picture.bmphead[12] * 256 * 256 + Picture.bmphead[13] * 256 * 256 * 256;Picture.weight = Picture.bmphead[18] + Picture.bmphead[19] * 256 + Picture.bmphead[20] * 256 * 256 + Picture.bmphead[21] * 256 * 256 * 256;Picture.hight  = Picture.bmphead[22] + Picture.bmphead[23] * 256 + Picture.bmphead[24] * 256 * 256 + Picture.bmphead[25] * 256 * 256 * 256;Picture.size   = Picture.bmphead[2]  + Picture.bmphead[3]  * 256 + Picture.bmphead[4]  * 256 * 256 + Picture.bmphead[5]  * 256 * 256 * 256;Picture.count  = Picture.bmphead[28] / 8;len1 = Picture.weight / P_LEN;len2 = Picture.weight % P_LEN;if(Picture.weight > P_LEN || Picture.hight > P_HEN){if(((float)Picture.weight / (float)P_LEN) >= ((float)Picture.hight / (float)P_HEN)){P_mag = ((float)Picture.weight / (float)P_LEN);P_L = P_LEN;P_H = P_rand((float)Picture.hight / P_mag);P_X = 0;P_Y = P_HEN - ((P_HEN - P_H) / 2);mt1 = Picture.weight;mt2 = P_LEN;}else{P_mag = ((float)Picture.hight / (float)P_HEN);P_H = P_HEN;P_L = P_rand((float)Picture.weight / P_mag);P_X = ((P_LEN - P_L) / 2);P_Y = P_HEN;mt1 = Picture.hight;mt2 = P_HEN;}}else{P_mag = 1;P_L = Picture.weight;P_H = Picture.hight;P_X = ((P_LEN - P_L) / 2);P_Y = P_HEN - ((P_HEN - P_H) / 2);mt1 = 1;mt2 = 1;}for(int k = P_H; k > 0; k --){pl = 0;for(int m = 0; m < len1; m++){f_lseek(&ftp, Picture.offset + (P_mand(mt1, mt2, (k - 1)) * Picture.weight + m * P_LEN)* Picture.count);f_read(&ftp, Picture.rgba, Picture.count * P_LEN, &brt);for(int j = pl; j < P_L; j ++){Pb = P_mand(mt1, mt2, j);if(Pb < (m + 1) * P_LEN){Picture.color[j] = P_TranColor(Picture.rgba[(Pb % P_LEN) * Picture.count + 0], Picture.rgba[(Pb % P_LEN) * Picture.count + 1 ], Picture.rgba[(Pb % P_LEN) * Picture.count + 2]);}else{pl = j;break;}}}f_lseek(&ftp, Picture.offset + (P_mand(mt1, mt2, (k - 1)) * Picture.weight + len1 * P_LEN) * Picture.count);f_read(&ftp, Picture.rgba, Picture.count * len2, &brt);for(int j = pl; j < P_L; j ++){Pb = P_mand(mt1, mt2, j);if(Pb < (len1 * P_LEN + len2)){Picture.color[j] = P_TranColor(Picture.rgba[(Pb % P_LEN) * Picture.count + 0], Picture.rgba[(Pb % P_LEN) * Picture.count + 1 ], Picture.rgba[(Pb % P_LEN) * Picture.count + 2]);           }else{pl = j;break;}}LCD_SetCursor(P_X, P_Y - 1 - (k - 1));LCD_WriteRAM_Start();for(int kt = 0; kt < P_L; kt++){LCD_SendData(Picture.color[kt]);}}f_close(&ftp);
}

2.3 格式转换

uint16_t P_TranColor(uint8_t P_Blue, uint8_t P_Green, uint8_t P_Red)//24位(RGBA格式实际为32位,最后8位舍弃)转为16位颜色;
{uint16_t P_Color = 0;P_Color = (uint16_t)(P_Blue >> 3) | ((uint16_t)(P_Green >> 2) << 5) | ((uint16_t)(P_Red >> 3) << 11);return P_Color;
}/*缩放图片(通过四舍五入找出需要的像素点)*/
int P_mand(int len1, int len2, int num) //原始图片像素数/屏幕实际像素数 * 第几个像素;
{int sum = 0;sum = (len1 * num) / len2;if( 2 * ((len1 * num) % len2) >= len2){sum += 1;}return sum;
}int P_rand(float temp)//将小数四舍五入成整数;
{int kemp = 0;float memp = 0;kemp = (int)temp;memp = temp - kemp;if(memp >= 0.5){kemp = kemp + 1;}return kemp;
}

3.实现效果

将图片拷贝到sd卡,插入开发板中,然后将程序下载到开发板中,本文中使用的正点原子的stm32mini板,其他开发板视情况自行修改,效果如下:

4.源码地址

百度网盘地址:https://pan.baidu.com/s/1eMTKy2vSxBybVcjuAfkY5Q?pwd=31ji 提取码: 31ji

stm32显示bmp图片相关推荐

  1. 基于STM32的BMP图片解码灰度化以及缩放

    平台:STM32F1+FATFS+SD卡 基于STM32的BMP图片处理 处理结果 原图 test.bmp 灰度图 gray.bmp 缩放 zoom.bmp 代码实现 调试过程遇到的几个问题 双线性插 ...

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

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

  3. UEFI显示BMP图片

    两种方式 :一种为按像素点画图:另一种为将图片转换到GOP blt缓冲区中,允许用户调用blt将其显示出来. 画像素点方式极慢,可以看到一行一行的绘画过程:而使用缓冲区则会立刻显示出一张图片. 先了解 ...

  4. 在6818开发板上显示bmp图片的基本步骤

    我总结为以下四步: 1)打开液晶屏文件.打开bmp图片文件.完成液晶屏内存映射 2)读取bmp图片文件到临时数组temp,等待处理数组里面的数据. 3)处理数据.映射到液晶屏上,此处是bmp图片算法: ...

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

    1. 前言 BMP是一种与硬件设备无关的图像文件格式,是Windows环境中交换与图有关的数据的一种标准,在Windows环境中运行的图形图像软件都支持BMP图像格式.BMP格式的图片存放的就是原始的 ...

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

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

  7. 纯c++读取与显示BMP图片

    2019/10/7 给某些网络巨婴的说明 第一,不会配置vs环境的请绕道 第二,不懂字符集区别的请走开 第三,不会定义类的成员变量的请去学习 第四,不会处理编译器错误信息的请去百度 第五,什么都不会只 ...

  8. mysql显示bmp图片_BMP格式图像的显示

    使用多文档编程 也可以使用单文档编程 建立一个DIB图像的显示类 ImageDib 成员变量: 4个指针: LPBYTE m_lpDib;      //指向DIB的指针 LPBITMAPINFOHE ...

  9. 【数字图像处理】一.MFC详解显示BMP格式图片

    本文主要是讲述<数字图像处理>系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的<数字图像处理>课程和以前的项目叙述讲解 ...

最新文章

  1. 账号管理工具_短视频矩阵管理工具,多个账号同步管理
  2. 领导者有3个要求,你做到了吗?
  3. Windows 编程[3] - 学习窗体生成的过程三
  4. 抽取、转换和装载介绍(八)实时的意义(待续)
  5. linux shell case语句
  6. (转)RabbitMQ学习之spring整合发送异步消息(注解实现)
  7. flutter 生成文档_Flutter文件操作
  8. Docker Engine在CentOS上的安装
  9. linux实现内存共享,Linux共享内存实现
  10. VC++工程配置的大体流程 看图说话
  11. 在真实数据集上的随机森林模型参数调优
  12. python入门代码大全-初学python有哪些可以临摹的小段练习代码素材?
  13. 最新王者荣耀发卡网源码,手机电脑自适应
  14. 李氏第二法分析稳定性matlab,9-4李雅普诺夫稳定性分析2010.ppt
  15. LeetCode 316/1081[Python]. 去除重复字母 给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。
  16. 实用工具系列 - FileZilla安装下载与使用
  17. ensp MSTP实验搭建
  18. 【WPF学习手记】InkCanvas绘制矩形和椭圆
  19. Ubuntu下PDF文件转JPG图片
  20. 推荐一个还不错的医学网站

热门文章

  1. 【汇正财经】按上市地点分类股票有哪些?
  2. Windows系统安装————windows7 企业版 无法安装 NET.framework4.52-4.6版本在WIN7下解决办法...
  3. 使用Python为图片添加空间相关噪声(相干噪声)
  4. Adobe Photoshop CC2021【PS 2021】官方中文免费版
  5. 浅谈python高级数据结构—— 字符串(str)
  6. 红外图像处理算法介绍
  7. Ansys Workbench 网格划分失败解决办法
  8. 前端报错vue.runtime.esm.js2b0e619 [Vue warn] Unknown custom element <github-corner> - did you regist
  9. ubuntu 20.04 ROS Noetic 无serial包解决方法
  10. 双击SumatraPDF无法进入latex对应位置的解决办法