Home > 程序/算法 > webp格式试用小结

webp格式试用小结

webp格式是google推出的一个意欲取代jpeg的图像压缩格式;支持无损或有损压缩,另外还支持alpha通道,甚至支持动画,看起来野心不小。官方给出的数据是:无损压缩时比png文件小28%,有损压缩时在同等画质(是的,这是有客观标准的,请搜 SSIM )情况下,比jpg文件小25%~34%。当然,也可以说在同等文件尺寸的条件下,画质比jpeg要好。

之前参与的一个项目要求动态下载资源,当时为了最小化下载带宽占用,采用jpeg作为纹理存储格式,下载完成后解码并压缩成dxt格式后使用。于是想研究一下webp能不能在这种应用场景下取代jpeg,我较为关心两点:一方面是否真的如google所说相同画质下文件尺寸能够大幅减小;另一方面更担心的是encode/decode,尤其是decode的效率,这个在google官方的webp主页上几乎只字未提。

如果你没时间,可以直接翻到最下面看那行红字的结论

画质

以下对比采用的工具为:

jpeg encoder: photoshop cs2附带的jpeg encoder,应该不至于太差

webp encoder: 官方提供的libwebp提供的cwebp.exe

由于不是特别严肃的评测,先随机找了一张diffuse纹理作为对比,原图为无损的tga格式,下面两张图分别为压缩后的jpeg和webp,考虑到目前支持webp的浏览器还比较有限,webp被转换成了png

上图是photoshop保存的质量为8(高)的jpg文件,约93k

上面这张是webp。cwebp的画质参数可以设置为0(文件最小)~100(画质最高),很仔细地调整了参数,输入为92时得到了和jpg画质最接近的结果,得到的webp文件约67k,比jpg小了28%,在官方数据的范围内。另外值得一提的是,在较低画质的情况下,相同尺寸下webp的画质比jpeg有压倒性的优势,但是对于游戏来说,基本不能接受太低的画质,所以也没有太大意义。

以上是diffuse纹理的压缩对比,结果还比较满意,下面是法线图的画质对比

上图同样是photoshop保存的质量为8的jpg文件

cwebp的法线图压缩非常令人失望,因为我即使设置到最高画质100(此时webp尺寸已经超过jpg文件),也无法接近jpeg的压缩效果。于是我把目标文件尺寸调整到和jpg接近,得到了这张图。很容易看出丢失了很多细节

好吧,如果只是法线图压缩效果不好,那我至少可以只用webp压缩diffuse,normal仍然使用jpeg格式,下面来看看解压效率

解压效率

speed  matters. 解压效率直接影响到游戏画面呈现的速度,于是怀着激动的心情对比了下jpeg和webp的解压效率,以下为采用的工具

jpeg decoder: libjpeg 6b

webp decoder: libwebp(google官方提供)

直接用两个库提供的解压函数解压上面压缩后的diffuse纹理。注意,只对比在内存里的解压耗时,没有包含文件读取io的耗时,结果让人大失所望:

jpeg: 3ms

webp: 14ms

居然有4倍的差距……好吧,如果有人不在乎解压时间,同等画质下文件尺寸减小总是有意义的(假设不考虑压缩normal的情况),且慢!我发现用zlib库可以将上面96k的jpg文件无损压缩到69k,只比67k的webp大不到2%,而webp文件完全无法被zlib压缩。如果说libwebp开发人员“哭点”比较高的话,再提供一个数据:用zlib库将压缩后的69k数据还原成96k也只需要大约1ms,也就是说用libjpeg压缩后再用zlib压缩,最终数据解压成原图只需要4ms;而webp解压几乎同样多的数据需要14ms。

再火上浇油一下,jpeg是整整20年前(1992年)的标准啊

我有点不厚道,将“文件格式”和具体的“编码/解码器”混为一谈了,因为虽然jpeg是很古老的标准,但是jpg的编码/解码算法可能是在持续改善的,而webp作为较新的格式,编码/解码器的水平应该还会有上升的空间。

总的结论是:  压缩法线图惨不忍睹,压缩普通图片的确比jpg小,但是用一般的无损压缩也基本上可以把jpg压到同样小;而解压缩效率不可思议的低

虽然我的测试样本很小,但是出现这么大的差距还是出乎我的意料。或许通过调整libwebp的参数可以改善结果,但即使这样,默认参数如此不济也说明了这个库的不成熟。

 

Categories: 程序/算法 Tags: ,
  1. cubemap
    April 29th, 2012 at 00:19 | #1

    感谢楼主的尝试,看来短时间内可以不用关注webp格式在游戏领域的应用了。

  2. wgwy
    August 31st, 2012 at 15:54 | #2

    请用大图像试试。小图像jpg文件头信息所占空间相对像素来说是可观的。根据我的经验,大尺寸的jpg文件很难被zlib压缩

  3. September 19th, 2012 at 15:02 | #3

    我这不是系统的评测,只是随便拿了一张纹理图片(512×512也不算特别小了),得出的数据

    wgwy :

    请用大图像试试。小图像jpg文件头信息所占空间相对像素来说是可观的。根据我的经验,大尺寸的jpg文件很难被zlib压缩

  4. June 9th, 2013 at 11:29 | #4

    已经用上了,还是可行的,写了扩展https://github.com/rainkid/webp

  5. September 7th, 2017 at 16:26 | #5

    http://lookinsuranceusa.com/ – car insurance quotes
    car insurance quotes
    progressive car insurance

  6. September 14th, 2017 at 14:33 | #6

    http://cashlucrative.org/ – cash advance
    payday express
    payday express

  7. September 17th, 2017 at 03:29 | #7

    http://getloansusapersonal.com/ – online loans
    payday loan
    loans online

 

Spam Protection by WP-SpamFree