注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Kandy

长风破浪会有时,直挂云帆济沧海!

 
 
 

日志

 
 

GDI+显示GIF动画  

2010-08-10 10:47:06|  分类: C++知识点 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
多页图像是指图像中包含有多个图形页。每页可以看作图像帧。这些图像帧通过连续的显示就形成了一副动画。比如GIF文件。

GDI+的Image对象提供了直接的对GIF、TIF文件格式的支持。调用Image对象的成员函数GetFrameDimensionsCount可以得到Image对象的Dimension数。每个Dimension通过一个GUID标示。函数GetFrameDimensionsList可以返回所有Dimension的GUID值。第一个GUID值保存在函数参数pDimensionsIDs数组的索引0处。GetFrameCount可以得到每个Dimension里有多少个Frame。简单示例代码:
Image* image = new Image(L"Multiframe.gif");
UINT count = 0;
count = image->GetFrameDimensionsCount();
GUID *pDimensionIDs=(GUID*)new GUID[count];
image->GetFrameDimensionsList(pDimensionIDs, count);
WCHAR strGuid[39];
StringFromGUID2(pDimensionIDs[0], strGuid, 39);
UINT frameCount=image->GetFrameCount(&pDimensionIDs[0]);

delete []pDimensionIDs;
并不是所有的GIF文件都是含有多帧的,所以我们在显示GIF的时候可以通过上面的代码根据frameCount的值判断这个GIF文件是否有多个帧。

在确认有多个帧的图像以后,还要得到每帧图像显示的间隔时间。GDI+的Image对象提供了 GetPropertyItem获取图像的属性。GetPropertyItem函数需要用户传递数据返回缓冲区和大小。所以在使用前先用GetPropertyItemSize得到需要的缓冲区大小,分配空间后再取得属性数据。

//PropertyTagFrameDelay是GDI+中预定义的一个GIG属性ID值,表示标签帧数据的延迟时间

int size = GetPropertySize(PropertyTagFrameDelay);
PropertyItem* pItem = NULL;
pItem = (PropertyItem*)malloc(size);
image->GetPropertyItem(PropertyTagFrameDelay,size,pItem);
这样就把所有和PropertyTagFrameDelay属性相关的数据取到了pItem中。然后通过pItem访问结构中的value。每两帧图像之间的间隔时间是不一定相同的,所以还需要得到当前正显示的帧图像的索引值。最后调用Image对象的DrawImage函数把每帧图像画出来。简单代码如下:
int fcount=0;
//Guid的值在显示GIF为FrameDimensionTime,显示TIF时为FrameDimensionPage
GUID Guid = FrameDimensionTime;
while(thue)
{
Graphics gh(hDC); //hDC是外部传入的画图DC
gh.DrawImage(image,0,0,image->GetWidth(),image->GetHeight());
//重新设置当前的活动数据帧
image->SelectActiveFrame(&Guid,fcount++);
if(fcount == frameCount) //frameCount是上面GetFrameCount返回值
fcount= 0; //如果到了最后一帧数据又重新开始
//计算此帧要延迟的时间
long lPause = ((long*)pItem->value)[fcount]*10;
Sleep(lPause); //这里简单使用了sleep
  评论这张
 
阅读(308)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018