硬汉嵌入式论坛

 找回密码
 立即注册
查看: 27858|回复: 158
收起左侧

[emWin教程入门篇] 第十二期:PNG图片的显示方法(支持从外部Flash,SD等读取)

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
发表于 2013-10-4 17:22:58 | 显示全部楼层 |阅读模式
特别说明: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文件。
0.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。
2.png

        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
3.png

12. 2 移植到armfly - v5开发板上面
      12.2.1 将PNG的库添加到工程里面
         添加完成以后,编译会出现下面的错误,警告不用管,主要是因为两个版本不匹配造成的。
4.png

这里关键是改一下那个提示的错误,我这里只是做了一个简单的处理,把aboart注释掉
5.png

或者下面这样也是可以,自己定义一个

#include <stdio.h>
#define PNG_ABORT() abort()
        12.2.2 GUI_PNG_DrawEx() 绘制无需加载到存储器的PNG文件
        使用这个函数的时候,加载方式和前面的BMP,JPG,GIF是不一样的,下面把这个函数
贴上,具体不同的地方,大家可以对比一下。
  1. static int _GetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off) {
  2.   static int FileAddress = 0;
  3.   FIL *file;
  4.   DWORD    NumBytesRead;
  5.   U8     * pData;
  6.    
  7.   pData  = (U8 *)*ppData;
  8.   file = (FIL *)p;
  9.   //
  10.   // Set file pointer to the required position
  11.   //
  12.    if(Off == 1) FileAddress = 0;
  13.    else FileAddress = Off;
  14.    result =f_lseek(file, FileAddress);
  15.   //
  16.   // Read data into buffer
  17.   //
  18.   result = f_read(file, pData, NumBytesReq, &NumBytesRead);
  19.   if (result != FR_OK)
  20.   {
  21.     return;
  22.   }
  23.   //
  24.   // Return number of available bytes
  25.   //
  26.   return NumBytesRead;
  27. }
复制代码
       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, 下载次数: 2340)
12. 3  实验总结
        总体来说libpng还是比较的好用的,编译以后警告比较的多,不用在意,主要是版本不匹配造成的。
回复

使用道具 举报

20

主题

55

回帖

20

积分

初级会员

积分
20
发表于 2013-10-4 20:58:29 | 显示全部楼层
支持楼主[s:151] [s:151] [s:151]
天天向上
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2013-10-4 20:59:24 | 显示全部楼层
汉子哥加油,现在有点更不上了,话说PNG的显示,我搞了一段时间没有搞出来。。。。
[s:151] [s:151] [s:151]
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
 楼主| 发表于 2013-10-4 21:00:14 | 显示全部楼层
看来是放假了,没有啥人了。。。。
回复

使用道具 举报

91

主题

289

回帖

562

积分

金牌会员

积分
562
发表于 2013-10-4 22:22:44 | 显示全部楼层
学习学习。。。。。。。。。。
回复

使用道具 举报

0

主题

8

回帖

0

积分

新手上路

forever

积分
0
发表于 2013-10-4 23:07:30 | 显示全部楼层
[s:151]
回复

使用道具 举报

0

主题

14

回帖

14

积分

新手上路

积分
14
发表于 2013-10-5 09:03:31 | 显示全部楼层
硬汉出品,必属精品
回复

使用道具 举报

3

主题

48

回帖

3

积分

初级会员

积分
3
发表于 2013-10-5 10:26:42 | 显示全部楼层
支持一下
回复

使用道具 举报

2

主题

135

回帖

2

积分

初级会员

积分
2
发表于 2013-10-8 09:41:30 | 显示全部楼层
[s:151] [s:143] [s:141]
回复

使用道具 举报

12

主题

46

回帖

82

积分

初级会员

积分
82
发表于 2013-10-8 22:32:06 | 显示全部楼层
强悍[s:122]
回复

使用道具 举报

116

主题

799

回帖

1147

积分

至尊会员

积分
1147
QQ
发表于 2013-10-9 09:38:35 | 显示全部楼层
[s:147]  [s:151]  [s:151]  [s:151]  [s:151]
回复

使用道具 举报

0

主题

18

回帖

0

积分

新手上路

lcptw

积分
0
发表于 2013-10-9 13:19:43 | 显示全部楼层
[入门篇]. [s:141]  [s:141]  [s:141]
lcptw
回复

使用道具 举报

0

主题

17

回帖

0

积分

新手上路

积分
0
QQ
发表于 2013-10-9 17:40:52 | 显示全部楼层
走走,瞧瞧,看看
回复

使用道具 举报

0

主题

101

回帖

101

积分

初级会员

积分
101
发表于 2013-10-10 09:26:49 | 显示全部楼层
学习,收录了
回复

使用道具 举报

1

主题

38

回帖

41

积分

新手上路

THINK

积分
41
发表于 2013-10-10 10:04:22 | 显示全部楼层
楼主很强大,我喜欢楼主,哈哈。
紧跟楼主的步伐走。哈哈~~~~~~[s:150] [s:150] [s:150]
i love ARM
回复

使用道具 举报

41

主题

97

回帖

220

积分

高级会员

积分
220
发表于 2013-10-10 15:48:23 | 显示全部楼层
[s:151]
回复

使用道具 举报

16

主题

203

回帖

251

积分

高级会员

积分
251
发表于 2013-10-10 22:59:26 | 显示全部楼层
[s:151]  [s:151]  [s:151]  [s:151]  [s:151]
回复

使用道具 举报

16

主题

203

回帖

251

积分

