学习、积累、分享

最近需求要给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.0iv.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.0view.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:

转化.webp图片转化工具下载:

更详细更专业参考url:

浓缩的精华!从零开始带你认识最新的图片格式WEBP

版权声明:本文为博主原创文章,未经博主允许不得转载。

风景如何,其实并不重要。重要的是,你在我的身边。

学习、积累、分享

相关文章:

你感兴趣的文章:

标签云: