Duilib真彩色序列帧动画。

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__</
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值