利用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
}

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章