Duilib真彩色序列帧动画。

本文介绍了如何使用Duilib库实现真彩色序列帧动画,以满足高清动画需求。通过改写CGifAnimUI类并支持webp格式,利用webp库进行高效压缩,减少了文件大小。配置文件的使用方式也在文中提及。尽管没有深入研究帧率,但通过将120帧从4秒视频中提取的图片以每10ms切换的方式,实现了约30fps的效果。请注意,webp库可能在VS2013及更高版本中运行,而在VS2012中仅支持64位版本。
摘要由CSDN通过智能技术生成

duilib库是可以支持在异形窗口下gif动画的,但是gif动画只有256色,目前项目中需要一个能够播放高清动画的游戏启动器,但真彩色的视频转成gif后失色严重,便想办法写了一个逐帧渲染png图片的类(其实是拿CGifAnimUI类改的),这个类支持webp格式,需要用的到google 的webp库,是所以用它是因为启动器的大小需求,120帧的png图片,一张1.2M左右,一起就是150M,经过webp的90%的有损压缩只有16M了,据我观察80%的有损压缩,肉眼也很难分辨出来。

#ifndef ImageAnimUI_h__
#define ImageAnimUI_h__

#pragma once
#include <vector>

namespace DuiLib
{
    class CControl;

    class UILIB_API CImageAnimUI :
        public CControlUI
    {
    public:
        struct AnimFrame
        {
            CDuiString      m_pathImage;    //图路径
            Gdiplus::Image *m_pImage;       //图
            UINT    m_spantime;             //间隔

        };
        typedef std::vector<AnimFrame> AnimFrameList;

        CImageAnimUI(void);
        ~CImageAnimUI(void);

        LPCTSTR GetClass() const;
        LPVOID  GetInterface(LPCTSTR pstrName);
        void    DoInit() override;
        void    DoPaint(HDC hDC, const RECT& rcPaint) override;
        void    DoEvent(TEventUI& event) override;
        void    SetVisible(bool bVisible = true ) override;
        void    SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue) override;
        void    SetBkImage(LPCTSTR pStrImage);
        LPCTSTR GetBkImage();
        void    SetAutoPlay(bool bIsAuto = true );
        bool    IsAutoPlay() const;
        void    SetAutoSize(bool bIsAuto = true );
        bool    IsAutoSize() const;
        void    PlayGif();
        void    PauseGif();
        void    StopGif();

    private:
        void    InitGifImage();
        void    DeleteGif();
        void    OnTimer( UINT_PTR idEvent );
        void    DrawFrame( HDC hDC );       // 绘制GIF每帧
        void    LoadAnimXmlFromFile(LPCTSTR pstrGifPath);
        void    initAnimXmlFromMemory( LPVOID pBuf,size_t dwSize );

        Gdiplus::Image* LoadImageFromFile(LPCTSTR pstrGifPath);
    private:

        UINT            m_nFramePosition;           // 当前放到第几帧

        CDuiString      m_aniName;                  //动画名
        CDuiString      m_bkImage;
        bool            m_bIsWebp;
        bool            m_bIsAutoPlay;              // 是否自动播放gif
        bool            m_bIsAutoSize;              // 是否自动根据图片设置大小
        bool            m_bIsPlaying;


        AnimFrameList   m_framelist;
    };
}


#endif // ImageAnimUI_h__</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值