概述
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
- Clone libwebp
- 用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