高级会员

积分
251
发表于 2013-10-10 22:59:55 | 显示全部楼层
[s:151] [s:147] [s:147] [s:147]
回复

使用道具 举报

0

主题

9

回帖

0

积分

新手上路

积分
0
发表于 2013-10-14 15:08:23 | 显示全部楼层
[s:151]  [s:151]  [s:151]
回复

使用道具 举报

11

主题

34

回帖

67

积分

初级会员

积分
67
发表于 2013-10-14 16:33:05 | 显示全部楼层
[s:151]  [s:151]  [s:151]
回复

使用道具 举报

0

主题

17

回帖

0

积分

新手上路

积分
0
发表于 2013-10-14 22:25:52 | 显示全部楼层
谢谢
回复

使用道具 举报

79

主题

191

回帖

428

积分

高级会员

积分
428
发表于 2013-10-17 13:06:54 | 显示全部楼层
[s:151][s:151][s:151]
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2013-10-17 16:29:34 | 显示全部楼层
支持一下
回复

使用道具 举报

2

主题

34

回帖

40

积分

新手上路

积分
40
发表于 2013-10-21 21:08:58 | 显示全部楼层
顶起,支持一下楼主!!!!
回复

使用道具 举报

0

主题

23

回帖

23

积分

新手上路

积分
23
发表于 2013-10-22 09:20:34 | 显示全部楼层
多谢
回复

使用道具 举报

0

主题

17

回帖

0

积分

新手上路

积分
0
发表于 2013-10-22 22:01:56 | 显示全部楼层
学习学习[s:150]
回复

使用道具 举报

0

主题

6

回帖

0

积分

新手上路

积分
0
发表于 2013-10-23 12:47:33 | 显示全部楼层
[s:151]
回复

使用道具 举报

1

主题

25

回帖

1

积分

新手上路

积分
1
发表于 2013-10-24 09:47:12 | 显示全部楼层
不错,学习学习!
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2013-10-26 01:32:21 | 显示全部楼层
一直搞不了PNG 的桌面,..
回复

使用道具 举报

1

主题

38

回帖

41

积分

新手上路

THINK

积分
41
发表于 2013-10-27 16:45:56 | 显示全部楼层
楼主,你好
我调这个,整整调了3个星期,目前还问题,还在查,你是把GUI的ram挂在SRAM中的,我把GUI的RAM挂在SDRAM中,我确认SDRAM没有任何问题,调试了半天GUI_Init()这个函数一直不过,都是跳入GUI_error.查了很长时间,后来实在找不来原因,把ST-LINK,换成J-LINK.竟然可以过,要疯了,哈哈。
不知道楼主用的是什么仿真器,楼主可以试下,如果使用ST-LINK,看看有没有问题。
谢谢。
现在绘制已经加载到存储器中的图片没有问题,但是直接绘制,直接错误,目前还在查,还有我再多次绘制的时候,会出现SD卡错误。不知道是不是我读的太快,还是什么情况。有些时候会出现SD出错,还在分析原因。用的Sandisk class10的,之前操作SD卡从来没有遇到过这个问题。
i love ARM
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106692
QQ
 楼主| 发表于 2013-10-27 17:05:19 | 显示全部楼层

回 aizhixi106 的帖子

aizhixi106:楼主,你好
我调这个,整整调了3个星期,目前还问题,还在查,你是把GUI的ram挂在SRAM中的,我把GUI的RAM挂在SDRAM中,我确认SDRAM没有任何问题,调试了半天GUI_Init()这个函数一直不过,都是跳入GUI_error.查了很长时间,后来实在找不来原因,把ST-LINK,换成J-LINK.竟然可以过, .. (2013-10-27 16:45) 
我只用jlink,我这里显示PNG没啥问题。
回复

使用道具 举报

0

主题

18

回帖

0

积分

新手上路

积分
0
发表于 2013-10-28 10:42:50 | 显示全部楼层
谢谢 ,看看谢谢 ,看看
回复

使用道具 举报

1

主题

27

回帖

30

积分

新手上路

积分
30
发表于 2013-11-2 00:38:51 | 显示全部楼层
学习了~
回复

使用道具 举报

0

主题

23

回帖

23

积分

新手上路

积分
23
发表于 2013-11-5 20:35:37 | 显示全部楼层
学习
回复

使用道具 举报

1

主题

28

回帖

1

积分

新手上路

积分
1
发表于 2013-11-5 21:56:40 | 显示全部楼层
[s:151] [s:151]
回复

使用道具 举报

7

主题

39

回帖

60

积分

初级会员

积分
60
发表于 2013-11-6 00:13:33 | 显示全部楼层
謝謝分享~~ [s:149]  [s:149]  [s:149]
回复

使用道具 举报

0

主题

18

回帖

0

积分

新手上路

积分
0
发表于 2013-11-12 23:42:00 | 显示全部楼层
[s:141]
回复

使用道具 举报

3

主题

19

回帖

3

积分

新手上路

积分
3
发表于 2013-11-14 14:17:35 | 显示全部楼层
[s:151] [s:151] [s:151] [s:151] [s:151] [s:151]
回复

使用道具 举报

3

主题

68

回帖

77

积分

初级会员

积分
77
发表于 2013-11-15 08:59:54 | 显示全部楼层
[s:151]
回复

使用道具 举报

0

主题

18

回帖

0

积分

新手上路

积分
0
发表于 2013-11-15 14:03:47 | 显示全部楼层
[s:151]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-30 04:51 , Processed in 0.542276 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表