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