今天工做中遇到GDI+加載圖片流的問題,網上找了不少資料都不行,繪製其餘幀老是模糊,,ui
網上的方法代碼以下:blog
注:pImageData是BYTE*類型 ,dImageLen是DWORD類型;
HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, dImageLen); BYTE* pmem = (BYTE*)GlobalLock(m_hMem); memcpy(pmem,pImageData,dImageLen); IStream* pstm; HRESULT ht = CreateStreamOnHGlobal(m_hMem,FALSE,&pstm); if (ht != S_OK) { GlobalFree(m_hMem); return ; } m_pImage=Gdiplus::Image::FromStream(pstm); GlobalUnlock(m_hMem); pstm->Release(); GlobalFree(m_hMem); if (m_pImage) { UINT count = m_pImage->GetFrameDimensionsCount(); if (count > 0 && m_pImage->GetLastStatus() == 0) { m_pDimensionIDs = new GUID[count]; m_pImage->GetFrameDimensionsList(m_pDimensionIDs, count); WCHAR strGuid[39]; StringFromGUID2(m_pDimensionIDs[0], strGuid, 39); m_FrameCount = m_pImage->GetFrameCount(&m_pDimensionIDs[0]); UINT TotalBuffer = m_pImage->GetPropertyItemSize(PropertyTagFrameDelay); m_pItem = (Gdiplus::PropertyItem*)malloc(TotalBuffer); m_pImage->GetPropertyItem(PropertyTagFrameDelay, TotalBuffer, m_pItem); m_bStatOK = TRUE; } }
老是繪製出現問題後本身找了方法解決問題,代碼以下:圖片
注:m_pstream是類成員,在類析構的時候釋放 ,,,pImageData是BYTE*類型 ,dImageLen是DWORD類型;
if(CreateStreamOnHGlobal(NULL, TRUE, &m_pStream) == S_OK) { ULONG ulWritten = 0; m_pStream->Write(pImageData, dImageLen, &ulWritten); //Rewind the argument stream; LARGE_INTEGER lInt; lInt.QuadPart = 0; m_pStream->Seek(lInt, STREAM_SEEK_SET, NULL); //Read the lenght of the argument stream; STATSTG statSTG; long dwResult = m_pStream->Stat(&statSTG, STATFLAG_DEFAULT); if(dwResult != S_OK) { return ; } m_pImage=Gdiplus::Image::FromStream(m_pStream); if (m_pImage) { UINT count = m_pImage->GetFrameDimensionsCount(); if (count > 0 && m_pImage->GetLastStatus() == 0) { m_pDimensionIDs = new GUID[count]; m_pImage->GetFrameDimensionsList(m_pDimensionIDs, count); WCHAR strGuid[39]; StringFromGUID2(m_pDimensionIDs[0], strGuid, 39); m_FrameCount = m_pImage->GetFrameCount(&m_pDimensionIDs[0]); UINT TotalBuffer = m_pImage->GetPropertyItemSize(PropertyTagFrameDelay); m_pItem = (Gdiplus::PropertyItem*)malloc(TotalBuffer); m_pImage->GetPropertyItem(PropertyTagFrameDelay, TotalBuffer, m_pItem); m_bStatOK = TRUE; } } }
這樣經過定時器繪製其餘幀就沒有圖片不成像問題ip
DrawGif(HDC hDC, const RECT& rc) { if (NULL == m_pItem) return 0; m_pImage->SelectActiveFrame(&Gdiplus::FrameDimensionTime, m_iCurrentFrame); unsigned msec = ((int*)m_pItem->value)[m_iCurrentFrame] * 10; Graphics g( hDC ); g.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality); g.DrawImage( m_pImage, rc.left, rc.top, rc.right-rc.left, rc.bottom - rc.top ); return msec; }