当前位置: 代码迷 >> 综合 >> STM32——EMWIN BMP图片显示(二十二)
  详细解决方案

STM32——EMWIN BMP图片显示(二十二)

热度:78   发布时间:2023-11-21 19:07:57.0

EMWIN

文章目录

  • EMWIN
  • 一、支持格式
  • 二、BMP 文件 API 函数
  • 三、实验代码

一、支持格式

emWin 支持 BMP 图片解码,可以直接从外部存储器(如 SD 卡)中读取 BMP 图片文件在 LCD上显示
BMP 文件格式由 Microsoft 定义
在这里插入图片描述

二、BMP 文件 API 函数

GUI_BMP_Draw() 绘制已加载到存储器的 BMP 文件。
GUI_BMP_DrawEx() 绘制无需加载到存储器的 BMP 文件。
GUI_BMP_DrawScaled() 绘制已加载到存储器的带比例的 BMP 文件。
GUI_BMP_DrawScaledEx() 绘制无需加载到存储器的带比例的 BMP 文件。
GUI_BMP_GetXSize() 返回加载到存储器的 BMP 文件的 X 大小。
GUI_BMP_GetXSizeEx() 返回无需加载到存储器的 BMP 文件的 X 大小。
GUI_BMP_GetYSize() 返回加载到存储器的位图的 Y 大小。
GUI_BMP_GetYSizeEx() 返回无需加载到存储器的 Y 大小。
GUI_BMP_Serialize() 创建 BMP 文件。
GUI_BMP_SerializeEx() 基于给定的矩形创建 BMP 文件。

三、实验代码

