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
更多相关文章
- 在Android平台上实现H264解码
- [转]Simple Guide for Porting Android(安卓)Kernel
- Android和Linux kernel版本对应表
- Android(安卓)studio项目不能编译,提示设备版本过低
- (Android)react-native获得手机的Android版本号
- android中TextAppearanceSpan的使用
- Android版本与Linux内核
- Android的SDK与ADT不匹配问题
- Android(安卓)UI开发第三十三篇——Navigation Drawer For Andro