GIF相比与APNG和WebP,算是远古文明了,据说那时连能显示24bpp颜色的显示器都非常罕见,它的Alpha通道只有1bit,即要么透明,要么不透明。
环境
解码:GDI+
显示:GDI+ + Win32
开发环境: VS2015
解码
GDI+自带GIF解码,会用就行,没啥好写,部分代码:
//GIF解码
#include "stdafx.h"
#include "GifLoader.h"
BOOL CGifLoader::LoadImage(const wstring& strImg)
{
Bitmap* pBmp = Bitmap::FromFile(strImg.c_str());
if (!pBmp || pBmp->GetLastStatus() != Ok || GetImageMimeType(pBmp) != L"image/gif")
{
if (pBmp) delete pBmp;
return FALSE;
}
UINT nCount = pBmp->GetFrameDimensionsCount();
GUID* pDimensionIDs = new GUID[nCount];
pBmp->GetFrameDimensionsList(pDimensionIDs, nCount);
m_nFrameCount = pBmp->GetFrameCount(&pDimensionIDs[0]);
if (m_nFrameCount > 1)
{
int nSize = pBmp->GetPropertyItemSize(PropertyTagFrameDelay);
if (nSize)
{
m_pPropertyDelay = (Gdiplus::PropertyItem*)new BYTE[nSize];
if (Gdiplus::Ok != pBmp->GetPropertyItem(PropertyTagFrameDelay, nSize, m_pPropertyDelay))
{
delete[] m_pPropertyDelay;
m_pPropertyDelay = NULL;
}
_ASSERT(m_pPropertyDelay->type == PropertyTagTypeLong);
}
nSize = pBmp->GetPropertyItemSize(PropertyTagLoopCount);
if (nSize)
{