WebP初探

WebP
[发音 weppy]
一种新的图片格式,提供更好的无损和有损压缩图片
无损图片比PNG小26%,有损图片在相同品质下比JPEG小25-34%
透明图片也比同等的PNG和JPEG图片小

如何实现

webp有损压缩预编译编码和VP8视频编码器关键帧压缩一样,编译一块的值,相邻块只编译与这块不同的部分
有损压缩则用原图片重建像素

支持

支持Chrome,Opera浏览器等
编码解码库libwebp,命令行编码解码cwebp dwebp

如何转换

libwebp
源码地址

  1. png和jpg转webp
    cwebp [options] input_file -o output_file.webp
    cwebp xxx.png -o xxx.webp
    cwebp xxx.jpg -o xxx.webp
    -H 查看帮助
  2. webp转png和jpg
    dwebp xxx.webp -o xxx.png
    dwebp xxx.webp -o xxx.png
  3. gif 转webp
    ./gif2webp xxx.gif -o xxx.webp
  4. 预览webp
    vwebp [options] input_file.webp

Android项目中使用libwebp

  1. 对与服务端交互过程中使用webp图片
    流文件 BitmapFactory.decodeStream(is);
  2. 应用中的资源文件
    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到项目中即可,注意保持原有包名。

  1. 流文件
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) { bitmap = WebPDecoder.getInstance().decodeWebP(streamToBytes(is)); } else { bitmap = BitmapFactory.decodeStream(is); }
  2. 资源文件
    自定义一个布局,同上解析

但是webp很多都是已经存在的项目,使用自定义类还要加属性,万一发现坑,又要还回去也麻烦,需要一种尽可能改动小的方案,就是不动原本的布局文件,动态修改ImageView使其支持Webp
见代码

资源文件更换并不彻底,还存在部分png的图,如何区分webp和非webp的图片资源呢?
见代码

你可能感兴趣的:(WebP初探)