#include "bmpdisplay.h"
#include "EmWinHZFont.h"
#include "GUI.h"
#include "malloc.h"
#include "ff.h"
#include "ili93xx.h"#if SYSTEM_SUPPORT_UCOS
#include "includes.h" //ucos ???? 
#endifstatic FIL BMPFile;
static char bmpBuffer[BMPPERLINESIZE];static int BmpGetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off) 
{
    static int readaddress=0;FIL * phFile;UINT NumBytesRead;#if SYSTEM_SUPPORT_UCOSOS_CPU_SR cpu_sr;#endifphFile = (FIL *)p;if (NumBytesReq > sizeof(bmpBuffer)) {
    NumBytesReq = sizeof(bmpBuffer);}//????????????????????????if(Off == 1) readaddress = 0;else readaddress=Off;#if SYSTEM_SUPPORT_UCOSOS_ENTER_CRITICAL();	//??????#endiff_lseek(phFile,readaddress); //??????????????????f_read(phFile,bmpBuffer,NumBytesReq,&NumBytesRead);#if SYSTEM_SUPPORT_UCOSOS_EXIT_CRITICAL();	//?????????? #endif*ppData = (U8 *)bmpBuffer;return NumBytesRead;//·???????????×?????
}//?????¨???????????è??????RAM????BMP????(?è?????????§??????????RAM????????????·?·¨??)
//BMPFileName:??????SD?¨?ò???????????è±??????·??
//mode:????????
// 0 ?????¨????????????????x,y?·?¨????????
// 1 ??LCD???????????????±?????????????±?ò????x,y???§??
//x:????×ó??????LCD????x?á????(?±????mode??1?±???????????§)
//y:????×ó??????LCD????y?á????(?±????mode??1?±???????????§)
//member: ??·?±?????·?×???
//denom:??·?±?????·?????
//·?????:0 ????????,???? ?§°?
int dispbmpex(u8 *BMPFileName,u8 mode,u32 x,u32 y,int member,int denom)
{
    char result;int XSize,YSize;float Xflag,Yflag;GUI_COLOR forecolor,bkcolor;forecolor=GUI_GetColor();			//?????±?°?°?°??bkcolor=GUI_GetBkColor();			//?????±?°±??°??result = f_open(&BMPFile,(const TCHAR*)BMPFileName,FA_READ);	//?ò??????//?????ò???í?óif(result != FR_OK) 	return 1;switch(mode){
    case 0:	//?????¨????????????if((member == 1) && (denom == 1)) //???è??·????±??????{
    GUI_BMP_DrawEx(BmpGetData,&BMPFile,x,y);//?????¨????????BMP????}else //·??ò?????è????·?{
    GUI_BMP_DrawScaledEx(BmpGetData,&BMPFile,x,y,member,denom);}break;case 1:	//??LCD????????????XSize = GUI_BMP_GetXSizeEx(BmpGetData,&BMPFile);	//??????????X?á?ó??YSize = GUI_BMP_GetYSizeEx(BmpGetData,&BMPFile);	//??????????Y?á?ó??if((member == 1) && (denom == 1)) //???è??·????±??????{
    //??LCD????????????GUI_BMP_DrawEx(BmpGetData,&BMPFile,(lcddev.width-XSize)/2-1,(lcddev.height-YSize)/2-1);}else //·??ò?????è????·?{
    Xflag = (float)XSize*((float)member/(float)denom);Yflag = (float)YSize*((float)member/(float)denom);XSize = (lcddev.width-(int)Xflag)/2-1;YSize = (lcddev.height-(int)Yflag)/2-1;GUI_BMP_DrawScaledEx(BmpGetData,&BMPFile,XSize,YSize,member,denom);}break;}f_close(&BMPFile);		//??±?BMPFile????GUI_SetColor(forecolor);		//?????°?°??GUI_SetBkColor(bkcolor);		//????±??°??return 0;
}//??????±?GUI_BMP_Serialize()?÷?????????ò????????×???
static void _WriteByte2File(U8 Data, void * p) 
{
    UINT nWritten;f_write((FIL*)p,&Data,1,&nWritten);
}//?ú??????BMP??????±?????SD?¨??,??????????????????
//*filepath:?????·??
//x0:???¨BMP??????X????????
//y0:???¨BMP??????Y????????
//Xsize:X???ó??
//Ysize:Y???ó??
void create_bmppicture(u8 *filename,int x0,int y0,int Xsize,int Ysize)
{
    static FIL hFile;GUI_COLOR forecolor,bkcolor;forecolor=GUI_GetColor();		//?????±?°?°?°??bkcolor=GUI_GetBkColor();		//?????±?°±??°??//???¨???????????·????filename,??????????±??????????°?á±????¨??????????????f_open(&hFile,(const TCHAR*)filename,FA_READ|FA_WRITE|FA_CREATE_ALWAYS);GUI_BMP_SerializeEx(_WriteByte2File,x0,y0,Xsize,Ysize,&hFile);f_close(&hFile);	//??±?????GUI_SetColor(forecolor);		//?????°?°??GUI_SetBkColor(bkcolor);		//????±??°??
}	void bmpdisplay_demo(void)
{
    GUI_SetBkColor(GUI_BLUE);GUI_SetColor(GUI_RED);GUI_SetFont(&GUI_FontHZ16);GUI_Clear();while(1){
    GUI_DispStringHCenterAt("?????¨???????????????è??????BMP????",400,5);dispbmpex("0:/PICTURE/BMP/ALIENTEKLOGO.bmp",0,10,	78,	1,1);GUI_Delay(1000);GUI_Clear();GUI_DispStringHCenterAt("??LCD????????????????1/2?????è??????BMP????",400,5);dispbmpex("0:/PICTURE/BMP/ALIENTEKLOGO.bmp",1,0,	0,	1,2);GUI_Delay(1000);GUI_Clear();GUI_DispStringHCenterAt("??LCD???????????????ó4/3±??????è??????BMP????",400,5);dispbmpex("0:/PICTURE/BMP/ALIENTEKLOGO.bmp",1,0,	0,	4,3);GUI_Delay(1000);GUI_Clear();}
}
BmpGetData() 从外部存储器获取 BMP 文件数据
dispbmp()
将 BMP 图片加载到 RAM 中,并显示到 LCD 上,显示速度快,但是需要大量的 RAM。 dispbmpex() 不需要将 BMP 加载到 RAM 中,显示速度慢,但是不需要大量的 RAM。
_WriteByte2File() 由函数 GUI_BMP_Serialize()调用,用于向文件写入数据。
create_bmppicture() 屏幕截图函数

在这里插入图片描述