|
- void ShowGIF(const TCHAR* puFile,u32 uiX,u32 uiY)
- {
- uint16_t i = 0;
- uint32_t t0, t1,bw,uiFileSize;
- char *_acBuffer;
- GUI_HMEM hMem;
- FRESULT result;
- FIL file;
- GUI_GIF_INFO InfoGif;
- GUI_GIF_IMAGE_INFO ImagInfoGif;
- GUI_MEMDEV_Handle hMemDev;
- /* 打开文件 */
- result = f_open(&file, (const TCHAR*)puFile, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
- if (result != FR_OK)
- {
- ERROR("f_open(%s)=%d\n",puFile,result);
- return;
- }
- /* 申请一块内存空间 并且将其清零 */
- uiFileSize = f_size(&file);
- hMem = GUI_ALLOC_AllocZero(uiFileSize);
- /* 将申请到内存的句柄转换成指针类型 */
- _acBuffer = GUI_ALLOC_h2p(hMem);
- /* 读取文件到动态内存 */
- result = f_read(&file, _acBuffer, uiFileSize, &bw);
- if (result != FR_OK)
- {
- ERROR("f_read(%s)=%d\n",puFile,result);
- return;
- }
- GUI_GIF_GetInfo(_acBuffer, uiFileSize, &InfoGif);
- hMemDev = GUI_MEMDEV_Create(uiX, uiY, 46, 105);
-
- g_tGuiSw.ucGifRun = 1;
- while(g_tGuiSw.ucGifRun)
- {
- /* 变量用来设置当前播放的帧数, InfoGif.NumImages 是 GIF 图片总的帧数 */
- if(i < InfoGif.NumImages)
- {
- /*解决密码牌闪烁问题*/
- if(GUI_GIF_PWD == g_tGuiSw.eGifType)
- {
- if((GUI_CHANEL_KET == g_tGuiSw.eCh) ||
- (GUI_CHANEL_LAC == g_tGuiSw.eCh) ||
- (GUI_CHANEL_NU == g_tGuiSw.eCh))
- {
- if(8 == i)
- {
- i++;
- }
- }
- else
- {
- if(11 == i)
- {
- i++;
- }
- }
- }
- /* 获取当前帧 GIF 图片信息,注意第 4 个参数是从 0 开始计数的 */
- GUI_GIF_GetImageInfo(_acBuffer, uiFileSize, &ImagInfoGif, i);
- /* 如果此帧延迟时间是 0,默认是延迟 100ms */
- if(ImagInfoGif.Delay == 0)
- {
- GUI_Delay(100);
- }
- else
- {
- t0 = GUI_GetTime();
- /* 解码并显示此帧 GIF 图片,注意第 5 个参数是从 0 开始计数的 */
- GUI_MEMDEV_Select(hMemDev);
- GUI_GIF_DrawSub(_acBuffer,uiFileSize,uiX,uiY,i++);
- GUI_MEMDEV_Select(0);
- GUI_MEMDEV_CopyToLCDAt(hMemDev, uiX, uiY);
- /* 获取本次解码和显示消耗的时间 */
- t1 = GUI_GetTime() - t0;
- /* 如果 GIF 的解码和显示的时间超时就不做延迟 */
- if (t1 < ImagInfoGif.Delay * 10)
- {
- GUI_Delay(ImagInfoGif.Delay * 10 - t1);
- }
- }
- }
- else
- {
- GUI_MEMDEV_Select(hMemDev);
- GUI_ClearRect(uiX,uiY,uiX+46,uiY+105);
- GUI_MEMDEV_Select(0);
- i = 0;
- }
- }
- /* 实际应用中,根据实际情况释放动态内存 */
- GUI_ALLOC_Free(hMem);
- f_close(&file);
- }
复制代码 gif 图片显示,会有残留,因此调用GUI_ClearRect(uiX,uiY,uiX+46,uiY+105);可以解决,但是也会将背景全部搞成白底,原来的背景是灰色的,不协调,请问怎么处理,谢谢
|
|