完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
转stemwin教程
本期主要讲emWin支持的BMP图片显示,官方支持的主要有两种显示方法,一种是从外部存储器读取数据到内部存储器然后来显示图片,这种的显示速度要快些,另一种方法是直接从外部存储器读取数据并显示,这种办法的好处就是不要大的RAM需求,每次读取一些数据显示一次,缺点就是显示速度比较的慢。 这里有一点必须的要说明一下,官方支持的这个BMP图片的显示速度没有咱们平时用的在TFT上面开窗然后填充图片数据的速度快,但是有一个非常大的好处就是使用官方的这个函数才能充分的发挥背景重绘等机制。 11. 1 BMP函数说明 11. 2 绘制已经加载到存储器的BMP图片 11. 3 绘制无须加载到存储器的BMP图片 11. 4 实验总结 11.1 BMP函数说明 关于BMP图片格式方面的知识,大家可以在google上面查找资料进行了解。这里重点的介绍一下STemWin对BMP图片的格式的支持。 对于一些频繁调用的BMP图片,大家可以用第9章上面说的位图转换器进行图片转换即可,只不过本期教程是将其转换成C文件。这里举两个例子,一个是转换一个带透明色的PNG格式图标,另一个是转换一张BMP格式的图片 11.1.1 PNG格式图标转BMP 这里我们演示的是如下带透明色的PNG图标,PNG格式的图标用到的地方还是非常多的,虽然用位图转换器(BmpCvt.exe)可以打开,但是转换后的C文件是不具备透明色效果的,这时得使用软件IconWorkshop进行转换(请使用正版软件),将其转换为32位带Alpha通道的BMP图片。 |
|
相关推荐
|
|
11.3 绘制无需加载到存储器的BMP图片
绘制无需加载到存储器的BMP图片方式可以有效的解决内部动态内存不够的情况,不过缺点也很明显,图片的显示速度很慢。这种方式一般是每次读取一行像素的数据,然后进行显示。这个工程的实现主要分为如下三个部分: Ø 使用芯片内部的SRAM作为动态内存 Ø 图片的加载以及显示函数 Ø 主函数 下面把这三部分详细的讲解下: l 使用芯片内部的SRAM作为动态内存(在文件GUIConf.c里面) 复制代码 /* ********************************************************************************************************* * * Defines * ******************************************************************************************************** */ /* Define the available number of bytes available for the GUI */ #define GUI_NUMBYTES (1024*70)(1) /* Define the average block size */ #define GUI_BLOCKSIZE 0x80(2) /********************************************************************* * * GUI_X_Config * * Purpose: * Called during the initialization process in order to set up the * available memory for the GUI. ********************************************************************** */ void GUI_X_Config(void) { #if 1(3) /* 32 bit aligned memory area */ static U32 aMemory[GUI_NUMBYTES / 4]; /* Assign memory to emWin */ GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES); GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); #else static U32 *aMemory; aMemory = (U32 *)EXT_SRAM_ADDR; /* Assign memory to emWin */ GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES); GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); #endif } |
|
|
|
|
|
1. 定义动态内存的大小,单位是字节。
2. 这里是定义内存块的大小,默认每个内存的大小是128字节。内存块的实际大小要看用户程序的需要,测试那种情况下最省内存,一般情况下取128个字节即可。 3. 这里是使用芯片内部的内存作为STemWin的动态内存空间。 l 图片的加载以及显示函数 复制代码 /* 实际的测试需要是图像宽度的4倍即可,切记(也就是保证每个像素如果是32位数据的情况) */ static char _acBuffer[480*4]; (1) /* ********************************************************************************************************* * * _GetData * * Purpose: * This routine is called by GUI_JPEG_DrawEx(). The routine is responsible * for setting the data pointer to a valid data location with at least * one valid byte. * * Parameters: * p - Pointer to application defined data. * NumBytesReq - Number of bytes requested. * ppData - Pointer to data pointer. This pointer should be set to * a valid location. * StartOfFile - If this flag is 1, the data pointer should be set to the * beginning of the data stream. * * Return value: * Number of data bytes available. ********************************************************************************************************* */ static int _GetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off) (2) { static int FileAddress = 0; UINT NumBytesRead; FIL *PicFile; PicFile = (FIL *)p; /* * Check buffer size */ if (NumBytesReq > sizeof(_acBuffer)) { NumBytesReq = sizeof(_acBuffer); } /* * Set file pointer to the required position */ if(Off == 1) FileAddress = 0; else FileAddress = Off; result =f_lseek(PicFile, FileAddress); /* * Read data into buffer */ result = f_read(PicFile, _acBuffer, NumBytesReq, &NumBytesRead); /* * Set data pointer to the beginning of the buffer */ *ppData = (const U8 *)_acBuffer; /* * Return number of available bytes */ return NumBytesRead; } /* ********************************************************************************************************* * 函 数 名: _ShowBMPEx * 功能说明: 显示BMP图片 * 形 参:sFilename 要显示图片的名字 * 返 回 值: 无 ********************************************************************************************************* */ static void _ShowBMPEx(const char * sFilename) { OS_ERR err; /* 打开文件 */ result = f_open(&file, sFilename, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS); if (result != FR_OK) { return; } // XSize = GUI_BMP_GetXSizeEx(_GetData, &file); // YSize = GUI_BMP_GetYSizeEx(_GetData, &file); OSSchedLock(&err); (3) GUI_BMP_DrawEx(_GetData, &file, 0, 0);(4) OSSchedUnlock(&err); f_close(&file); } |
|
|
|
|
|
1. 这个数据空间的大小比较讲究,至少得保证大于等于实际要显示图片一行像素的数据。比如要显示800*480分辨率,16bpp的一幅图片,那这个buffer的大小至少得是800*(16/8) = 1600字节。
2. 这个函数非常重要,大家要认真看一下英文注释即可。 3. 加上调度锁,防止图片显示的过程中出现异常。 4. 实现图片的显示函数。 l 主函数 复制代码 /* ********************************************************************************************************* * 函 数 名: MainTask * 功能说明: GUI主函数 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ void MainTask(void) { GUI_Init(); /* 设置皮肤函数 */ PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX); FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX); PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX); BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX); CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX); DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX); SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX); SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX); HEADER_SetDefaultSkin(HEADER_SKIN_FLEX); RADIO_SetDefaultSkin(RADIO_SKIN_FLEX); _ShowBMPEx("1.bmp"); while(1) { GUI_Delay(200); } } |
|
|
|
|
|
11.4 实验总结
总的来说,使用STM32F407刷新图片的能力有限,主要有以下四个限制图片显示速度的地方: l 图片数据的读取(比如从SD卡中读取图片)。 l FSMC总线的速度有限。 l 图片的解码过程也需要花费时间。 l 由于使用的是emWin本身的函数实现BMP图片的显示,不能够实现屏幕的开窗功能进行加速。这个在一定程度上面也限制了图片的显示速度。 |
|
|
|
|
|
644 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1819 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1262 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
1136 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1357 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12023 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 01:30 , Processed in 0.594763 second(s), Total 50, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号