动态图(三) 动态WebP解码与播放

动态图(三) 动态WebP解码与播放

概述

WebP是谷歌定义的,如顾名思义(web picture),就是专门优化用于web显示的图片,大概就这样。
定义:
友(you)情(qiang)链接:https://developers.google.com/speed/webp/
无(wu)情(qiang)链接:https://developers.google.cn/speed/webp?hl=zh-cn

GitHub Mirror: https://github.com/webmproject/libwebp

环境

解码:libwebp
显示:GDI+ + Win32
开发环境: VS2015

搭建工程
libwebp
  1. Clone libwebp
  2. 用vs新建一个lib工程,名为 libwebp.vcxproj,把llibwebp\src\目录整个拷到工程目录,加入src*.*到工程去

解码

解码目标是使用libwebp把所有webp帧解析成BGRA流,用来构建后续用来显示的GDI+ Bitmap,部分代码:

//WebP解码
#include "stdafx.h"
#include "WebPLoader.h"
#include "StringUtil.hpp"

BOOL CWebPLoader::LoadImage(const wstring& strImg)
{
   
    //借用了 https://github.com/webmproject/libwebp/blob/master/examples/anim_util.h
    return ReadAnimatedImage(CStringUtil::ToStringA(strImg).c_str(), &image);
}

Bitmap* CWebPLoader::GetFrameAt(UINT32 nIndex, UINT32& nDelayMS)
{
   
    if (nIndex >= image.num_frames)
        return m_pBmp;

    DecodedFrame* pFrame = &image.frames[nIndex];
    if (!pFrame->rgba)
        return m_pBmp;

    Bitmap* pBmp = m_pBmp ? m_pBmp : new Bitmap(image.canvas_width, image.canvas_height);
    BitmapData bmd;
    Rect rc(0, 0, image.canvas_width, image.canvas_height);
    pBmp->LockBits(&rc, ImageLockModeRead | ImageLockModeWrite, PixelFormat32bppARGB, &bmd);
    LPBYTE pDst = (LPBYTE)bmd.Scan0;
    LPBYTE pSrc = pFrame->rgba;

    int rowsize = rc.Width * 4;
    for (int h = 0; h < rc.Height; ++h)
    {
   
        memcpy(pDst, pSrc, rowsize);
        pSrc += rowsize;
        pDst += bmd.Stride;
    }
    pBmp->UnlockBits(&bmd);
    m_nCurFrame = nIndex;
    m_pBmp = pBmp;
    nDelayMS = pFrame
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值