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() 屏幕截图函数