VC 显示GIF动画的两种方法

1 使用 GDI+ ,代码如下

 

Image *pImg=Image::FromFile(L"e://pkgame//bin//face//爱死你们了.gif");

UINT count=pImg->GetFrameDimensionsCount();

GUID *pGuid=(GUID*)new GUID[count];

pImg->GetFrameDimensionsList(&pGuid[0],count);

WCHAR strGuid[39];

StringFromGUID2(pGuid[0],strGuid,39);

UINT fc=pImg->GetFrameCount(&pGuid[0]);

int size = pImg->GetPropertyItemSize(PropertyTagFrameDelay);

PropertyItem *pItem=(PropertyItem*)new BYTE[size];

pImg->GetPropertyItem(PropertyTagFrameDelay,size,pItem);

int i=0;

for(i=0;i<fc;i++)

{

pImg->SelectActiveFrame(&pGuid[0],i);

Graphics g(m_hWnd);

g.DrawImage(pImg,0,0);

Sleep(33);

}

delete[] pGuid;

delete pImg;

delete[] (LPBYTE)pItem;

 

其中 图片显示的时间间隔可以自己设定也可以使用 *pItem->value[i] 中的值来设定。

 

1 CxImage (从 www.codeproject.com)

这个例子使用MFC 生成:

在 对话框 .h 文件中 添加

CxImage *m_lpImage;

int num;

 

在 OnInitDialog 中添加

 

m_lpImage=new CxImage("e://pkgame//bin//face//大哭.gif",CXIMAGE_FORMAT_GIF);

m_lpImage->SetRetreiveAllFrames(true);

//m_lpImage->GetNumFrames();

m_lpImage->SetFrame(m_lpImage->GetNumFrames()-1);

m_lpImage->Load("e://pkgame//bin//face//大哭.gif",CXIMAGE_FORMAT_GIF);

this->num=0;

SetTimer(1,100,NULL);

 

上面已经设置了 100 毫秒运行一次 OnTimer

 

在OnTimer 中添加:

int count=m_lpImage->GetNumFrames();

if (count)

{

HDC hdc=::GetDC(m_hWnd);

if(num==count-1) 

num=0;

else 

num++;

CxImage *p=m_lpImage->GetFrame(num);

if(p)

p->Blt(hdc);

::ReleaseDC(m_hWnd,hdc);

 

}

这样就可以显示 GIF 动画了。

 

使用 FLIB  (付黎的库)可以读出GIF 的每帧文件,但是他做的代码读出的帧的图片大小可能不同。因为LZW 压缩可能将冗余的部分去掉,仅仅处理不相交的图片,所以就出现了每帧图片大小不同的情况。而要显示这个图片,还要知道显示的地方,从他的库中找不到这个方法,所以就没有使用这个库。

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值