Gdiplus 读取并显示 Gif

Gdiplus提供的Bitmap支持读取并显示GIF文件.

但是对于部分GIF图片可能会出现帧间间隔为0的情况,为此,在此情况下默认时间间隔为100ms, 不知道是不是我没有找对,有建议欢迎反馈! (测试在GIMP中同样会出现帧间间隔为0,我想应是有个默认值的吧,100ms效果还可以接受,暂且借用)

[c-sharp]  view plain copy
  1. #define UM_TIMER_GIFNEXTFRAME (WM_USER+0x01)                //message for timer  
  2. int iphotoframecurrent = 0;  
  3. int iphotoframeindex;  
  4. GUID* pphotoframeDimensionIDs = NULL;  
  5. PropertyItem* pphotoframeItem = NULL;  
  6. void GifInit(Bitmap* pSrc)  
  7. {  
  8.     iphotoframeindex = pSrc->GetFrameDimensionsCount();  
  9.     pphotoframeDimensionIDs = (GUID*)new GUID[iphotoframeindex];  
  10.     pSrc->GetFrameDimensionsList(pphotoframeDimensionIDs, iphotoframeindex);  
  11.     WCHAR strGuid[64] = {0};  
  12.     StringFromGUID2(pphotoframeDimensionIDs[0], strGuid, 64);  
  13.     int iphotoframecount=pSrc->GetFrameCount(&pphotoframeDimensionIDs[0]);  
  14.     if (iphotoframecount==1)    //not dynamic GIF, only one frame  
  15.     {  
  16.         return;  
  17.     }  
  18.     UINT TotalBuffer = pSrc->GetPropertyItemSize(PropertyTagFrameDelay);  
  19.     pphotoframeItem = (PropertyItem*)malloc(TotalBuffer);  
  20.     pSrc->GetPropertyItem(PropertyTagFrameDelay,TotalBuffer,pphotoframeItem);  
  21.     iphotoframecurrent = 0;  
  22.     GUID Guid = FrameDimensionTime;  
  23.     pSrc->SelectActiveFrame(&Guid,iphotoframecurrent);       // Get current frame  
  24.     int delay = ((UINT*)pphotoframeItem[0].value)[iphotoframecurrent];  
  25.     if (0==delay)                           // No delay time, use default 100ms  
  26.     {  
  27.         delay = 100;  
  28.     }  
  29.     SetTimer(UM_TIMER_GIFNEXTFRAME, delay, NULL);  
  30.     ++ iphotoframecurrent;  
  31.     g_bGIFStoped = FALSE;  
  32. }  
  33. void OnTimer(UINT_PTR nIDEvent)  
  34. {  
  35.     if (UM_TIMER_GIFNEXTFRAME == nIDEvent)  
  36.     {  
  37.         KillTimer(nIDEvent);   
  38.         if (iphotoframecount==1)  
  39.         {  
  40.             return;  
  41.         }  
  42.         GUID Guid = FrameDimensionTime;  
  43.         pSrc->SelectActiveFrame(&Guid,iphotoframecurrent);  
  44.         int delay = ((UINT*)pphotoframeItem[0].value)[iphotoframecurrent]*10;   // i also want to know why mul 10 here??  
  45.         if(0==delay)  
  46.             delay = 100;  
  47.         SetTimer(UM_TIMER_GIFNEXTFRAME, delay, NULL);   
  48.         iphotoframecurrent = (++iphotoframecurrent) % iphotoframecount;  
  49.     }  
  50. }  
  51. free(pphotoframeItem);                      // Free after used!  
  52. delete [] pphotoframeDimensio  

 

具体代码见上。

主要思路是读取GIF文件, 通过pSrc->GetFrameCount()获取GIF的帧数, 通过 pSrc->SelectActiveFrame()来设置当前图片为GIF中的第X帧, 最后通过sleep() 和 Timer() 来实现时间延迟和当前帧更新.

 

上述代码中:

Bitmap* pSrc = ::new Bitmap(filename);

同样最后需要

::delete pSrc;


转自:http://blog.csdn.net/jtujtujtu/article/details/4039294

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值