在Android 4.0以下机型上支持webp编码和解码
2014-12-03 18:29
357 查看
据说webp编码产生的文件大小要比jpeg小很多,但是webp在Android 4.0以下的机型上不被支持,所以这里采取的思路跟jpeg压缩的时候一样,将webp的库使用NDK移植到Android 4.0以下的机型上。
第一步:使用NDK移植webp编码解码库
webp的库源码下载地址:http://download.csdn.net/detail/lihuapinghust/8221345
下载好了之后,解压到Android工程的JNI目录,将swig目录下面的libwebp_java_wrap.c文件拷贝到src目录下,然后在Android.mk文件的LOCAL_SRC_FILES中加上libwebp_java_wrap.c文件,按照上一篇博客的方法进行JNI编译,得到so库
第二部,接口设计
非常幸运的是libwebp库已经为我们写好了JNI的接口和Java接口,我们只需要直接调用即可,将swig下面的libwebp.jar文件拷贝到Android工程的libs目录下,然后就可以在java层使用libwebp的接口了
解码接口的实现:
编码的接口实现:
注意编码接口中要注意检查bitmap的config设置,要区分ARGB_8888和非ARGB_8888的情况
第一步:使用NDK移植webp编码解码库
webp的库源码下载地址:http://download.csdn.net/detail/lihuapinghust/8221345
下载好了之后,解压到Android工程的JNI目录,将swig目录下面的libwebp_java_wrap.c文件拷贝到src目录下,然后在Android.mk文件的LOCAL_SRC_FILES中加上libwebp_java_wrap.c文件,按照上一篇博客的方法进行JNI编译,得到so库
第二部,接口设计
非常幸运的是libwebp库已经为我们写好了JNI的接口和Java接口,我们只需要直接调用即可,将swig下面的libwebp.jar文件拷贝到Android工程的libs目录下,然后就可以在java层使用libwebp的接口了
解码接口的实现:
public static Bitmap decodeStream(InputStream is) { Bitmap bitmap = null; byte[] buffer = new byte[1024]; ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { int ret; while ((ret = is.read(buffer, 0, buffer.length)) > 0) { baos.write(buffer); } byte[] data = baos.toByteArray(); int[] width = new int[] { 0 }; int[] height = new int[] { 0 }; byte[] decodedData = libwebp.WebPDecodeARGB(data, data.length, width, height); int[] pixels = new int[decodedData.length / 4]; ByteBuffer.wrap(decodedData).asIntBuffer().get(pixels); bitmap = Bitmap.createBitmap(pixels, width[0], height[0], Bitmap.Config.ARGB_8888); } catch (IOException e) { e.printStackTrace(); } return bitmap; }
编码的接口实现:
public static void compress(Bitmap bitmap, int quality, OutputStream os) { Config config = bitmap.getConfig(); Log.i(TAG, "config = " + config.toString()); int width = bitmap.getWidth(); int height = bitmap.getHeight(); byte[] sourceByteArray; byte[] encodedData = null; if (config.equals(Config.ARGB_8888)) { ByteBuffer byteBuffer = ByteBuffer.allocate(bitmap.getRowBytes() * bitmap.getHeight()); bitmap.copyPixelsToBuffer(byteBuffer); sourceByteArray = byteBuffer.array(); encodedData = libwebp.WebPEncodeRGBA(sourceByteArray, width, height, width * 4, quality); } else { sourceByteArray = new byte[width * height * 4]; for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { int pixel = bitmap.getPixel(i, j); int index = (j * width + i) * 4; sourceByteArray[index] = (byte) (pixel & 0xff); sourceByteArray[index + 1] = (byte) (pixel >> 8 & 0xff); sourceByteArray[index + 2] = (byte) (pixel >> 16 & 0xff); sourceByteArray[index + 3] = (byte) (pixel >> 24 & 0xff); } } encodedData = libwebp.WebPEncodeBGRA(sourceByteArray, width, height, width * 4, quality); } try { os.write(encodedData); } catch (IOException e) { e.printStackTrace(); } }
注意编码接口中要注意检查bitmap的config设置,要区分ARGB_8888和非ARGB_8888的情况
相关文章推荐
- Android支持的音视频编码解码格式
- Graphics->BitmapDecode 介绍Android 平台对图像的解码功能,Android平台支持PNG, JPEG图像格式,并可以支持 gif动画。
- Android 4.0 支持wifi-p2p,从此p2p终于转正,一个便捷通信的革命来了。。
- android中使用WebView来打开本机的文件选择器支持4.0以上版本
- tlplayer for android 支持多核解码,支持720P的播放器
- Android java层与jni之间字符串数据传递需进行编码解码操作
- 再学 GDI+[97]: TGPImage(17) - 获取 GDI+ 所支持的可编码、可解码的图像格式
- 【流媒體】Android 实时视频采集/编码/传输/解码/播放—方案调研(初)
- Android-4.0支持触摸屏参考文档转载
- 【流媒體】Android 实时视频采集/编码/传输/解码/播放—方案调研(初)
- tlplayer for android 支持多核解码,支持720P的播放器
- Adobe将在今年年底为Android 4.0提供Flash支持
- android直接从图片中对二维码编码解码
- 【流媒體】Android 实时视频采集/编码/传输/解码/播放—方案调研(初)
- Android 实时视频采集/编码/传输/解码/播放—方案调研
- 你的手机能升级到Android 4.0吗?所有手机厂商升级机型名单汇总
- Android2.2:'pthread_rwlock_t' does not name a type: android 2.3版本以下不支持读写锁的解决办法
- Android 4.0 多平台界面支持原理分析
- 悲剧的android 4.0,最重要的websocket依然不支持
- 关于Android 4.0以下版本解析带有bom头信息的json数据