硬汉嵌入式论坛

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

[emWin] gif 图片 显示&&背景处理

[复制链接]

100

主题

94

回帖

394

积分

高级会员

积分
394
发表于 2021-10-9 15:09:02 | 显示全部楼层 |阅读模式
  1. void ShowGIF(const TCHAR* puFile,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.         GUI_GIF_GetInfo(_acBuffer, uiFileSize, &InfoGif);

  32.         hMemDev = GUI_MEMDEV_Create(uiX, uiY, 46, 105);
  33.        
  34.         g_tGuiSw.ucGifRun = 1;
  35.         while(g_tGuiSw.ucGifRun)
  36.         {
  37.                 /* 变量用来设置当前播放的帧数, InfoGif.NumImages 是 GIF 图片总的帧数 */
  38.                 if(i < InfoGif.NumImages)
  39.                 {
  40.                         /*解决密码牌闪烁问题*/
  41.                         if(GUI_GIF_PWD == g_tGuiSw.eGifType)
  42.                         {
  43.                                 if((GUI_CHANEL_KET == g_tGuiSw.eCh) ||
  44.                               (GUI_CHANEL_LAC == g_tGuiSw.eCh) ||
  45.                               (GUI_CHANEL_NU  == g_tGuiSw.eCh))
  46.                                 {
  47.                                         if(8 == i)
  48.                                         {
  49.                                                 i++;
  50.                                         }
  51.                                 }
  52.                                 else
  53.                                 {
  54.                                         if(11 == i)
  55.                                         {
  56.                                                 i++;
  57.                                         }
  58.                                 }
  59.                         }

  60.                         /* 获取当前帧 GIF 图片信息,注意第 4 个参数是从 0 开始计数的 */
  61.                         GUI_GIF_GetImageInfo(_acBuffer, uiFileSize, &ImagInfoGif, i);
  62.                         /* 如果此帧延迟时间是 0,默认是延迟 100ms */
  63.                         if(ImagInfoGif.Delay == 0)
  64.                         {
  65.                                 GUI_Delay(100);
  66.                         }
  67.                         else
  68.                         {
  69.                                 t0 = GUI_GetTime();
  70.                                 /* 解码并显示此帧 GIF 图片,注意第 5 个参数是从 0 开始计数的 */
  71.                                 GUI_MEMDEV_Select(hMemDev);
  72.                                 GUI_GIF_DrawSub(_acBuffer,uiFileSize,uiX,uiY,i++);
  73.                                 GUI_MEMDEV_Select(0);
  74.                                 GUI_MEMDEV_CopyToLCDAt(hMemDev, uiX, uiY);
  75.                                 /* 获取本次解码和显示消耗的时间 */
  76.                                 t1 = GUI_GetTime() - t0;

  77.                                 /* 如果 GIF 的解码和显示的时间超时就不做延迟 */
  78.                                 if (t1 < ImagInfoGif.Delay * 10)
  79.                                 {
  80.                                         GUI_Delay(ImagInfoGif.Delay * 10 - t1);
  81.                                 }
  82.                         }
  83.                 }
  84.                 else
  85.                 {
  86.                         GUI_MEMDEV_Select(hMemDev);
  87.                         GUI_ClearRect(uiX,uiY,uiX+46,uiY+105);
  88.                         GUI_MEMDEV_Select(0);
  89.                         i = 0;
  90.                 }
  91.         }
  92.         /* 实际应用中,根据实际情况释放动态内存 */
  93.          GUI_ALLOC_Free(hMem);
  94.          f_close(&file);
  95. }
复制代码
gif 图片显示,会有残留,因此调用GUI_ClearRect(uiX,uiY,uiX+46,uiY+105);可以解决,但是也会将背景全部搞成白底,原来的背景是灰色的,不协调,请问怎么处理,谢谢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115812
QQ
发表于 2021-10-9 15:45:12 | 显示全部楼层
此贴回复过这个问题,感觉都是一个问题。

emwin  gif  闪烁问题
http://www.armbbs.cn/forum.php?m ... d=108471&fromuid=58
(出处: 硬汉嵌入式论坛)

回复

使用道具 举报

100

主题

94

回帖

394

积分

高级会员

积分
394
 楼主| 发表于 2021-10-9 16:05:03 | 显示全部楼层
eric2013 发表于 2021-10-9 15:45
此贴回复过这个问题,感觉都是一个问题。

emwin  gif  闪烁问题

不是一个问题,闪烁的问题解决了,我将有问题的帧跳过就不闪烁了。
现在的问题是:gif 显示一个周期,会产生残留,影响第二个显示周期。当然显示完一个周期,调用GUI_ClearRect  也能解决,但是gif 是在一个背景图片上显示的,GUI_ClearRect 会把背景那一部分清成白色,关键问题是,如何清残留的情况下,保证背景不被清除?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115812
QQ
发表于 2021-10-9 16:10:27 | 显示全部楼层
上传图片,改天有时间了我试试
回复

使用道具 举报

100

主题

94

回帖

394

积分

高级会员

积分
394
 楼主| 发表于 2021-10-9 17:31:15 | 显示全部楼层
eric2013 发表于 2021-10-9 16:10
上传图片,改天有时间了我试试

两张图片,一张是背景,一张是gif

背景

背景

gif

gif
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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