WebP
[发音 weppy]
一种新的图片格式,提供更好的无损和有损压缩图片
无损图片比PNG小26%,有损图片在相同品质下比JPEG小25-34%
透明图片也比同等的PNG和JPEG图片小
如何实现
webp有损压缩预编译编码和VP8视频编码器关键帧压缩一样,编译一块的值,相邻块只编译与这块不同的部分
有损压缩则用原图片重建像素
支持
支持Chrome,Opera浏览器等
编码解码库libwebp,命令行编码解码cwebp dwebp
如何转换
- png和jpg转webp
cwebp [options] input_file -o output_file.webp
cwebp xxx.png -o xxx.webp
cwebp xxx.jpg -o xxx.webp
-H 查看帮助 - webp转png和jpg
dwebp xxx.webp -o xxx.png
dwebp xxx.webp -o xxx.png - gif 转webp
./gif2webp xxx.gif -o xxx.webp - 预览webp
vwebp [options] input_file.webp
Android项目中使用libwebp
- 对与服务端交互过程中使用webp图片
流文件 BitmapFactory.decodeStream(is); - 应用中的资源文件
bitmap目录中
有没有兼容性的问题?
坑
https://developer.android.com/guide/topics/media/media-formats.html
- 4.2.1+ 对于webp的decode、encode是完全支持的(包含半透明的webp图)
- 4.0+ 到 4.2.1 ,只支持完全不透明的decode、encode的webp图
- 4.0 以下,应该是默认不支持webp了
寻求兼容库
webp-android
也可通过官方源码自己实现
下载下来/src/main/jni目录,执行ndk-build
src/main/libs目录下copy出你需要的so
然后将其WebDecoder的辅助类copy到项目中即可,注意保持原有包名。
- 流文件
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) { bitmap = WebPDecoder.getInstance().decodeWebP(streamToBytes(is)); } else { bitmap = BitmapFactory.decodeStream(is); }
- 资源文件
自定义一个布局,同上解析
<me.everything.webp.WebpImageView android:layout_width="wrap_content" android:layout_height="wrap_content" webp:webp_src="@drawable/test"/>
但是webp很多都是已经存在的项目,使用自定义类还要加属性,万一发现坑,又要还回去也麻烦,需要一种尽可能改动小的方案,就是不动原本的布局文件,动态修改ImageView使其支持Webp
见代码
资源文件更换并不彻底,还存在部分png的图,如何区分webp和非webp的图片资源呢?
见代码