杭州华育LOGO

学员作品 学员心得 技术园地 潮人地 Android(安卓)培训 杭州电脑(计算机)培训 杭州网络营销培训 杭州JAVA培训
返回首页

杭州安卓培训名博之在Android 4.0以下机型上支持webp编码和解码

时间:2014-12-03 23:16来源:csdn 作者:lihuapinghust 点击:
据说webp编码产生的文件大小要比jpeg小很多,但是webp在Android 4.0以下的机型上不被支持,所以这里采取的思路跟jpeg压缩的时候一样,将webp的库使用NDK移植到Android 4.0以下的机型上。 第一步:使用NDK移植webp编码解码库 webp的库源码下载地址:http://do

据说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的接口了


解码接口的实现:

 

  1. public static Bitmap decodeStream(InputStream is) {  
  2.   
  3.         Bitmap bitmap = null;  
  4.   
  5.         byte[] buffer = new byte[1024];  
  6.   
  7.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  8.   
  9.         try {  
  10.             int ret;  
  11.             while ((ret = is.read(buffer, 0, buffer.length)) > 0) {  
  12.                 baos.write(buffer);  
  13.             }  
  14.   
  15.             byte[] data = baos.toByteArray();  
  16.   
  17.             int[] width = new int[] { 0 };  
  18.             int[] height = new int[] { 0 };  
  19.             byte[] decodedData = libwebp.WebPDecodeARGB(data, data.length,  
  20.                     width, height);  
  21.   
  22.             int[] pixels = new int[decodedData.length / 4];  
  23.             ByteBuffer.wrap(decodedData).asIntBuffer().get(pixels);  
  24.   
  25.             bitmap = Bitmap.createBitmap(pixels, width[0], height[0],  
  26.                     Bitmap.Config.ARGB_8888);  
  27.   
  28.         } catch (IOException e) {  
  29.             e.printStackTrace();  
  30.         }  
  31.   
  32.         return bitmap;  
  33.     }  



 

 

编码的接口实现:

 

  1. public static void compress(Bitmap bitmap, int quality, OutputStream os) {  
  2.         Config config = bitmap.getConfig();  
  3.         Log.i(TAG, "config = " + config.toString());  
  4.   
  5.         int width = bitmap.getWidth();  
  6.         int height = bitmap.getHeight();  
  7.   
  8.         byte[] sourceByteArray;  
  9.         byte[] encodedData = null;  
  10.         if (config.equals(Config.ARGB_8888)) {  
  11.             ByteBuffer byteBuffer = ByteBuffer.allocate(bitmap.getRowBytes()  
  12.                     * bitmap.getHeight());  
  13.             bitmap.copyPixelsToBuffer(byteBuffer);  
  14.             sourceByteArray = byteBuffer.array();  
  15.             encodedData = libwebp.WebPEncodeRGBA(sourceByteArray, width,  
  16.                     height, width * 4, quality);  
  17.         } else {  
  18.             sourceByteArray = new byte[width * height * 4];  
  19.   
  20.             for (int i = 0; i < width; i++) {  
  21.                 for (int j = 0; j < height; j++) {  
  22.                     int pixel = bitmap.getPixel(i, j);  
  23.                     int index = (j * width + i) * 4;  
  24.                     sourceByteArray[index] = (byte) (pixel & 0xff);  
  25.                     sourceByteArray[index + 1] = (byte) (pixel >> 8 & 0xff);  
  26.                     sourceByteArray[index + 2] = (byte) (pixel >> 16 & 0xff);  
  27.                     sourceByteArray[index + 3] = (byte) (pixel >> 24 & 0xff);  
  28.                 }  
  29.             }  
  30.   
  31.             encodedData = libwebp.WebPEncodeBGRA(sourceByteArray, width,  
  32.                     height, width * 4, quality);  
  33.         }  
  34.   
  35.         try {  
  36.             os.write(encodedData);  
  37.         } catch (IOException e) {  
  38.             e.printStackTrace();  
  39.         }  
  40.     }  


注意编码接口中要注意检查bitmap的config设置,要区分ARGB_8888和非ARGB_8888的情况

(责任编辑:杭州华育 ;杭州java培训,网络营销培训,杭州计算机培训,it培训,详询客服报名咨询
分享到:
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
提交报名信息

2018年杭州将加大力度经济转型,吸纳更多的技术人才落户杭州,软件人才需求量更是大幅提升,针对目前杭州IT行业人才需求“井喷”现象,华育软件杭州实训基地与杭州155家IT名企合作,建立人才培养与输送关系,启动“Eduask国家高端IT紧缺人才培养工程”。5月针对杭州地区18-28岁大中专生待业青年发放68个技能实训名额(应届大中专毕业生优先),经短期专业岗前实训后推荐进入企业,起薪4500-8000元,五险一金。

姓名: * 性别:
学历: 电话: *
所在地: *
您目前状况:
留言:
*