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

本文介绍了如何利用GDI+进行GIF解码,以及结合GDI+和Win32实现GIF的播放功能。内容包括解码过程、播放机制的简单实现,并提供了GitHub上的项目链接。
摘要由CSDN通过智能技术生成

动态图一 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
    评论
一个可以实现GIF编码的动态链接库DLL文件GIFINFO.dll。 引用GIFINFO.dll文件后。 在程序中定义GIFINFO类实例,如GIFEncode,然后调用实例的GIFCode方法,就可以实现图像信息的GIF编码。 它的格式如下: Function GIFCode(PicInfo() As Long,FileName As String) 参数PicInfo是长整型数组,它存放你的图片像素颜色信息,每个数组元素都对应一个RGB()类型长整型值。 如6*6的图像, RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) FileName是你要保存的图像文件名信息,要求是以.GIF结尾的,如App.Path & "abc.gif" 这个函数执行之后,你就可以在你指定的位置找到你压缩的GIF图像了。 当然你可以要求压缩带透明区域的GIF图像,方法是将透明区域的数组元素值设置为-1。 如6*6大小的图像用的PicInfo()数组中的一些值是-1 -1 -1 -1 RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) -1 -1 -1 RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) -1 -1 -1 RGB(0,255,0) RGB(0,255,0) RGB(0,255,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0) RGB(255,0,0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值