最近需求要给app做个漂亮、大气的引导页,找UI沟通,UI激情满满,不久就发过来了,四张图片,果然很漂亮,可一看大小,吓尿 4M多,赶快再沟通,不但要漂亮、大气,还要小,越小越好,最终经过多次沟通,发过来四张图片,总共400多K,说不能再小了,再小就影响显示效果了。
产品过来说,app怎么这么大了,要小,越小越好,马上要地推了,越小地推越容易,成本也越低。
没办法只有开发这边想办法了,网上搜了下,发现图片还有webp模式,谷歌推荐,国内很多app也都采用了,下载转化工具iSparta ,把四张引导图 转化后果然小多了,由原来的400多k减少到不到100K,关键是效果几乎没受到影响,至少肉眼看起来没明显失真,于是果断把大于100K的图都转化成webp显示。
1 、首先需要把目标图片转化成webp格式的图片,使用iSparta转化,很方便快捷,转化完把原图删除,把转化后的后缀为.webp的图片拷贝到项目原图的位置
2、加载so文件,官方提供的libwebp.jia包
public static Bitmap webpToBitmap(byte[] encoded) { int[] width = new int[] { 0 }; int[] height = new int[] { 0 }; byte[] decoded = libwebp.WebPDecodeARGB(encoded, encoded.length, width, height); int[] pixels = new int[decoded.length / 4]; ByteBuffer.wrap(decoded).asIntBuffer().get(pixels); return Bitmap.createBitmap(pixels, width[0], height[0], Bitmap.Config.ARGB_8888); } public static byte[] streamToBytes(InputStream in) { ByteArrayOutputStream out = new ByteArrayOutputStream(1024); byte[] buffer = new byte[1024]; int len = -1; try { while ((len = in.read(buffer)) >= 0) { out.write(buffer, 0, len); out.flush(); } } catch (java.io.IOException e) { e.printStackTrace(); } finally { try { in.close(); } catch (Exception e) { e.printStackTrace(); } } return out.toByteArray(); }
3、 android4.0以上已经支持webp格式图片,即4.0以上我们可以像使用其它格式图片一样直接使用,4.0以下的需做特别处理 ,封装使用的方法:
public static Drawable getDrawable(int id,Context context){ return new BitmapDrawable(getBitmap(id, context)); } public static Bitmap getBitmap(int resId ,Context context){ InputStream rawImageStream = context.getResources().openRawResource(resId); byte[] data = com.dingji.webpdemo.WebpUtils.streamToBytes(rawImageStream); return com.dingji.webpdemo.WebpUtils.webpToBitmap(data); } /** * 赋值webp * @param id * @param imageview * @param context */ public static void setWebPValue(int resId,ImageView iv,Context context){ if(Build.VERSION.SDK_INT<Build.VERSION_CODES.ICE_CREAM_SANDWICH){//小于4.0 iv.setImageBitmap(getBitmap(resId, context)); }else{ iv.setImageResource(resId); } } /** * 赋值webp * @param id * @param view * @param context */ public static void setWebPValue(int resId,View view,Context context){ if(Build.VERSION.SDK_INT<Build.VERSION_CODES.ICE_CREAM_SANDWICH){//小于4.0 view.setBackgroundDrawable(getDrawable(resId, context)); }else{ view.setBackgroundResource(resId); } }
4、项目里在需要的地方直接调用
ImageView iv=(ImageView) view.findViewById(R.id.guideImg); WebpUtils.setWebPValue(R.drawable.guide_img_one, iv, context);
使用webp的优点: 使用方便,当然最重要的是 能在不失真的情况下大幅降低图片的大小
缺点: 图片变小肯定是有代价的,那就是加载耗时增加,不过测试增加的时间是 几十毫秒级别的,基本在承受范围内。
下载demo:
http://download.csdn.net/detail/socketsyuhai/8870491
转化.webp图片转化工具下载:
http://download.csdn.net/detail/socketsyuhai/8870549
更详细更专业参考url:
http://www.uisdc.com/image-format-webp-introduction
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/soouoo/article/details/46763161