Android中图片优化之WebP使用

一、什么是 WebP?

WebP(发音 weppy,项目主页),是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8。根据 Google 的测试,无损压缩后的 WebP 比 PNG 文件少了 45% 的文件大小,即使这些 PNG 文件经过其他压缩工具压缩之后,WebP 还是可以减少 28%的文件大小。

二、当下Android图片优化之WebP的必然选择

对于一个好的APP,当然是越小越好,然而,在APP中图片就占据了很大的一部分体积,所以图片的优化是开发人员必须要做的事情,而原有图片的png、jpeg、GIF等格式的优化已经达到了极致,所以只得另寻出路,因此有了WebP。由于WebP的特性,如果把WebP运用到APP中将会使我们的APP体积大小得到很大程度的缩小,APP也会得到一个质的变化,所以,WebP在APP中的使用将是目前我们图片优化的不二选择。

三、WebP的转换 

 WebP的转换:WebP与其他常用的图片格式之间是可以相互转换的,webp转换工具有:XnConvet,智图,ISparta.

四、WebP的兼容性

 WebP的兼容性:4.2.1+ 对于webp的decode、encode是完全支持的(包含半透明的webp图)对于4.0+ 到 4.2.1 ,只支持完全不透明的decode、encode的webp图,4.0 以下,应该是默认不支持webp的(编码解码)。

五、Android下WebP的使用

想在APP中使用WebP,首先我们就得解决它的兼容性问题。步骤如下:

1、添加webp的支持,加载so文件,添加libwebp.jar包

(1)获取so文件和libwebp.jar包:可以从https://github.com/EverythingMe/webp-android下载解析库,下载后打卡cmd命令窗定位到解析库目录,然后输入 ndk-build 就得到了so文件。同时也能在解析库里面得到libwebp.jar包。

    (2)得到so文件和libwebp.jar后拷到项目的app的libs目录下

     (3)在app build添加依赖

 

添加成功后在app目录下会生成这样的一个文件

自此 so文件添加依赖成功。

2、第二步,添加WebPDecoder类,里面有通过so包来处理webp文件成为byte数组的方法。

我们可以通过以下方法来解决兼容性问题(4.2.1以下版本也可以显示webp格式图片,包括半透明图片)。

WebPDecoder类:

public class WebPDecoder {
    private static WebPDecoder instance = null;

    private WebPDecoder() {
       // System.loadLibrary("webp_evme");
    }

    public static WebPDecoder getInstance() {
        if (instance==null) {
            synchronized (WebPDecoder.class) {
                if (instance==null) {
                    instance = new WebPDecoder();
                }
            }
        }

        return instance;
    }

    public BitmapdecodeWebP(byte[] encoded) {
        return decodeWebP(encoded,0,0);
    }

    public BitmapwebpToBitmap(InputStream is) {
        Bitmap bitmap = null;
        if (Build.VERSION.SDK_INT< Build.VERSION_CODES.JELLY_BEAN_MR1) {
            bitmap = WebPDecoder.getInstance().decodeWebP(streamToBytes(is));
        } else {
            bitmap = BitmapFactory.decodeStream(is);
        }
        return bitmap;
    }

    private static byte[] streamToBytes(InputStream is) {
        ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
        byte[]buffer = new byte[1024];
        int len;
        try {
            while ((len= is.read(buffer)) >=0) {
                os.write(buffer, 0, len);
            }
        } catch (java.io.IOExceptione) {
        }
        return os.toByteArray();
    }

3、项目里在需要的地方直接调用

final ImageView imageView = (ImageView) findViewById(R.id.imageView);
try {
    imageView.setImageBitmap(WebPDecoder.getInstance().webpToBitmap(getAssets().open("aa.webp")));
} catch (IOException e) {
    e.printStackTrace();
}

4、Demo下载

      
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值