|
特别说明:pdf版60期emWin教程已经发布:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=2932
armfly-x2,x3,v2,v3,v5开发板裸机和带系统的emWin工程已经全部建立,链接如下:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=1830
本期主要讲emWin支持的PNG图片的显示,官方支持的主要有两种显示方法,一种是从外部存储器读取数据到内部存
储器然后来显示图片,这种的显示速度要快些,另一种方法是直接从外部存储器读取数据并显示,这种办法的好处就是不要
大的RAM需求,每次读取一些数据显示一次,坏处就是显示速度比较的慢。
这里将2MB的外部SRAM做为emWin的动态内存,PNG的图片显示相当耗费RAM。
有一点在这里提前得和大家说明,PNG的库emWin里面是不带的,需要自己添加,从SEGGER的官网下载,这个库是来自
libpng,官网www.libpng.org
GUI_PNG_Draw() 绘制已加载到存储器的PNG文件。
GUI_PNG_DrawEx() 绘制无需加载到存储器的PNG文件。
本期分为三个小节:
12. 1 PNG图片说明
12. 2 移植到armfly - v5开发板上面
12. 3 实验总结
12. 1 PNG图片说明
12.1.1 PNG文件支持
PNG(可移植的网络图形)格式是一种图像格式,它利用非专利的数据压缩方法提供无损的数据压缩
和Alpha混合。PNG 1.0版规范于1996年发布。到2003年末,PNG成为国际标准(ISO/IEC15948)。emWin
对PNG支持的实施基于来自Glenn Randers-Pehrson、Guy Eric Schalnat和Andreas Dilger的“libpng”
库,该库可在www.libpng.org下免费获得。emWin对该库的使用符合GUI\PNG\png.h中的版权通知,通知
中允许使用该库,而没有任何限制。emWin的PNG库可从www.segger.com/link/emwin_png.zip获得。
从SEGGER官网下载的png如下,这里我们使用最新的5.18版本,编译的时候还是会提示Old-style。
12.1.2 将PNG文件转换为C源
某些情况下,将PNG文件作为C文件添加到项目中非常有用。对此,可完全按照前面介绍的“JPEG
文件支持”下的相同方式来执行。此外,位图转换器能够加载PNG文件并将它们转换为C位图文件。
12.1.3 显示PNG文件
图形库首先对图形信息进行解码。如果必须绘制图像,解码流程将花费相当长的时间。如果在窗口管
理器经常调用的callback例程中使用PNG文件,则解码流程可能花费相当长的时间。通过使用存储设备可缩
短计算时间。最好的方法是先将图像绘制到存储设备中。在这种情况下,将只进行一次解压缩。
12.1.4 存储器使用
PNG解压缩大约需要21 Kb RAM用于与图像大小无关的解压缩和依赖大小的字节量。RAM要求可按
以下方式计算: 大约RAM要求= (X-Size + 1)* Y大小* 4 + 21Kbyte
这里特别的注意,PNG非常的耗费RAM的,比如显示一个简单的100*100的png图片,需要RAM
(100 + 1) * 100 * 4 + 21000 = 61400,这里是使用的外部SRAM做为动态内存的,如果大家使用我下面
提供的方法不能够正确的显示的话,估计就是RAM不够造成的。
12.1.4 PNG文件API
12. 2 移植到armfly - v5开发板上面
12.2.1 将PNG的库添加到工程里面
添加完成以后,编译会出现下面的错误,警告不用管,主要是因为两个版本不匹配造成的。
这里关键是改一下那个提示的错误,我这里只是做了一个简单的处理,把aboart注释掉
或者下面这样也是可以,自己定义一个
#include <stdio.h>
#define PNG_ABORT() abort()
12.2.2 GUI_PNG_DrawEx() 绘制无需加载到存储器的PNG文件
使用这个函数的时候,加载方式和前面的BMP,JPG,GIF是不一样的,下面把这个函数
贴上,具体不同的地方,大家可以对比一下。
- static int _GetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off) {
- static int FileAddress = 0;
- FIL *file;
- DWORD NumBytesRead;
- U8 * pData;
-
- pData = (U8 *)*ppData;
- file = (FIL *)p;
- //
- // Set file pointer to the required position
- //
- if(Off == 1) FileAddress = 0;
- else FileAddress = Off;
- result =f_lseek(file, FileAddress);
- //
- // Read data into buffer
- //
- result = f_read(file, pData, NumBytesReq, &NumBytesRead);
- if (result != FR_OK)
- {
- return;
- }
- //
- // Return number of available bytes
- //
- return NumBytesRead;
- }
复制代码 12.2.3 图片的显示
/* 绘制已加载到存储器的PNG文件 */
_ShowPNG("1.png", 0, 0);
_ShowPNG("2.png", 100, 0);
/* 绘制无需加载到存储器的PNG文件 */
_ShowPNGEx("3.png", 0, 100);
_ShowPNGEx("4.png", 100,100);
详细的,大家看源码就可以,这里显示了四个96*96点阵的PNG图片
需要放到SD卡根目录下的图片
png.zip
(50 KB, 下载次数: 602)
程序下载
第十二期:STemWin5.20+uCOS-III+FatFS.zip
(16.22 MB, 下载次数: 2341)
12. 3 实验总结
总体来说libpng还是比较的好用的,编译以后警告比较的多,不用在意,主要是版本不匹配造成的。 |
|