硬汉嵌入式论坛

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

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

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107048
QQ
发表于 2013-9-24 19:53:21 | 显示全部楼层 |阅读模式
特别说明: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的初学者不用担心,现在前面这几期例子,不用理解为什么这么做,只需会调用相应的API函数
就可以了随着后面几期的进行,会逐渐讲这方面的东西,现在要做的就是熟练的使用这些API函数。
       本期主要讲emWin支持的GIF图片的显示,官方支持的主要有两种显示方法,一种是从外部存储器读取数据到内部存
储器然后来显示图片,这种的显示速度要快些,另一种方法是直接从外部存储器读取数据并显示,这种办法的好处就是不要
大的RAM需求,每次读取一些数据显示一次,坏处就是显示速度比较的慢。
       这里将2MB的外部SRAM做为emWin的动态内存。
GUI_GIF_DrawSubEx()   绘制无需加载到存储器的GIF文件的给定子图像
这个GIF格式的图片稍稍有点大,有2.6M, 刷新的时候不是很快
6.PNG

GUI_GIF_DrawSub()   绘制已加载到存储器的GIF文件的给定子图像
7.PNG

GUI_GIF_DrawSubScaled() 绘制已加载到存储器的带比例的GIF文件的给定子图像。这里是放大了3倍
5.PNG


本期分为三个小节:
9. 1  GIF函数说明(手册上面有一个错误一直没有改过来)
9. 2 移植到armfly - v5开发板上面
9. 3  实验总结



9. 1  GIF函数说明
       9.1.1 GIF文件
       20世纪80年代,CompuServe Information Service开发出了GIF文件格式(图形交换格式)。它设计用于
跨数据网络传输图像。GIF标准支持隔行扫描、透明、应用定义数据、动画以及原始文本渲染。emWin将忽略
原始文本或应用特定数据等不受支持的数据。文件使用LZW (Lempel-Zif-Welch)文件压缩方法来压缩图像数据。
这种压缩方法运行起来不会丢失数据。输出图像与输入图像完全相同。
       图形库首先对图形信息进行解码。如果必须绘制图像,解码流程将花费相当长的时间。如果在窗口管理器经
常调用的callback例程中使用GIF文件,则解码流程可能花费相当长的时间。通过使用存储设备可缩短计算时间。
最好的方法是先将图像绘制到存储设备中。在这种情况下,将只进行一次解压缩。
       emWin的GIF解压缩例程大约需要16千字节动态分配的RAM进行解压缩。绘制图像后,将释放用于解压缩的
RAM。
       9.1.2 GIF库函数
        这里有一点要说明一下,GUI_GIF_Draw()和GUI_GIF_DrawEx()只能绘制GIF文件的第一个图像,绘制GIF文件
的子图像有专门的函数GUI_GIF_DrawSub()和GUI_GIF_DrawSubEx(),这里着重的说一下获取GIF图像信息的两个
函数GUI_GIF_GetInfo(),看一下这个函数能得到GIF图像的什么信息,关于这个函数,手册上面有一个错误,现在
的5.22版本也没有改过来,红方块里面X,Y大小的变量应该是xSize和ySize,这里要切记
8.png

还有一个函数就是GUI_GIF_GetImageInfo,这样是在绘制子图像的时候用的。
9.png

      9.1.2 如何绘制GIF图像
        下面以绘制加载到内部存储器的函数为例

  GUI_GIF_GetInfo(_acBuffer2, file.fsize, &InfoGif1);
   while(1)
   {
        if(i < InfoGif1.NumImages)
        {
            GUI_GIF_GetImageInfo(_acBuffer2, file.fsize, &InfoGif2, i);
            GUI_GIF_DrawSub(_acBuffer2,
                                    file.fsize,
                                     (LCD_GetXSize() - InfoGif1.xSize)/2,
                             (LCD_GetYSize() - InfoGif1.ySize)/2,
                                      i++);
            /* 这个函数要注意,主要是设置每个GIF子图像的时间间隔的。*/
                 GUI_X_Delay(InfoGif2.Delay*10);                     
        }
        else
        {
            i = 0;
        }
  }
9. 2  移植到armfly - v5开发板上面
    程序里面有一个地方注意一下就可以了,这里使用了条件编译将两种显示方法做了区分。
        #if 1
            /* 绘制无需加载到存储器的GIF文件 */     

            _ShowGIFEx("2.gif");
         #else   

             /* 绘制已加载到存储器的GIF文件 */
            _ShowGIF("4.gif");    #endif

9. 3  实验总结
整体来说显示GIF的速度还算可以,不过刷图片依然不是很给力。
SD卡中需要放的图片
SD卡根目录下.zip (2.74 MB, 下载次数: 504)
程序下载
第九期:STemWin5.20+uCOS-III+FatFS.zip (15.78 MB, 下载次数: 944)
回复

使用道具 举报

20

主题

55

回帖

20

积分

初级会员

积分
20
发表于 2013-9-24 19:56:33 | 显示全部楼层
强烈支持[s:150] [s:150] [s:150]
天天向上
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2013-9-24 19:56:55 | 显示全部楼层
支持汉子哥,太需要这个了[s:151] [s:151] [s:151] [s:151]
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

0

主题

8

回帖

0

积分

新手上路

forever

积分
0
发表于 2013-9-24 22:12:18 | 显示全部楼层
[s:151]
回复

使用道具 举报

0

主题

15

回帖

0

积分

新手上路

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

使用道具 举报

0

主题

14

回帖

14

积分

新手上路

积分
14
发表于 2013-9-25 08:44:51 | 显示全部楼层
好东西,一直跟着楼主学习进步
回复

使用道具 举报

41

主题

97

回帖

220

积分

高级会员

积分
220
发表于 2013-9-25 08:48:20 | 显示全部楼层
好!
回复

