利用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]); 

   并不是所有的 GIF 文件都是含有多帧的,所以我们在显示 GIF 的时候可以通过上面的代码根据 frameCount 的值判断这个 GIF 文件是否有多个帧。
   delete []pDimensionIDs;
   在确认有多个帧的图像以后,还要得到每帧图像显示的间隔时间。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
}

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用GDI+绘制折线图,您需要按照以下步骤进行操作: 1. 创建一个窗口或控件来承载您的图形。 2. 创建一个绘图表面对象,例如Graphics对象,以在窗口或控件上绘制图形。 3. 创建一个数据源,例如一个数组或列表,以存储您要绘制的数据。 4. 使用Graphics对象的DrawLine方法在绘图表面上绘制线条,使用数据源中的数据作为线条的坐标。 以下是一个示例代码片段,演示如何使用GDI+绘制折线图: ```csharp // 创建一个窗口或控件来承载您的图形 var graphics = this.CreateGraphics(); // 创建一个数据源 var data = new int[] { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 }; // 定义绘制区域的大小和位置 var rect = new Rectangle(50, 50, 300, 200); // 创建一个Pen对象,用于绘制线条 var pen = new Pen(Color.Black, 2); // 使用Graphics对象的DrawLine方法在绘图表面上绘制线条 for (int i = 0; i < data.Length - 1; i++) { var x1 = rect.Left + i * rect.Width / (data.Length - 1); var y1 = rect.Bottom - data[i] * rect.Height / 100; var x2 = rect.Left + (i + 1) * rect.Width / (data.Length - 1); var y2 = rect.Bottom - data[i + 1] * rect.Height / 100; graphics.DrawLine(pen, x1, y1, x2, y2); } ``` 在上述代码中,我们首先创建了一个Graphics对象来承载我们的图形。然后,我们创建了一个数据源,即一个包含10个整数的数组。接下来,我们定义了绘制区域的大小和位置,这里是一个宽度为300像素、高度为200像素的矩形,位于窗口或控件的位置(50,50)。然后,我们创建了一个Pen对象,用于绘制黑色、2像素宽的线条。最后,我们使用Graphics对象的DrawLine方法在绘图表面上绘制线条,循环遍历数据源中的数据,计算出每个点的坐标,并将它们连接起来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值