硬汉嵌入式论坛

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

[emWin] emwin gif 闪烁问题

[复制链接]

100

主题

94

回帖

394

积分

高级会员

积分
394
发表于 2021-8-26 09:40:04 | 显示全部楼层 |阅读模式
  1. void ShowGIF(IsrtTp_e eGuiIsrtTp,const TCHAR* puFile,u8* pucFlg,u32 uiX,u32 uiY)
  2. {
  3.         uint16_t i = 0;
  4.         uint32_t t0, t1,bw,uiFileSize;
  5.         char *_acBuffer;
  6.         GUI_HMEM hMem;
  7.         FRESULT result;
  8.         FIL  file;
  9.         GUI_GIF_INFO InfoGif;
  10.         GUI_GIF_IMAGE_INFO ImagInfoGif;
  11.         GUI_MEMDEV_Handle hMemDev;

  12.         /* 打开文件 */
  13.         result = f_open(&file, (const TCHAR*)puFile, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
  14.         if (result != FR_OK)
  15.         {
  16.                 ERROR("f_open(%s)=%d\n",puFile,result);
  17.                 return;
  18.         }

  19.         /* 申请一块内存空间 并且将其清零 */
  20.         uiFileSize = f_size(&file);
  21.         hMem = GUI_ALLOC_AllocZero(uiFileSize);
  22.         /* 将申请到内存的句柄转换成指针类型 */
  23.         _acBuffer = GUI_ALLOC_h2p(hMem);

  24.         /* 读取文件到动态内存 */
  25.         result = f_read(&file, _acBuffer, uiFileSize, &bw);
  26.         if (result != FR_OK)
  27.         {
  28.                 ERROR("f_read(%s)=%d\n",puFile,result);
  29.                 return;
  30.         }
  31.         g_tIndieUrtSnd.eIsrtTp        = ISRT_TP_NONE;
  32.         GUI_GIF_GetInfo(_acBuffer, uiFileSize, &InfoGif);
  33.         printf("!!!!InfoGif.NumImages=%d\n",InfoGif.NumImages);

  34.         hMemDev = GUI_MEMDEV_Create(uiX, uiY, 46, 105);
  35.         while(*pucFlg)
  36.         {
  37.                 /*有两种情况跳出动图:
  38.                         1.插入介质的类型和GUI提示一致
  39.                         2.gui提示插入试纸时,如果插入的是密码牌,则更新密码牌,进入显示code界面
  40.                 */
  41.                 if((eGuiIsrtTp  == g_tIndieUrtSnd.eIsrtTp) ||
  42.                    ((ISRT_TP_PAPER == eGuiIsrtTp) && (ISRT_TP_PWD == g_tIndieUrtSnd.eIsrtTp)))
  43.                 {
  44.                         if(eGuiIsrtTp  == g_tIndieUrtSnd.eIsrtTp)
  45.                         {
  46.                                 printf("break gif:eGuiIsrtTp  == g_tIndieUrtSnd.eIsrtTp=%d\n",eGuiIsrtTp);
  47.                         }

  48.                         break;
  49.                 }

  50.                 /* 变量用来设置当前播放的帧数, InfoGif.NumImages 是 GIF 图片总的帧数 */
  51.                 if(i < InfoGif.NumImages)
  52.                 {
  53.                         /* 获取当前帧 GIF 图片信息,注意第 4 个参数是从 0 开始计数的 */
  54.                         GUI_GIF_GetImageInfo(_acBuffer, uiFileSize, &ImagInfoGif, i);
  55.                        
  56.                         printf("!!!!ImagInfoGif.Delay=%d\n",ImagInfoGif.Delay);
  57.                         /* 如果此帧延迟时间是 0,默认是延迟 100ms */
  58.                         if(ImagInfoGif.Delay == 0)
  59.                         {
  60.                                 GUI_Delay(100);
  61.                         }
  62.                         else
  63.                         {
  64.                                 t0 = GUI_GetTime();
  65.                                 /* 解码并显示此帧 GIF 图片,注意第 5 个参数是从 0 开始计数的 */
  66.                                 GUI_MEMDEV_Select(hMemDev);
  67.                                 GUI_GIF_DrawSub(_acBuffer,uiFileSize,uiX,uiY,i++);
  68.                                 GUI_MEMDEV_Select(0);
  69.                                 GUI_MEMDEV_CopyToLCDAt(hMemDev, uiX, uiY);
  70.                                 /* 获取本次解码和显示消耗的时间 */
  71.                                 t1 = GUI_GetTime() - t0;

  72.                                 /* 如果 GIF 的解码和显示的时间超时就不做延迟 */
  73.                                 if (t1 < ImagInfoGif.Delay * 10)
  74.                                 {
  75.   GUI_Delay(ImagInfoGif.Delay * 10 - t1);
  76.                                 }
  77.                         }
  78.                 }
  79.                 else
  80.                 {
  81.                         GUI_MEMDEV_Select(hMemDev);
  82.                         GUI_ClearRect(uiX,uiY,uiX+46,uiY+105);
  83.                         GUI_MEMDEV_Select(0);
  84.                         i = 0;
  85.                 }
  86.         }
  87.         /* 实际应用中,根据实际情况释放动态内存 */
  88.          GUI_ALLOC_Free(hMem);
  89.          f_close(&file);
  90. }
复制代码
对于paper_cho.gif  显示很流畅, 对于 pwd_cho.gif 有些闪烁,同样的代码。请问这该从何查起,谢谢
paper_cho.gif
pwd_cho.gif
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115812
QQ
发表于 2021-8-26 10:50:08 | 显示全部楼层
在我们的V6板子上面测试是否正常
回复

使用道具 举报

100

主题

94

回帖

394

积分

高级会员

积分
394
 楼主| 发表于 2021-8-26 15:35:13 | 显示全部楼层
eric2013 发表于 2021-8-26 10:50
在我们的V6板子上面测试是否正常

不正常
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115812
QQ
发表于 2021-8-26 15:56:35 | 显示全部楼层


我也测试了,你发的这个图,使用emWin的Gif库绘制确实有闪烁感,不清楚什么鬼。

确切的说还不是闪烁,是GIF帧刷到中间位置的时候,开始下次循环开始,貌似有个跳帧。

可以找个GIF软件,将中间这几个帧删掉。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-21 00:37 , Processed in 0.301525 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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