emWin – 显示GIF图

首先找个一个GIF图,越萌越好,哈哈,这次需要用到的是一个叫Bin2C.exe的软件,打开一个GIF文件,点击Convent,点击一次即可,你可以到GIF图的目录找对应的.C文件,我的放在桌面,直接看到了,如图:

第一步已经完成了,接下来我贴出代码,先看代码:

#include <stdlib.h>
#include "DIALOG.h"
//#include "SWIPELIST.h"

unsigned char acPic[] = {数据太多,已删除}
GUI_GIF_INFO GifInfo;
GUI_GIF_IMAGE_INFO ImageInfo;
void MainTask(void) {
	int i = 0;
	GUI_Init();
	GUI_SetBkColor(GUI_WHITE);
	GUI_Clear();
	GUI_GIF_GetInfo(acPic, sizeof(acPic), &GifInfo);
  
	while (1) {
		if (i < GifInfo.NumImages) {
			GUI_GIF_GetImageInfo(acPic, sizeof(acPic), &ImageInfo, i);
			GUI_GIF_DrawSub(acPic, 
				sizeof(acPic), 
				(LCD_GetXSize() - GifInfo.xSize) / 2, 
				(LCD_GetYSize() - GifInfo.ySize) / 2, 
				i++);
			/* 设置每个GIF子图像的时间间隔。*/
			GUI_Delay(ImageInfo.Delay * 15);
		}
		else
		{
			i = 0;
		}
	}
}

声明,代码中的一个acPic[]数组就是用Bin2C生成的数据,找一个软件打开这个Pic.文件,把数组复制过来。再看两个结构体,这个是在头文件已经包含的。不用理他。内容如下:

typedef struct {
  int xPos;
  int yPos;
  int xSize;
  int ySize;
  int Delay;
} GUI_GIF_IMAGE_INFO;

typedef struct {
  int xSize;
  int ySize;
  int NumImages;
} GUI_GIF_INFO;

简单的理解一下,第二个结构体是GIF图的信息,第一个结构体是组成GIF图所有子图的信息,可以理解为GIF图是由很多静态图组成的。

再看一下主函数主要调用的函数,我首先把背景色设置为白色。

来看第一个函数原型:int GUI_GIF_GetInfo(const void * pGIF, U32 NumBytes, GUI_GIF_INFO * pInfo);

参数 描述
pGIF 指向 gif 文件所在的存储器区域的起始位置。
NumBytes Gif 文件的字节数。
pInfo 指向该函数要填充的 GUI_GIF_INFO 结构

第二个函数原型:int GUI_GIF_GetImageInfo(const void * pGIF, U32 NumBytes,GUI_GIF_IMAGE_INFO * pInfo, int Index);

参数 描述
pGIF 指向 gif 文件所在的存储器区域的起始位置
NumBytes Gif 文件的字节数。
pInfo 指向该函数要填充的 GUI_GIF_IMAGE_INFO 结构。
Index 子图像基于 0 的索引。

第三个函数原型:int GUI_GIF_DrawSub(const void * pGIF, U32 NumBytes,int x0, int y0, int Index);

参数 描述
pGIF 指向 gif 文件所在的存储器区域的起始位置。
NumBytes Gif 文件的字节数。
x0 显示器中位图左上角的 X 位置。
y0 显示器中位图左上角的 Y 位置。
Index 要显示的子图像基于 0 的索引

下面截个程序某一刻运行的图,不知道怎么把GIF过程截下来:

所用到的代码可以到这个地址下载,下载地址http://download.csdn.net/my

PS:刚开始我也不知道怎么实现的,我也不知道用什么工具来处理GIF图,我以为一个函数就实现了,我也谷歌必应了很多资料,所以大家要多试试,肯定会成功,也可以参考自带例程。

但是,过程中我遇到一个问题,刚开始我认为,生成的Pic.c文件,直接包含过来用,用一个extern unsigned char acPic[];    或者#include”Pic.c”(这个在IAR我经常用到),但是用第一种方法能运行但不会显示,会提示“不完整的类型说明”,第二种方法直接报错。所以我就直接把生成的数组直接复制main函数之前用。

Tags:
489 Comments

Add a Comment

电子邮件地址不会被公开。