码迷,mamicode.com
首页 > 移动开发 > 详细

android下webp的学习和使用

时间:2015-07-05 16:48:00      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:webp   android   

  

         最近需求要给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:

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

http://www.uisdc.com/image-format-webp-introduction

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

android下webp的学习和使用

标签:webp   android   

原文地址:http://blog.csdn.net/soouoo/article/details/46763161

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!