Android兼容性问题 -- WebP格式图片解码失败

WebP图片格式

WebP是Google在2010推出的一种图片格式,此图片格式可以比jpeg有更小的体积,同时支持无损压缩和透明。关于WebP格式的介绍参见 http://www.jonathanklein.net/2013/02/a-comprehensive-guide-to-webp.html

问题描述

Android原生支持的图片格式有JPEG,PNG,GIF,BMP和WebP五种。WebP格式是从Android4.0版本开始支持,对Android4.0及以上版本可以直接用BitmapFactory来实现解码,对Android4.0以下版本不支持。
使用BitmapFactory对图片解码的示例代码如下,options是BitmapFactory.Options对象。BitmapFactory会自动判断图片格式,如果解码成功会返回一个有效的Bitmap对象,如果解码失败会返回null。

Bitmap bitmap = BitmapFactory.decodeStream(imageStream, null, options);

正常来说,对Android4.0及以上版本通过上述代码解码WebP格式应该能够返回有效的Bitmap对象,然后实际使用过程中发现,有些WebP格式图片在Android4.0以上机型上无法通过BitmapFactory来解码,此外有个别机型虽然也是Android4.0以上版本,但所有WebP格式图片都无法解析。

问题原因

从官方文档中可以看到在Android4.0到Android4.2.1之间的版本不支持无损压缩和透明格式的WebP图片的编解码。所以如果从要解析的WebP图片中包含无损压缩或透明格式,且当前是Android4.0到Android4.2.1之间的系统,则BitmapFactory解码时就会出错。
这里写图片描述
此外,个别Android机型虽然是Android4.0及以上的版本,但是在原生ROM基础上去掉了WebP功能,目前发现的只有NokiaXL,它是Android4.1的版本,但不支持任何WebP格式的编解码。

解决方法

Android SDK中并没有任何api可以判断当前设备是否支持WebP格式,也没有办法在解码前判断一张WebP格式图片中是否包含无损压缩和透明格式。只能通过BitmapFactory.decodeStream的结果来判断是否解码成功。因此,只能先尝试用BitmapFactory来解码,如果解码失败,再尝试用其他方法(通过google提供的libwebp)。目前来看Android4.2及以上版本中应该都已经支持所有的WebP格式图片的解码,因此,也可以统一从Android4.2版本开始用BitmapFactory来对WebP格式图片编解码,对Android4.2以下版本用其他方式实现。

参考:http://stackoverflow.com/questions/28188374/check-if-the-device-supports-webp-image-format

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页