使用道具 举报

91

主题

289

回帖

562

积分

金牌会员

积分
562
发表于 2013-9-25 20:23:00 | 显示全部楼层
学习学习
回复

使用道具 举报

2

主题

19

回帖

25

积分

新手上路

积分
25
发表于 2013-9-25 23:22:37 | 显示全部楼层
[s:151]
回复

使用道具 举报

116

主题

800

回帖

1148

积分

至尊会员

积分
1148
QQ
发表于 2013-9-26 16:53:00 | 显示全部楼层
慢慢学
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107048
QQ
 楼主| 发表于 2013-9-27 16:01:59 | 显示全部楼层
这个帖子看的人有些少,看来用GIF的人比较少一些
回复

使用道具 举报

12

主题

46

回帖

82

积分

初级会员

积分
82
发表于 2013-9-28 23:31:52 | 显示全部楼层
这个  好呀
回复

使用道具 举报

0

主题

25

回帖

25

积分

新手上路

积分
25
发表于 2013-9-29 13:58:06 | 显示全部楼层
跟进!!!楼主辛苦了!
[s:151] [s:151]
回复

使用道具 举报

0

主题

18

回帖

0

积分

新手上路

lcptw

积分
0
发表于 2013-9-30 13:49:20 | 显示全部楼层
[s:137] [s:137] [s:137] [s:137] [s:137]
lcptw
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2013-9-30 14:32:10 | 显示全部楼层
正在学习emwin
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2013-9-30 22:18:17 | 显示全部楼层
看看
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107048
QQ
 楼主| 发表于 2013-10-4 11:39:32 | 显示全部楼层
顶一下
回复

使用道具 举报

3

主题

48

回帖

3

积分

初级会员

积分
3
发表于 2013-10-5 10:36:55 | 显示全部楼层
学习,再学习
回复

使用道具 举报

0

主题

17

回帖

0

积分

新手上路

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

使用道具 举报

0

主题

101

回帖

101

积分

初级会员

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

使用道具 举报

16

主题

203

回帖

251

积分

高级会员

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

使用道具 举报

0

主题

17

回帖

0

积分

新手上路

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

使用道具 举报

0

主题

17

回帖

0

积分

新手上路

积分
0
发表于 2013-10-16 13:52:52 | 显示全部楼层
[s:151]  [s:151]  [s:151]
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2013-10-17 16:23:47 | 显示全部楼层
学习学习
回复

使用道具 举报

11

主题

34

回帖

67

积分

初级会员

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

使用道具 举报

0

主题

3

回帖

0

积分

新手上路

积分
0
发表于 2013-10-20 14:28:47 | 显示全部楼层
Mark
回复

使用道具 举报

0

主题

6

回帖

0

积分

新手上路

积分
0
发表于 2013-10-21 06:58:16 | 显示全部楼层
[s:151]
回复

使用道具 举报

2

主题

34

回帖

40

积分

新手上路

积分
40
发表于 2013-10-21 21:02:29 | 显示全部楼层
不错,支持一下楼主!
回复

使用道具 举报

0

主题

23

回帖

23

积分

新手上路

积分
23
发表于 2013-10-22 09:18:39 | 显示全部楼层
支持楼主[s:151]
回复

使用道具 举报

0

主题

17

回帖

0

积分

新手上路

积分
0
发表于 2013-10-22 21:59:26 | 显示全部楼层
这个比较厉害
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2013-10-25 12:11:23 | 显示全部楼层
请教在Image widget上如何放置GiF图片,用IMAGE_SetGIF()不能显示,IMAGE_SetBMP()可正常显示。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107048
QQ
 楼主| 发表于 2013-10-25 12:16:49 | 显示全部楼层

回 hzv21 的帖子

hzv21:请教在Image widget上如何放置GiF图片,用IMAGE_SetGIF()不能显示,IMAGE_SetBMP()可正常显示。 (2013-10-25 12:11) 
估计是内存大小没有开够吧,GIF比较耗内存
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2013-10-25 12:24:03 | 显示全部楼层
用GUI_GIF_DrawSub()可以正常显示GIF图片,但不知如何放置在Image widget上,用IMAGE_SetGIF()不能显示?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107048
QQ
 楼主| 发表于 2013-10-25 12:57:55 | 显示全部楼层

回 hzv21 的帖子

hzv21:用GUI_GIF_DrawSub()可以正常显示GIF图片,但不知如何放置在Image widget上,用IMAGE_SetGIF()不能显示? (2013-10-25 12:24) 
估计是你没有正确的使用,后面我们会出一个教程的。
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2013-10-25 14:07:35 | 显示全部楼层

回 eric2013 的帖子

eric2013:估计是你没有正确的使用,后面我们会出一个教程的。 (2013-10-25 12:57)
期待!
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2013-10-25 17:11:00 | 显示全部楼层

回 eric2013 的帖子

eric2013:估计是内存大小没有开够吧,GIF比较耗内存 (2013-10-25 12:16)
在VC中模拟了,是内存大小没有开够问题,用GUI_GIF_DrawSub()不太耗内存,用IMAGE_SetGIF()比较耗内存,谢谢!
回复

使用道具 举报

11

主题

59

回帖

11

积分

初级会员

积分
11
发表于 2013-10-26 10:50:31 | 显示全部楼层
[s:152]  [s:151]
回复

使用道具 举报

0

主题

18

回帖

0

积分

新手上路

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

使用道具 举报

1

主题

27

回帖

30

积分

新手上路

积分
30
发表于 2013-11-2 00:33:56 | 显示全部楼层
学习。。。。。。[s:145]
回复

使用道具 举报

0

主题

23

回帖

23

积分

新手上路

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 14:01 , Processed in 0.606580 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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