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 压缩可能将冗余的部分去掉,仅仅处理不相交的图片,所以就出现了每帧图片大小不同的情况。而要显示这个图片,还要知道显示的地方,从他的库中找不到这个方法,所以就没有使用这个库。