动态图(一) GIF解码与播放

动态图一 GIF解码与播放


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)
        {
   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值