GDI+显示GIF动画

摘要:
GDI+的Image对象直接支持GIF和TIF文件格式。GetFrameDimensionsList函数可以返回所有维度的GUID值。简单的示例代码:Image*Image=newImage;UINT计数=0;count=image-˃GetFrameDimensionsCount();GUID*pDimensionID=newGUID[count];image-˃GetFrameDimensionsList;WCHARstrGuid[39];字符串来自GUID2;UINTframeCount=image-˃GetFrameCount;删除[]pDimensionID;并非所有的GIF文件都包含多个帧,因此我们可以在显示GIF//PropertyTagFrameDelay时根据frameCount值来确定GIF文件是否有多个帧。PropertyTagFrameDelay是GDI+中预定义的GIG属性ID值,表示标记帧数据的延迟时间intsize=GetPropertySize;PropertyItem*pItem=NULL;pItem=malloc;image-˃GetPropertyItem;通过这种方式,与PropertyTagFrameDelay属性相关的所有数据都被提取到pItem中。最后,调用Image对象的DrawImage函数来绘制每帧图像。

    多页图像是指图像中包含有多个图形页。每页可以看作图像帧。这些图像帧通过连续的显示就形成了一副动画。比如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
}

免责声明:文章转载自《GDI+显示GIF动画》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇spring的aop编程(半自动、全自动)php 二维数组索引乱序 shuffle() 函数;下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用GDI+保存位图文件为PNG文件

1.添加头文件 #include <ocidl.h>  #include <olectl.h>#include <stdio.h>#include <atlconv.h> #include <GdiPlus.h>using namespace Gdiplus; #pragma comment( l...

GPU渲染和GDI

   要实现这样一段逻辑,用GPU画3D图,用GDI画二维图元,怎么样效率高。相传Vista年代,是这样干的: 硬件渲染的东西在GPU上做完 读回CPU端 把GDI这些用软件渲染 两者混合 拷贝到显存显示 这样的话,相当于整个屏幕都要维持2份拷贝,并且要互相同步。早期的vista驱动上,D3D/OGL和GDI混合使用的话闪得要死或者慢的要死,就是这个原...

WinForm GDI+自定义控件总结(一)

前言   由于项目的原因好久没写博客了,也正是项目的原因开始系统的学习WinForm,从而接触到自定义控件的开发。自定义控件的开发有一定的难度,对开发者要求比较高,需要了解Windows运行的机制,熟悉win32Api和GDI+。下面是我收集的一些资料,挺不错的。 资料 .NET组件编程http://www.cnblogs.com/mapserver/ca...

C语言 屏幕截图 (GDI)

截取全屏幕 #include <windows.h> voidecho(CHAR*str); intCaptureImage(HWNDhWnd, CHAR*dirPath, CHAR*filename); intmain() { echo(TEXT("Ready")); CaptureImage(GetDesktopWindo...

切图时图片的选择:JPG、PNG、GIF的区别

目前网站图片的采用一共有流行三种,分别是JPG、PNG、GIF,然而很多人并不知道三者在选择的时候究竟应该选谁。虽然都可以存储图片,但是如果要发布到网上,就必须考虑速度、大小和失真程度的问题。如果你运用得好,选对图片,那样便会使网站的整体体验上升,如果你运用得不好,就会引起反效果。下面我通过文件大小等多方面的元素来讲一下网站图片的合理选择。 PNG、GIF...

Android前端—显示GIF动画

Android前端—显示GIF动画 一、技术概述   在Android原有组件的情况下,是不能打开GIF的动画的,GIF动画在ImageView中以静态的形式显示。  我们希望在开发的过程中能够采用类似ImageView的工具打开GIF动画方便直接,同时可以实现与ImageView类似的功能。  有以下几种方法:(1)Glide; (2)GifImageV...