zoukankan      html  css  js  c++  java
  • GDI+显示GIF动画

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

       GDI+Image对象提供了直接的对GIFTIF文件格式的支持。调用Image对象的成员函数GetFrameDimensionsCount可以得到Image对象的Dimension数。每个Dimension通过一个GUID标示。函数GetFrameDimensionsList可以返回所有DimensionGUID值。第一个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得到需要的缓冲区大小,分配空间后再取得属性数据。  

       //PropertyTagFrameDelayGDI+中预定义的一个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的值在显示GIFFrameDimensionTime,显示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
    }

  • 相关阅读:
    一天搞懂深度学习--深度学习简介
    Ubuntu16.04下安装Hive
    Ubuntu16.04下安装Hadoop
    Hive入门学习--HIve简介
    循环神经网络(RNN)--学习笔记
    如何使用GitHub
    python pandas import 失败
    Azure ARM VM内部关机了,但门户却显示虚拟机还在处在“正在运行”的状态
    Exchange 2010 与 RMS(集成权限管理服务)集成
    统计 Exchange 2010 时间段收发邮件总量
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330124.html
Copyright © 2011-2022 走看看