GIF文件是图形交换文件的格式,是由一组相隔指定间隔时间显示的图片组组成。使用GDI+可以播放GIF动画。为此,首先需要调用GetFrameDimensionsCount()函数来获取GIF动画中具有的帧数数目,并通过Image对象的GetPropertyItem()函数获取每帧图片之间的时间间隔。然后显示GIF文件,并设置当前有效的框架数据,根据获取的每帧的时间间隔,停顿一定的时间,继续显示,如此循环,就可以播放GIF动画了。具体代码如下:
- void CPlayMultiMediaDlg::OnButtonPlaygif() // 播放GIF文件
- {
- Image image(L"C:\\byebye.gif"); // 定义Image对象
- UINT uiCount = image.GetFrameDimensionsCount(); // 获取帧数
- GUID *pDimensionIDs=(GUID*)new GUID[uiCount];
- image.GetFrameDimensionsList(pDimensionIDs, uiCount); // 获取帧数据
- UINT uiFrameCount=image.GetFrameCount(&pDimensionIDs[0]);
- delete []pDimensionIDs;
- UINT uiSize;
- uiSize = image.GetPropertyItemSize(PropertyTagFrameDelay);
- // 获取帧延时长度
- PropertyItem* pItem = (PropertyItem*)malloc(uiSize);
- image.GetPropertyItem(PropertyTagFrameDelay, uiSize, pItem);
- // 获取属性项
- GUID Guid = FrameDimensionTime;
- CDC* pDC = GetDC(); // 获取设备上下文
- while(true) // 依次处理每帧
- {
- Graphics gh(pDC->m_hDC); // hDC是 外部传入的画图DC
- gh.DrawImage(&image,0, 0, image.GetWidth(), image.GetHeight());
- image.SelectActiveFrame(&Guid, uiCount++); // 重新设置 当前的活动数据帧
- if(uiCount == uiFrameCount) uiCount= 0;
- long lPause = ((long*)(pItem->value))[uiCount];// 计算 此帧要延迟的时间
- Sleep(lPause); // 停止 指定长度时间值
- }
- }
上面代码在画布的左上角播放C:\\byebye.gif GIF动画。